प्रत्येक कॉम्प्लेक्सिटी क्लास एक सीधा खींचती है
कॉस्ट को इनपुट साइज के खिलाफ प्लॉट करें
इनपुट साइज N को x-軸 पर रखें। कोस्ट (परिचालन, समय) को y-軸 पर रखें। प्रत्येक कॉम्प्लेक्सिटी क्लास एक विशिष्ट सीधा पैदा करती है। आप एल्गोरिदम की बढ़ने की दर को इसकी प्रदर्शन की आकृति के रूप में पहचान सकते हैं।
O(1) — एक समतल लंबाई। फ़ंक्शन f(N) = 1। कोई ढाल नहीं। कोस्ट N के आधार पर कभी नहीं बदलता है। हैश टेबल लुकअप: चाहे टेबल में 10 या 10,000,000 तत्व हों, एक हैश गणना सही बकेट में कूदती है।
O(log N) — एक हल्की उपवृत्त, ढाल घटता है। N = 1,000,000 पर: कोस्ट ≈ 20 परिचालन। सीधे N के छोटे पैमाने पर कठोर, फिर से सीधा। हर N के दोगुने होने पर केवल एक इकाई की लागत जोड़ता है।
O(N) — एक समकोण सीधी रेखा। ढाल = 1 (असीमांत अर्थ में)। कोस्ट N के समान दर से बढ़ता है। अगर N त्रिपल होता है, तो कोस्ट त्रिपल होता है।
O(N log N) — थोड़ा और अधिक समकोण सीधी, हल्की उपवृत्त। O(N) के ऊपर स्थित है, लेकिन O(N²) के नीचे। लॉग कारक लाइनर ढाल को धीरे से बढ़ाता है।
O(N²) — एक वृत्ताकार खींचता है जो ऊपर की ओर खुलता है। ढाल N के बढ़ने के साथ बढ़ती है। N = 10 पर: कोस्ट = 100। N = 100 पर: कोस्ट = 10,000। N = 1,000 पर: कोस्ट = 1,000,000।
बढ़ती की खाई
O(N²) / O(N) = N का अनुपात। वृत्ताकार और समकोण सीधी के बीच की खाई N के बढ़ने के साथ विस्तारित होती है। N = 10 पर: 10× खाई। N = 100 पर: 100× खाई। N = 1,000 पर: 1,000× खाई। N = 50,000 पर: 50,000× खाई। खाई हमेशा N के बराबर होती है।
कैलकुलेटिंग द स्केल गैप
एक बड़े निर्भरता ग्राफ़ में 50,000 पैकेज (N = 50,000) होते हैं। एक एल्गोरिदम O(N) समय में चलता है। दूसरा O(N²) में चलता है। इस N पर, O(N²)/O(N) = N = 50,000 का अनुपात है।
एक रैखिक अंश की बिसेक्शन
बाइनरी सर्च को पुनरावर्ती बिसेक्शन के रूप में
N तत्वों वाले सॉर्ट किए गए 배열 का N लंबाई का अंश बनाते हैं। बाइनरी सर्च इस अंश पर समय-समय पर बिसेक्शन करते हैं:
1. मध्य बिंदु पर अंश के शेष भाग को इंगित करें।
2. अगर target < midpoint: दाहिने आधे का अंत हो जाता है। बाएं आधे पर रिकर्सिव हो जाएं।
3. अगर target > midpoint: बाएं आधे का अंत हो जाता है। दाहिने आधे पर रिकर्सिव हो जाएं।
4. अगर target = midpoint: काम समाप्त होता है।
k बिसेक्शन के बाद, शेष अंश की लंबाई N / 2^k होती है। खोज उस लंबाई के बराबर 1 होती है:
N / 2^k = 1 → 2^k = N → k = log₂N
इस प्रकार, N तत्वों पर बाइनरी सर्च को सर्वाधिक log₂N तुलना की आवश्यकता होती है।
हाल्विंग और डबलिंग: एक ही क्रांति के दो पक्ष
हाल्विंग और डबलिंग ज्यामितीय विपरीत हैं। 2^k की अभिव्यक्ति और लोगारिथम की वक्र 2N लाइन के विपरीत युग्म होते हैं।
कागज के फोल्डिंग पर विचार करें: एक शीट 0.1 मिमी चौड़ी होती है। प्रत्येक फोल्ड डबल चौड़ाई करता है। 42 फोल्ड के बाद: 0.1 मिमी × 2^42 ≈ 439,804 किमी - चांद (384,400 किमी) से अधिक। बाइनरी सर्च इसके विपरीत चलाता है: N तत्वों पर शुरू करता है, प्रत्येक चरण में गिनती आधी होती है, 1 तत्व में log₂N चरण पहुंचता है।
ज्यामिति: बिसेक्शन एक स्वयं-समान रूप से संचालित ऑपरेशन है। प्रत्येक बिसेक्शन दो भागों को उत्पन्न करता है जो पूरे के समान रचना के होते हैं। रिकर्सन और लोगारिथम इसी तरह के स्वयं-समानता को साझा करते हैं।
तुलना और डबलिंग
सॉर्ट किए गए मानचित्र में 1,048,576 तत्व होते हैं। ध्यान दें: 1,048,576 = 2^20।
हैश फंक्शन के रूप में ज्यामितीय मानचित्र
हैश फंक्शन के रूप में फंक्शन
हैश टेबल एक हैश फंक्शन का उपयोग करके एक चाबी को एक बकेट में मैप करता है:
बकेट = हैश(चाबी) मोड table_size
यह सटीक गणितीय अर्थ में एक फंक्शन है: यह एक डोमेन (सभी संभव चाबियाँ) को रेंज (बकेट सूचकांक 0 से table_size - 1) में मैप करता है। ज्यामितीय चित्र: चाबियाँ एक स्थान पर रहती हैं; बकेट दूसरे पर। हैश फंक्शन चाबियों को बकेट सूचकांक पर परियोजना करता है।
O(1) खोज - सीधा कूदें, खोज न हो। हैश फंक्शन बकेट सूचकांक को O(1) समय में निर्धारित करता है। सीधे उस बकेट पर कूदें। कोई परिवर्त, कोई तुलना लूप नहीं।
लोड फैक्टर। 0.75 के लोड फैक्टर पर, 75% बकेट में कम से कम एक तत्व chứa करते हैं। ~0.9 से अधिक, टक्कर बढ़ती हैं: दो चाबियाँ एक ही बकेट में होती हैं, जिससे बकेट के अंदर एक श्रृंखला के रूप में तत्वों का गठन होता है। एक लंबी श्रृंखला में खोज O(N) में विलुप्त होती है।
वितरण गुणवत्ता के रूप में ज्यामिति
एक अच्छी तरह से वितरित हैश फंक्शन की क्षमता है कि यह सभी बकेटों को समान रूप से कवर करता है। ज्यामितीय रूप से: फंक्शन का रेंज इसके कोडोमेन को समान रूप से सामान्य करता है। प्रत्येक बकेट को लगभग N / table_size चाबियाँ मिलती हैं।
एक खराब हैश फंक्शन की चाबियाँ कुछ ही बकेटों में सिमट जाती हैं। ज्यामितीय रूप से: फंक्शन का रेंज कोडोमेन के एक उपसमूह में कॉलैप्स होता है - अधिकांश चाबियाँ समान कुछ बिंदुओं पर मैप होती हैं। बाकी बकेट खाली रहते हैं।
MOAD-0001 से संबंध
एक सूची को एक सेट से बदलने से MOAD-0001 को ठीक करते हैं क्योंकि एक सेट अंदर हैश टेबल का उपयोग करता है। O(N) सूची स्कैन → O(1) हैश टेबल खोज। ज्यामितीय रूप से: एक क्रम पर एक सीधी परियोजना के माध्यम से एक फंक्शन का उपयोग करता है। क्रम गायब हो जाता है; फंक्शन को इसकी जगह देता है।
अनुपात का विश्लेषण: खराब रूप से वितरित हैश
हैश टेबल में 1,000 बकेट्स हैं और 900 तत्व (लोड फैक्टर 0.9) हैं। एक बुरा हैश फ़ंक्शन उनमें से 500 तत्वों को एक ही बकेट में भेजता है।