मेरे दर्शकों में पीसीआई के लेखा परीक्षकों के लिए कुछ उपचारात्मक कंप्यूटर विज्ञान।
मैं आपको यादृच्छिक पूर्णांक की एक सरणी सौंपता हूं। अगर नंबर तीन इसमें है तो आप कैसे बता सकते हैं?
खैर, इसका स्पष्ट तरीका है: क्रमिक रूप से संख्याओं की जांच करें जब तक कि आप "3" नहीं पाते हैं या सरणी को समाप्त नहीं करते हैं। रैखिक खोज। 10 संख्याओं को देखते हुए, आपको यह मान लेना होगा कि यह 10 कदम उठा सकता है; एन नंबर, एन स्टेप्स।
चित्र 1. पींग
रैखिक खोज खराब है। यह रैखिक से भी बदतर करना मुश्किल है। उस पर सुधार करते हैं। सरणी को सॉर्ट करें।
चित्र 2. पीएनजी
एक सॉर्ट किया गया सरणी एक अलग रणनीति सुझाता है: सरणी के बीच में कूदें और देखें कि क्या आप जिस मूल्य की तलाश कर रहे हैं वह (बाएं से) से कम है या (दाईं ओर) से अधिक है। जब तक आपको मूल्य नहीं मिल जाता, तब तक हर बार सरणी को आधे में काटें।
द्विआधारी खोज। 10 नंबरों को देखते हुए, यह 3 चरणों के रूप में ले जाएगा - 10 के लॉग 2 - उनमें से एक को सॉर्ट किए गए सरणी में खोजने के लिए। ओ (लॉग एन) खोज बहुत बढ़िया है। यदि आपके पास 65,000 तत्व हैं, तो उनमें से किसी एक को खोजने के लिए केवल 16 कदम उठाने होंगे। तत्वों को दोगुना करें, और यह 17 कदम है।
लेकिन क्रमबद्ध सरणियां चूसना; एक बात के लिए, रैखिक खोज की तुलना में छंटाई अधिक महंगी है। इसलिए हम बाइनरी सर्च का ज्यादा इस्तेमाल नहीं करते हैं; इसके बजाय, हम बाइनरी पेड़ों का उपयोग करते हैं।
चित्र 3. पिंग
एक द्विआधारी पेड़ की खोज करने के लिए, आप शीर्ष पर शुरू करते हैं, और अपने आप से पूछते हैं "मेरी कुंजी (वर्तमान नोड से कम (बाएं) या उससे अधिक है), और ठीक होने तक ठीक है, ठीक है, ठीक है, आप इस सामान को पहले से ही जानते हैं। लेकिन वह पेड़ सुंदर है, है ना?
एक (संतुलित) बाइनरी ट्री के साथ खोजें हे (लॉग एन), बाइनरी खोज की तरह, पेड़ में तत्वों की संख्या के साथ बदलती है। बाइनरी ट्री भयानक हैं: आप त्वरित लुकअप और क्रमबद्ध ट्रैवर्सल प्राप्त करते हैं, ऐसा कुछ जो आप हैश टेबल से बाहर नहीं निकलते हैं। बाइनरी पेड़ हैश टेबल की तुलना में एक बेहतर डिफ़ॉल्ट टेबल कार्यान्वयन हैं। 2।
लेकिन बाइनरी ट्री केवल ट्री-संरचित लुकिंग तंत्र नहीं हैं। बाइनरी रेडिक्स कोशिश करता है, जिसे PATRICIA पेड़ भी कहा जाता है, एक मौलिक अंतर के साथ बाइनरी पेड़ों की तरह काम करता है। प्रत्येक नोड पर अधिक से अधिक / से कम की तुलना करने के बजाय, आप यह देखने के लिए जांचें कि क्या यह सेट है और अगर यह नहीं है तो सही, ब्रांचिंग ब्रांचिंग है या नहीं।
चित्र 4. पींग
मैं बहुत कुछ छोड़ रहा हूं कि बाइनरी रेडिक्स कैसे काम करता है। यह एक शर्म की बात है, क्योंकि मूलांक की कोशिशों को कुख्यात रूप से कम-आंका जाता है-- सेडग्विक ने उन्हें "एल्गोरिथम" में बदनाम किया, और उनके लिए विकिपीडिया पृष्ठ बेकार हो गया। लोग अभी भी इस बात पर बहस करते हैं कि उन्हें क्या कहा जाए! बैकलिंक्स और बिट-पोजिशन-लेबल किनारों के स्पष्टीकरण के बदले में, यहां एक छोटा रूबी कार्यान्वयन है।
यहां देखें कि मूलांक की कोशिशें शांत क्यों हैं:
Search performance varies with the key size, not the number of elements in the tree. With 16 bit keys, you’re guaranteed 16 steps
पेड़ में तत्वों की संख्या की परवाह किए बिना, संतुलन के बिना।
More importantly, radix tries give you lexicographic matching, which is a puffed-up way of saying “search with trailing wildcard”, or
"कमांड-लाइन-पूर्ण-शैली की खोज"। एक मूलांक वृक्ष में, आप जल्दी से "आरओ *" खोज सकते हैं और "रोम" और "रोमुलस" और "रोवर्स" प्राप्त कर सकते हैं।
3।
मैंने तुम्हें खो दिया है।
इसे संदर्भ में रखें। इंटरनेट राउटिंग के लिए ट्राई एक महत्वपूर्ण डेटा संरचना है। रूटिंग समस्या इस प्रकार है:
You have a routing table with entries for “10.0.1.20/32 -> a” and “10.0.0.0/16 -> b”.
You need packets for 10.0.1.20 to go to “a”
You need packets for 10.0.1.21 to to to “b”
मूल द्विआधारी पेड़ के साथ हल करने के लिए यह एक कठिन समस्या है, लेकिन एक मूलांक तीन के साथ, आप सिर्फ "1010.0000.0000.0000.0000.0001.0100" (10.0.1.20 के लिए) और "1010." (10.0.1.0.0 तक) के लिए पूछ रहे हैं )। लेक्सोग्राफ़िक खोज आपको रूटिंग के लिए "सर्वश्रेष्ठ मिलान" प्रदान करती है। आप इसे ऊपर दिए गए रूबी कोड में आज़मा सकते हैं; trie में * "10.0.0.0" .to_ip जोड़ें, और "10.0.0.1" .to_ip खोजें।
राउटिंग और मूलांक के बीच का पत्राचार इतना मजबूत है कि सबसे लोकप्रिय सामान्य-उद्देश्य मूलांक तीनों पुस्तकालय (सीपीएएन से एक) वास्तव में गेटीडी से चोरी हो गया है। यह एक गड़बड़ है, वैसे, और इसका उपयोग न करें।
यदि आप समझते हैं कि कोई त्रि कैसे काम करता है, तो आप यह भी समझते हैं कि नियमित अभिव्यक्ति कैसे काम करती है। ट्रेस नियतात्मक परिमित ऑटोमेटा (डीएफए) का एक विशेष मामला है, जहां शाखाएं विशेष रूप से बिट तुलना और हमेशा शाखा आगे की ओर आधारित होती हैं। एक अच्छा रेगेक्स इंजन सिर्फ "सुविधाओं" के साथ डीएफए को संभाल रहा है। अगर मेरी तस्वीरें आपको समझ में आती हैं, तो थॉम्पसन के एनएफए-डीएफए में कमी एल्गोरिथ्म पर इस उत्कृष्ट लेख में चित्र भी होंगे, और यह लेख आपको और अधिक स्मार्ट बना देगा। 4।
आप एक बैकबोन आईएसपी में एक नेटवर्क ऑपरेटर हैं। आपकी दुनिया में काफी हद तक "उपसर्ग" हैं- आईपी नेटवर्क / नेटमास्क जोड़े। उन उपसर्गों में नेटमाक्स आपके लिए बेहद महत्वपूर्ण हैं। उदाहरण के लिए, 121/8 कोरिया का है; 121.128 / 10 कोरिया टेलीकॉम से संबंधित है, 121.128.10 / 24 एक KT ग्राहक के अंतर्गत आता है, और 121.128.10.53 उस ग्राहक के अंदर एक कंप्यूटर है। यदि आप किसी बोटनेट या स्पैमिंग ऑपरेशन या कृमि प्रसार को ट्रैक कर रहे हैं, तो आपके लिए नेटमैस्क नंबर बहुत महत्वपूर्ण है।
दुर्भाग्य से, हालांकि वे महत्वपूर्ण हैं, एक आईपी पैकेट पर कहीं भी "नेटमास्क" नहीं लगाया गया है-नेटमाक्स पूरी तरह से एक कॉन्फ़िगरेशन विवरण हैं। इसलिए, जब आप ट्रैफ़िक देख रहे हों, तो आपके पास अनिवार्य रूप से यह डेटा काम करने के लिए है:
ips.png
हैरानी की बात है, देखने के लिए पर्याप्त पैकेट दिए गए हैं, यह नेटमास्क के साथ अनुमान लगाने के लिए पर्याप्त जानकारी है। सोनी पर काम करते हुए, केनजीरो चो कोशिशों के आधार पर ऐसा करने के लिए एक बहुत ही सुंदर तरीके के साथ आया। ऐसे:
एक बुनियादी बाइनरी रेडिक्स ट्राई लें, जैसे सॉफ्टवेयर राउटर्स द्वारा उपयोग किए जाने वाले। लेकिन पेड़ में नोड्स की संख्या को बाध्य करें, 10,000 को कहें। एक बैकबोन लिंक पर, आईपी हेडर से पते को रिकॉर्ड करते हुए, आप क्षणों में 10,000 नोड्स समाप्त करेंगे।
LRU ऑर्डर में क्रमबद्ध सूची में नोड्स की सूची को स्टोर करें। दूसरे शब्दों में, जब आप एक नोड के साथ एक आईपी पते से मेल खाते हैं, तो नोड को "टच" करें, इसे सूची के शीर्ष पर चिपका दें। धीरे-धीरे, अक्सर देखे जाने वाले पते ऊपर तक बुलबुले बनाते हैं, और आमतौर पर देखे गए नोड्स नीचे तक डूबते हैं।
चित्र 6. पींग
अब चाल। जब आप नोड्स से बाहर निकलते हैं और एक नए की आवश्यकता होती है, तो सूची के नीचे से पुनः प्राप्त करें। लेकिन जब आप ऐसा करते हैं, तो नोड से डेटा को उसके मूल में रोल करें, जैसे:
चित्र 5. पींग
10.0.1.2 और 10.0.1.3 सिबलिंग / 32s हैं, 10.0.1.2/31 के दो हिस्सों। उन्हें पुनः प्राप्त करने के लिए, उन्हें 10.0.1.2/31 में मर्ज करें। यदि आपको 10.0.1.2/31 को पुनः प्राप्त करने की आवश्यकता है, तो आप इसे 10.0.1.0/31 के साथ जोड़कर 10.0.1.0/30 कर सकते हैं।
यह कहना, एक मिनट, और स्टैंडआउट स्रोत LRU सूची में सबसे ऊपर रहकर पेड़ में अपनी स्थिति का बचाव करेंगे, जबकि परिवेश / 32 शोर बुलबुले / 0 तक। आईपी के ऊपर की कच्ची सूची के लिए, 100 नोड के पेड़ के साथ, आपको यह मिलता है।
चो इस हेयुरिस्टिक अगुरी को कहते हैं। 5।
अगुरी बीएसडी लाइसेंस प्राप्त है। आप इसे डाउनलोड कर सकते हैं, और चो के पुराने होम पेज से एक ड्राइवर प्रोग्राम जो पैकेट के माध्यम से पैकेट देखता है। 6।
मैं इसके साथ कहीं जा रहा हूं, लेकिन मैं इस पोस्ट में अब 1300 शब्द हूं, और यदि आप एक एल्गोरिदम व्यक्ति हैं, तो आप अब तक मुझसे थक चुके हैं, और यदि आप नहीं हैं, तो आप मेरे द्वारा थक गए हैं अभी। इसलिए, अगुरी को अंदर जाने दें, और मैं आपको इस सप्ताह के अंत में इसके साथ कुछ ठंडा और बेकार कर दूंगा।
वहाँ कई लिंक बिखरे हुए हैं। दुर्भाग्य से, आर्काइव.ऑर्ग छवियों को नहीं रखता है, केवल पाठ, इसलिए उनमें से कई खो गए हैं। यहाँ है कि यह संग्रहीत करता है: