गणित के लिए कोड का अनुवाद
अधिक (कम या ज्यादा) औपचारिक परिचालन शब्दार्थों को देखते हुए आप एक एल्गोरिथ्म (छद्म) कोड का शाब्दिक रूप से एक गणितीय अभिव्यक्ति में अनुवाद कर सकते हैं जो आपको परिणाम देता है, बशर्ते आप अभिव्यक्ति को एक उपयोगी रूप में हेरफेर कर सकते हैं। इस के लिए अच्छी तरह से काम करता है additive इस तरह की तुलना, अदला-बदली, बयान, स्मृति तक पहुँचता है, चक्र कुछ सार मशीन की जरूरत है, और इतने पर की संख्या के रूप में लागत के उपाय।
उदाहरण: बुलबुले में तुलना
इस एल्गोरिथ्म पर विचार करें जो किसी दिए गए सरणी को क्रमबद्ध करता है A
:
bubblesort(A) do 1
n = A.length; 2
for ( i = 0 to n-2 ) do 3
for ( j = 0 to n-i-2 ) do 4
if ( A[j] > A[j+1] ) then 5
tmp = A[j]; 6
A[j] = A[j+1]; 7
A[j+1] = tmp; 8
end 9
end 10
end 11
end 12
मान लें कि हम सामान्य सॉर्टिंग एल्गोरिदम विश्लेषण करना चाहते हैं, जो कि तत्व तुलना (पंक्ति 5) की संख्या की गणना करता है। हम तुरंत ध्यान देते हैं कि यह मात्रा सरणी की सामग्री पर निर्भर नहीं करती है A
, केवल इसकी लंबाई । तो हम (नेस्टेड) -लूप का शाब्दिक अनुवाद कर सकते हैं (नेस्टेड) रकम; लूप चर योग चर बन जाता है और सीमा खत्म हो जाती है। हमें मिला:nfor
Ccmp(n)=∑i=0n−2∑j=0n−i−21=⋯=n(n−1)2=(n2) ,
जहां पंक्ति 5 के प्रत्येक निष्पादन के लिए लागत है (जिसे हम गिनते हैं)।1
उदाहरण: बुलबुले में स्वैप
मैं द्वारा कि लाइनों को और इस सबप्रोग्राम (एक बार) को निष्पादित करने के लिए लागतों को । सी आई , जेPi,ji
j
Ci,j
अब मान लेते हैं कि हम स्वैप की गिनती करना चाहते हैं , अर्थात को कितनी बार निष्पादित किया जाता है। यह एक "बुनियादी ब्लॉक" है, यह एक उपप्रोग्राम है जिसे हमेशा परमाणु रूप से निष्पादित किया जाता है और इसकी कुछ निरंतर लागत होती है (यहां, )। ऐसे ब्लॉकों को अनुबंधित करना एक उपयोगी सरलीकरण है जिसे हम अक्सर बिना सोचे समझे लागू करते हैं या इसके बारे में बात करते हैं। 1P6,81
इसी तरह के अनुवाद के साथ जैसा कि हम निम्नलिखित सूत्र पर आते हैं:
Cswaps(A)=∑i=0n−2∑j=0n−i−2C5,9(A(i,j)) ।
( i , j ) P 5 , 9A(i,j) की -th पुनरावृत्ति से पहले सरणी की स्थिति को दर्शाता है ।(i,j)P5,9
ध्यान दें कि मैं पैरामीटर के रूप में बजाय उपयोग करता हूं ; हम जल्द ही देखेंगे कि क्यों। मैं मापदंडों के रूप में और नहीं जोड़ता क्योंकि लागत उन पर निर्भर नहीं करती है ( समान लागत मॉडल में , वह है); सामान्य तौर पर, वे बस हो सकता है।एन आई जे सी 5 , 9AnijC5,9
स्पष्ट रूप से, की लागत (मूल्यों और विशेष रूप से) की सामग्री पर निर्भर करती है , इसलिए हमें उस पर ध्यान देना होगा। अब हमारे सामने एक चुनौती है: हम " " को कैसे ? ठीक है, हम स्पष्ट की सामग्री पर निर्भरता बना सकते हैं : ए सी 5 , 9 एP5,9AA[j]
A[j+1]
C5,9A
C5,9(A(i,j))=C5(A(i,j))+{10,A(i,j)[j]>A(i,j)[j+1],else ।
किसी भी दिए गए इनपुट ऐरे के लिए, ये लागत अच्छी तरह से परिभाषित हैं, लेकिन हम अधिक सामान्य बयान चाहते हैं; हमें मजबूत धारणाएं बनाने की जरूरत है। आइए हम तीन विशिष्ट मामलों की जांच करें।
सबसे ख़राब मामला
योग को देखने और उस , हम लागत के लिए एक ऊपरी ऊपरी सीमा पा सकते हैं:C5,9(A(i,j))∈{0,1}
Cswaps(A)≤∑i=0n−2∑j=0n−i−21=n(n−1)2=(n2) ।
लेकिन क्या ऐसा हो सकता है , यानी इस ऊपरी सीमा के लिए है? जैसा कि यह पता चला है, हाँ: यदि हम युग्मक अलग-अलग तत्वों के व्युत्क्रमानुपाती सरणी को इनपुट करते हैं, तो प्रत्येक पुनरावृत्ति को स्वैप करना चाहिए। इसलिए, हमने बुलबुले के स्वैप की सटीक सबसे खराब स्थिति प्राप्त की है ।A
सबसे अच्छा मामला
इसके विपरीत, एक तुच्छ निचली सीमा है:
Cswaps(A)≥∑i=0n−2∑j=0n−i−20=0 ।
यह भी हो सकता है: एक सरणी पर जो पहले से ही सॉर्ट किया गया है, बुलबुले एक एकल स्वैप को निष्पादित नहीं करता है।
औसत मामला
सबसे खराब और सबसे अच्छा मामला काफी अंतर खोल देता है। लेकिन स्वैप की विशिष्ट संख्या क्या है ? इस प्रश्न का उत्तर देने के लिए, हमें यह परिभाषित करने की आवश्यकता है कि "विशिष्ट" का क्या अर्थ है। सिद्धांत रूप में, हमारे पास एक इनपुट को दूसरे पर पसंद करने का कोई कारण नहीं है और इसलिए हम आम तौर पर सभी संभावित इनपुट पर एक समान वितरण मान लेते हैं, यह है कि हर इनपुट समान रूप से संभव है। हम जोड़ीदार अलग-अलग तत्वों के साथ सरणियों के लिए खुद को प्रतिबंधित करते हैं और इस तरह यादृच्छिक क्रमचय मॉडल मान लेते हैं ।
फिर, हम इस तरह से अपनी लागत को फिर से लिख सकते हैं:
E[Cswaps]=1n!∑A∑i=0n−2∑j=0n−i−2C5,9(A(i,j))
अब हमें रकम के सरल हेरफेर से परे जाना होगा। एल्गोरिथ्म को देखकर, हम ध्यान दें कि हर स्वैप में ही उलटा निकालता है (हम केवल पड़ोसी को स्वैप करते हैं)। यही कारण है कि पर प्रदर्शन स्वैप की संख्या, है बिल्कुल व्युत्क्रम की संख्या है के । इस प्रकार, हम आंतरिक दो रकमों को बदल सकते हैं और प्राप्त कर सकते हैंएक निवेश संबंधी निर्णय ( एक ) एकAAinv(A)A
E[Cswaps]=1n!∑Ainv(A) ।
हमारे लिए भाग्यशाली, आक्रमणों की औसत संख्या होना निर्धारित किया गया है
E[Cswaps]=12⋅(n2)
जो हमारा अंतिम परिणाम है। ध्यान दें कि यह बिल्कुल सबसे खराब लागत है।
- ध्यान दें कि एल्गोरिथ्म को सावधानीपूर्वक तैयार किया गया था ताकि
i = n-1
बाहरी लूप के साथ "अंतिम" पुनरावृत्ति हो जो कभी भी कुछ भी निष्पादित नहीं करता है।
- " अपेक्षित मूल्य" के लिए " " गणितीय संकेतन है, जो यहां औसत है।E
- हम इस तरह से सीखते हैं कि कोई भी एल्गोरिथ्म जो केवल पड़ोसी तत्वों को स्वैप नहीं करता है, बम्स्पोर्ट (यहां तक कि औसत पर) की तुलना में समान रूप से तेज हो सकता है - ऐसे सभी एल्गोरिदम के लिए व्युत्क्रम की संख्या कम बाध्य है। यह उदा सम्मिलन सॉर्ट और चयन सॉर्ट पर लागू होता है ।
सामान्य विधि
हमने उदाहरण में देखा है कि हमें नियंत्रण संरचना का गणित में अनुवाद करना है; मैं अनुवाद नियमों का एक विशिष्ट पहनावा प्रस्तुत करूंगा। हमने यह भी देखा है कि किसी भी उपप्रोग्राम की लागत वर्तमान स्थिति पर निर्भर हो सकती है , जो कि (मोटे तौर पर) चर के मौजूदा मूल्यों पर निर्भर करती है । चूंकि एल्गोरिथ्म (आमतौर पर) राज्य को संशोधित करता है, सामान्य विधि नोट करने के लिए थोड़ा बोझिल है। यदि आप भ्रमित महसूस करना शुरू करते हैं, तो मेरा सुझाव है कि आप उदाहरण के लिए वापस जाएं या अपना खुद का बनाएं।
हम वर्तमान स्थिति में के साथ निरूपित करते हैं (इसे चर असाइनमेंट के एक सेट के रूप में कल्पना करें)। जब हम राज्य में शुरू होने वाले एक कार्यक्रम को निष्पादित करते हैं , तो हम राज्य ( समाप्त ) प्रदान करते हैं ।ψ ψ / पीψP
ψψ/PP
व्यक्तिगत बयान
केवल एक कथन को देखते हुए S;
, आप इसे खर्च । यह आमतौर पर एक स्थिर कार्य होगा।CS(ψ)
भाव
यदि आपके पास E
फ़ॉर्म की अभिव्यक्ति है E1 ∘ E2
(कहते हैं, एक अंकगणितीय अभिव्यक्ति जहां ∘
इसके अतिरिक्त या गुणन हो सकती है, तो आप लागतों को बढ़ाकर जोड़ते हैं:
CE(ψ)=c∘+CE1(ψ)+CE2(ψ) ।
ध्यान दें कि
- संचालन लागत नहीं स्थिर हो लेकिन के मूल्यों पर निर्भर हो सकता और और ई 1 ई 2c∘E1E2
- भावों के मूल्यांकन से कई भाषाओं में स्थिति बदल सकती है,
इसलिए आपको इस नियम के साथ लचीला होना पड़ सकता है।
अनुक्रम
कार्यक्रमों P
के अनुक्रम के रूप में एक कार्यक्रम को देखते हुए Q;R
, आप लागत को जोड़ते हैं
CP(ψ)=CQ(ψ)+CR(ψ/Q) ।
सशर्त,
P
फॉर्म के एक कार्यक्रम को देखते हुए if A then Q else R end
, लागत राज्य पर निर्भर करती है:
CP(ψ)=CA(ψ)+{CQ(ψ/A)CR(ψ/A),A evaluates to true under ψ,else
सामान्य तौर पर, मूल्यांकन A
बहुत अच्छी तरह से राज्य को बदल सकता है, इसलिए व्यक्तिगत शाखाओं की लागत के लिए अद्यतन।
-लूप्स के लिए
P
प्रपत्र के एक कार्यक्रम को देखते हुए for x = [x1, ..., xk] do Q end
, लागत निर्दिष्ट करें
CP(ψ)=cinit_for+∑i=1kcstep_for+CQ(ψi∘{x:=xi})
जहां मान के लिए प्रसंस्करण से पहले राज्य है , अर्थात, के सेट होने के साथ पुनरावृत्ति के बाद ..., ।ψiQ
xi
x
x1
xi-1
लूप रखरखाव के लिए अतिरिक्त स्थिरांक पर ध्यान दें; लूप चर बनाया जाना है ( ) और इसके मान ( ) को असाइन किया गया है । यह तब से प्रासंगिक हैcinit_forcstep_for
- अगले गणना
xi
महंगा हो सकता है और
- एक
for
खाली शरीर के साथ -loop (जैसे एक बेहतरीन मामले कोई निश्चित मूल्य के साथ स्थापित करने में सरल बनाने के बाद) शून्य लागत नहीं है, तो यह पुनरावृत्तियों प्रदर्शन करती है।
जबकि-लूप्स
P
प्रपत्र के एक कार्यक्रम को देखते हुए while A do Q end
, लागत निर्दिष्ट करें
CP(ψ) =CA(ψ)+{0CQ(ψ/A)+CP(ψ/A;Q),A evaluates to false under ψ, else
एल्गोरिथ्म का निरीक्षण करके, इस पुनरावृत्ति को अक्सर लूप के लिए एक के समान राशि के रूप में अच्छी तरह से दर्शाया जा सकता है।
उदाहरण: इस छोटे एल्गोरिथ्म पर विचार करें:
while x > 0 do 1
i += 1 2
x = x/2 3
end 4
नियम लागू करने से, हम प्राप्त करते हैं
C1,4({i:=i0;x:=x0}) =c<+{0c+=+c/+C1,4({i:=i0+1;x:=⌊x0/2⌋}),x0≤0, else
व्यक्तिगत बयानों के लिए कुछ निरंतर लागतों के साथ । हम स्पष्ट रूप से मानते हैं कि ये राज्य ( और ) के मूल्यों पर निर्भर नहीं करते हैं ; यह "वास्तविकता" में सच हो सकता है या नहीं भी हो सकता है: ओवरफ्लो के बारे में सोचो!c…i
x
अब हमें लिए इस पुनरावृत्ति को हल करना होगा । हम ध्यान दें कि न तो पुनरावृत्तियों की संख्या लूप बॉडी की कीमत पर निर्भर करती है , इसलिए हम इसे छोड़ सकते हैं। हम इस पुनरावृत्ति से बचे हैं:C1,4i
C1,4(x)={c>c>+c+=+c/+C1,4(⌊x/2⌋),x≤0, else
प्राथमिक के साथ इसका मतलब है
C1,4(ψ)=⌈log2ψ(x)⌉⋅(c>+c+=+c/)+c> ,
प्रतीकात्मक रूप से पूरे राज्य को फिर से प्रस्तुत करना; अगर , तो ।ψ={…,x:=5,…}ψ(x)=5
प्रक्रिया कॉल
कुछ पैरामीटर (ओं) के लिए P
फॉर्म के एक कार्यक्रम को देखते हुए जहां (नामित) पैरामीटर के साथ एक प्रक्रिया है , लागतों को असाइन करेंM(x)
x
M
p
CP(ψ)=ccall+CM(ψglob∘{p:=x}) ।
फिर से अतिरिक्त स्थिर ध्यान दें (जो वास्तव में पर निर्भर हो सकता है !)। वास्तविक मशीनों पर लागू होने के कारण प्रक्रिया कॉल महंगे हैं, और कभी-कभी रनटाइम पर भी हावी होते हैं (जैसे कि फिबोनाची संख्या पुनरावृत्ति भोलेपन से मूल्यांकन करना)।ccallψ
मैं आपके यहाँ राज्य के साथ हो सकने वाले कुछ शब्दार्थ मुद्दों पर चर्चा कर रहा हूँ। आप ग्लोबल स्टेट और ऐसे लोकल को प्रोसीड कॉल्स में अंतर करना चाहेंगे। चलो मान लेते हैं कि हम केवल वैश्विक राज्य से गुजरते हैं और M
एक नया स्थानीय राज्य प्राप्त करते हैं, जिसका मूल्य निर्धारित करके आरंभ किया p
गया है x
। इसके अलावा, x
एक अभिव्यक्ति हो सकती है जिसे हम (आमतौर पर) इसे पारित करने से पहले मूल्यांकित करते हैं।
उदाहरण: प्रक्रिया पर विचार करें
fac(n) do
if ( n <= 1 ) do 1
return 1 2
else 3
return n * fac(n-1) 4
end 5
end
नियम के अनुसार, हमें मिलता है:
Cfac({n:=n0})=C1,5({n:=n0})=c≤+{C2({n:=n0})C4({n:=n0}),n0≤1, else=c≤+{creturncreturn+c∗+ccall+Cfac({n:=n0−1}),n0≤1, else
ध्यान दें कि हम वैश्विक स्थिति की अवहेलना करते हैं, क्योंकि fac
स्पष्ट रूप से कोई भी एक्सेस नहीं करता है। इस विशेष पुनरावृत्ति को हल करना आसान है
Cfac(ψ)=ψ(n)⋅(c≤+creturn)+(ψ(n)−1)⋅(c∗+ccall)
हमने उन भाषा सुविधाओं को कवर किया है जिनका आप विशिष्ट छद्म कोड में सामना करेंगे। उच्च-स्तरीय छद्म कोड का विश्लेषण करते समय छिपी हुई लागतों से सावधान रहें; यदि संदेह है, तो प्रकट करें। अंकन बोझिल लग सकता है और निश्चित रूप से स्वाद की बात है; सूचीबद्ध अवधारणाओं को नजरअंदाज नहीं किया जा सकता है, हालांकि। हालांकि, कुछ अनुभव के साथ आप तुरंत देख पाएंगे कि राज्य के कौन से हिस्से किस लागत माप के लिए प्रासंगिक हैं, उदाहरण के लिए "समस्या का आकार" या "संख्याओं की संख्या"। बाकी को गिराया जा सकता है - यह चीजों को काफी सरल करता है!
यदि आप अब सोचते हैं कि यह बहुत जटिल है, तो सलाह दें: यह है ! किसी भी मॉडल में एल्गोरिदम की सटीक लागतों को प्राप्त करना जो वास्तविक मशीनों के करीब है क्योंकि रनटाइम भविष्यवाणियों (यहां तक कि रिश्तेदार भी) को सक्षम करने के लिए एक कठिन प्रयास है। और यह भी वास्तविक मशीनों पर कैशिंग और अन्य बुरा प्रभाव पर विचार नहीं कर रहा है।
इसलिए, गणितीय विश्लेषण को गणितीय रूप से सुव्यवस्थित होने के बिंदु पर सरल बनाया जाता है। उदाहरण के लिए, यदि आपको सटीक लागतों की आवश्यकता नहीं है, तो आप किसी भी बिंदु पर (ऊपरी सम्मान के लिए) कम या ज्यादा कर सकते हैं: स्थिरांक के सेट को कम करें, सशर्त से छुटकारा पाएं, रकम को सरल करें, और इसी तरह।
एसिम्प्टोटिक लागत पर एक नोट
आप आमतौर पर साहित्य में और जाले पर क्या पाएंगे "बिग-ओह विश्लेषण"। उचित शब्द असममित विश्लेषण है जिसका अर्थ है कि सटीक लागतों को प्राप्त करने के बजाय जैसा कि हमने उदाहरणों में किया है, आप केवल एक स्थिर कारक और सीमा में लागत देते हैं (मोटे तौर पर, "बड़े ")।n
यह (अक्सर) उचित है क्योंकि अमूर्त वक्तव्यों की वास्तविकता में कुछ (आम तौर पर अज्ञात) लागत होती है, जो मशीन, ऑपरेटिंग सिस्टम और अन्य कारकों पर निर्भर करती है, और ऑपरेटिंग सिस्टम को पहली जगह और व्हाट्सएप में स्थापित करने वाले ऑपरेटिंग सिस्टम द्वारा कम रनों का प्रभुत्व हो सकता है। तो आप कुछ गड़बड़ी, वैसे भी मिलता है।
यहाँ बताया गया है कि कैसे स्पर्शोन्मुख विश्लेषण इस दृष्टिकोण से संबंधित है।
प्रमुख परिचालन (जो लागत को प्रेरित करते हैं) की पहचान करें , यह वह ऑपरेशन है जो अक्सर होता है (स्थिर कारकों तक)। बुलबुले के उदाहरण में, एक संभावित विकल्प लाइन 5 में तुलना है।
वैकल्पिक रूप से, अपने अधिकतम (ऊपर से) सम्मान के द्वारा प्राथमिक संचालन के लिए सभी स्थिरांक बाध्य करें। उनके न्यूनतम (नीचे से) और सामान्य विश्लेषण करते हैं।
- लागत के रूप में इस ऑपरेशन के निष्पादन की गणना का उपयोग करके विश्लेषण करें।
- सरलीकरण करते समय, अनुमान लगाने की अनुमति दें। ध्यान रखें कि केवल ऊपर से अनुमान लगाने की अनुमति दें यदि आपका लक्ष्य एक ऊपरी बाध्य ( ) सम्मान है। नीचे से यदि आप कम सीमा ( ) चाहते हैं।OΩ
सुनिश्चित करें कि आप Landau प्रतीकों का अर्थ समझते हैं । याद रखें कि इस तरह की सीमाएं सभी तीन मामलों के लिए मौजूद हैं ; का उपयोग करने से सबसे खराब स्थिति का विश्लेषण नहीं होता है।O
आगे की पढाई
एल्गोरिथम विश्लेषण में कई और चुनौतियां और चालें हैं। यहाँ कुछ पढ़ने की सिफारिश की गई है।
इस तरह की तकनीकों का उपयोग करने वाले आस - पास एल्गोरिदम-विश्लेषण में कई प्रश्न टैग किए गए हैं ।