कम ज्ञात लेकिन उपयोगी डेटा संरचनाएं क्या हैं?


795

आसपास कुछ डेटा संरचनाएं हैं जो वास्तव में उपयोगी हैं लेकिन अधिकांश प्रोग्रामर के लिए अज्ञात हैं। वे कौन से हैं?

लिंक किए गए सूचियों, बाइनरी ट्रीज़ और हैश के बारे में हर कोई जानता है, लेकिन उदाहरण के लिए स्किप सूची और ब्लूम फ़िल्टर के बारे में क्या । मैं अधिक डेटा संरचनाओं को जानना चाहूंगा जो कि इतने सामान्य नहीं हैं, लेकिन जानने लायक हैं क्योंकि वे महान विचारों पर भरोसा करते हैं और प्रोग्रामर के टूल बॉक्स को समृद्ध करते हैं।

पुनश्च: मुझे डांसिंग लिंक जैसी तकनीकों में भी दिलचस्पी है जो एक सामान्य डेटा संरचना के गुणों का चतुर उपयोग करते हैं।

संपादित करें : कृपया अधिक विवरण में डेटा संरचनाओं का वर्णन करने वाले पृष्ठों के लिंक शामिल करने का प्रयास करें । इसके अलावा, एक डेटा संरचना क्यों शांत है पर कुछ शब्दों को जोड़ने का प्रयास करें (जैसा कि जोनास कोल्कर ने पहले ही बताया है)। इसके अलावा, प्रति उत्तर एक डेटा-संरचना प्रदान करने का प्रयास करें । यह बेहतर डेटा संरचनाओं को अकेले उनके वोटों के आधार पर शीर्ष पर तैरने की अनुमति देगा।


जवाबों:


271

ट्रीट्स , जिसे प्रीफिक्स-ट्री या क्रिट-बिट ट्री के रूप में भी जाना जाता है , 40 से अधिक वर्षों से मौजूद हैं, लेकिन अभी भी अपेक्षाकृत अज्ञात हैं। " TRASH - एक डायनेमिक LC-trie और हैश डेटा संरचना " में बहुत ही शांत उपयोग का वर्णन किया गया है , जो एक हैश फ़ंक्शन के साथ एक ट्राइ को जोड़ती है।


12
आमतौर पर वर्तनी-चेकर्स द्वारा उपयोग किया जाता है
स्टीवन ए। लोवे

फट कोशिश भी एक दिलचस्प संस्करण है, जहां आप केवल स्ट्रिंग के एक उपसर्ग का उपयोग नोड्स के रूप में करते हैं और अन्यथा नोड्स में तारों की सूची संग्रहीत करते हैं।
टॉरस्टेन मर्क

पर्ल 5.10 में रेगेक्स इंजन स्वचालित रूप से प्रयास करता है।
ब्रैड गिल्बर्ट

मेरे अनुभव में कोशिशें बहुत महंगी हैं, यह देखते हुए कि एक सूचक आमतौर पर एक चार से अधिक लंबा होता है, जो एक शर्म की बात है। वे केवल कुछ डेटा-सेट के लिए उपयुक्त हैं।
जो

18
चूंकि कोई भी एसओ प्रश्न नहीं है, विषय की परवाह किए बिना, jQuery का उल्लेख किए बिना किसी के साथ पूरा नहीं होता है .... जॉन रिजिग, jQuery के निर्माता, के पास पदों की एक दिलचस्प डेटा संरचना श्रृंखला है जहां वह दूसरों के बीच विभिन्न trie कार्यान्वयनों को देखता है
Aust:१ j पर ऑस्कर ऑस्टेगार्ड

231

ब्लूम फ़िल्टर : बिट बिट्स ऑफ़ एम बिट्स, शुरू में सभी 0 पर सेट होते हैं।

एक आइटम जोड़ने के लिए आप इसे k हैश फ़ंक्शंस के माध्यम से चलाते हैं जो आपको उस सरणी में k इंडिकेशन्स देगा जो आपने तब 1 पर सेट किया था।

यह जांचने के लिए कि क्या कोई आइटम सेट में है, कश्मीर सूचकांकों की गणना करें और जांचें कि क्या वे सभी 1 पर सेट हैं।

बेशक, यह झूठी-सकारात्मकता की कुछ संभावना देता है (विकिपीडिया के अनुसार यह लगभग 0.61 ^ (m / n) है जहाँ n सम्मिलित वस्तुओं की संख्या है)। झूठे-नकारात्मक संभव नहीं हैं।

किसी आइटम को हटाना असंभव है, लेकिन आप गिनती के खिलने वाले फ़िल्टर को लागू कर सकते हैं , जो कि ints और इंक्रीमेंट / डीक्रीमेंट के सरणी द्वारा दर्शाया जाता है।


20
आप शब्दकोशों के साथ उनके उपयोग का उल्लेख करना भूल जाते हैं :) आप 512k के बारे में मूल्यों के बिना हैशटेबल की तरह एक पूर्ण फ़िल्टर को निचोड़ सकते हैं
क्रिस एस

8
Google BigTable के कार्यान्वयन में ब्लूम फ़िल्टर के उपयोग का हवाला देता है।
ब्रायन गियानफोर्को

16
@FreshCode यह वास्तव में आपको सस्ते में सेट में एक तत्व की अनुपस्थिति के लिए सस्ते में परीक्षण करने की अनुमति देता है क्योंकि आप झूठी सकारात्मकता प्राप्त कर सकते हैं लेकिन कभी भी नकारात्मक नहीं
टॉम सैवेज

26
@FreshCode @Tom सैवेज ने कहा, नकारात्मक के लिए जाँच करते समय यह अधिक उपयोगी है। उदाहरण के लिए, आप इसे तेज और छोटे (मेमोरी उपयोग के संदर्भ में) वर्तनी परीक्षक के रूप में उपयोग कर सकते हैं। इसमें सभी शब्दों को जोड़ें और फिर उन शब्दों को देखने का प्रयास करें जिन्हें उपयोगकर्ता प्रवेश करता है। यदि आपको एक नकारात्मक मिलता है तो इसका मतलब है कि यह गलत है। फिर आप निकटतम मैच खोजने और सुधार की पेशकश करने के लिए कुछ और महंगी जांच चला सकते हैं।
लैप

5
@ abhin4v: ब्लूम फ़िल्टर का उपयोग अक्सर तब किया जाता है जब अधिकांश अनुरोधों में "नहीं" (जैसे कि यहां मामला) का जवाब वापस करने की संभावना होती है, जिसका अर्थ है कि "हां" जवाब की छोटी संख्या को धीमी सटीक परीक्षण के साथ जांचा जा सकता है। यह अभी भी औसत क्वेरी प्रतिक्रिया समय में एक बड़ी कमी का परिणाम है । पता नहीं है कि क्या क्रोम की सुरक्षित ब्राउजिंग ऐसा करती है, लेकिन यह मेरा अनुमान होगा।
j_random_hacker

140

रस्सी : यह एक स्ट्रिंग है जो सस्ते प्रीपेंड, सबस्ट्रिंग, मध्य सम्मिलन और एपेंडेंस के लिए अनुमति देता है। मैं वास्तव में केवल एक बार इसके लिए उपयोग किया है, लेकिन कोई अन्य संरचना पर्याप्त नहीं होती। नियमित स्ट्रिंग्स और एरेज़ प्रीपेंड्स अभी तक बहुत महंगे थे जो हमें करने की ज़रूरत थी, और हमेशा के लिए उलट देना सवाल से बाहर था।


मैं अपने खुद के उपयोग के लिए कुछ इस तरह के विचार किया है। यह जानकर अच्छा लगा कि इसे पहले ही कहीं और लागू किया जा चुका है।
किबी

15
SGI STL (1998) में एक कार्यान्वयन है: sgi.com/tech/stl/Rope.html
quark

2
यह जानने के बिना कि मुझे क्या कहा जाता है मैंने हाल ही में जावा के लिए कुछ इसी तरह लिखा था - प्रदर्शन उत्कृष्ट रहा है: code.google.com/p/mikeralib/source/browse/trunk/Mikera/src/…
mikera

रस्सी बहुत दुर्लभ है: stackoverflow.com/questions/1863440/…
होगा

6
मिकेरा की कड़ी बासी है, यहाँ वर्तमान है
aptwebapps

128

छोड़ें सूची बहुत साफ हैं।

विकिपीडिया
ए स्किप लिस्ट एक संभावनाशील डेटा संरचना है, जो बाइनरी सर्च ट्री (अधिकांश ऑपरेशन के लिए औसत लॉग एन औसत समय) के लिए तुलनीय कई समानांतर, सॉर्ट की गई सूचियों पर आधारित है।

उन्हें संतुलित वृक्षों के विकल्प के रूप में इस्तेमाल किया जा सकता है (संतुलन के सख्त प्रवर्तन के बजाय प्रबल संतुलन का उपयोग करके)। वे लागू करने में आसान हैं और कहते हैं, एक लाल-काले पेड़ की तुलना में तेज है। मुझे लगता है कि उन्हें हर अच्छे प्रोग्रामर टूलकिट में होना चाहिए।

यदि आप यहाँ स्किप-सूचियों का गहन परिचय प्राप्त करना चाहते हैं, तो उन पर MIT के परिचय के एल्गोरिदम के व्याख्यान के वीडियो का लिंक है

इसके अलावा, यहाँ एक जावा एप्लेट है जो नेत्रहीन रूप से सूची छोड़ें प्रदर्शित करता है।


+1 क्यूटी अपने छांटे गए मानचित्रों और सेटों के लिए आरबी-पेड़ों के बजाय स्किप सूचियों का उपयोग करता है। हां, वे निफ्टी (अनिवार्य भाषाओं में, वैसे भी) हैं।
माइकल एकस्ट्रैंड

2
रेडिस "सॉर्ट किए गए सेट" को लागू करने के लिए स्किप सूचियों का उपयोग करता है।
एंटीरेज़

जब मुझे एक अच्छी डेटा संरचना की आवश्यकता हो तो उपयोग करने के लिए स्किप लिस्ट मेरी पसंदीदा डेटा संरचना है और डेटा के आदेश के अनुसार मेरी कोई गारंटी नहीं है, और मैं अन्य "संतुलित" डेटा संरचनाओं की तुलना में एक सरल कार्यान्वयन चाहता हूं। इतनी अच्छी बात है।
इयरिनो

दिलचस्प पक्ष-नोट: यदि आप अपनी स्किप सूचियों में पर्याप्त स्तर जोड़ते हैं, तो आप अनिवार्य रूप से एक बी-ट्री के साथ समाप्त होते हैं।
रियाद कल्ला

92

स्थानिक संकेत , विशेष रूप से आर-पेड़ और केडी-पेड़ , स्थानिक डेटा को कुशलता से संग्रहीत करते हैं। वे भौगोलिक मानचित्र समन्वय डेटा और वीएलएसआई जगह और मार्ग एल्गोरिदम, और कभी-कभी निकटतम-पड़ोसी खोज के लिए अच्छे हैं।

बिट एरे व्यक्तिगत रूप से बिट्स को संग्रहीत करता है और तेजी से बिट संचालन की अनुमति देता है।


6
स्थानिक सूचकांक एन-बॉडी सिमुलेशन के लिए भी उपयोगी होते हैं जिसमें गुरुत्वाकर्षण जैसी लंबी दूरी की ताकतें शामिल होती हैं।
जस्टिन पील

87

Zippers - डेटा संरचनाओं का डेरिवेटिव जो संरचना को 'कर्सर' की एक प्राकृतिक धारणा के लिए संशोधित करता है - वर्तमान स्थान। ये वास्तव में उपयोगी होते हैं क्योंकि वे संकेत देते हैं कि बाउंड-आउट विंडो मैनेजर में ट्रैक करने के लिएउपयोग नहीं किया जा सकता है, जैसेकि विंडो ने ध्यान केंद्रित किया है।

आश्चर्यजनक रूप से, आप उन्हें पथरी से मूल डेटा संरचना के प्रकार तक तकनीक लागू करके प्राप्त कर सकते हैं !


2
यह केवल कार्यात्मक प्रोग्रामिंग में उपयोगी है (अनिवार्य भाषाओं में आप केवल एक संकेतक या एक सूचकांक रखते हैं)। इसके अलावा, मैं अभी भी नहीं मिलता है कि कैसे Zippers वास्तव में काम करते हैं।
स्टीफन मोनोव

4
@Tefan बिंदु यह है कि अब आपको एक अलग सूचकांक या सूचक रखने की आवश्यकता नहीं है।
डॉन स्टीवर्ट

69

यहाँ कुछ है:

  • प्रत्यय कोशिश करता है। स्ट्रिंग खोज के लगभग सभी प्रकारों के लिए उपयोगी (http://en.wikipedia.org/wiki/Suffix_trie#Functionality )। प्रत्यय सरणियों को भी देखें; वे काफी तेजी से प्रत्यय के पेड़ के रूप में नहीं हैं, लेकिन एक पूरी बहुत छोटा है।

  • सेप के पेड़ (जैसा ऊपर बताया गया है)। वे शांत हैं कारण तीन गुना है:

    • वे छोटे हैं: आपको केवल बाएं और दाएं पॉइंटर्स की आवश्यकता है जैसे आप किसी भी बाइनरी ट्री में करते हैं (कोई नोड-कलर या आकार की जानकारी संग्रहीत करने की आवश्यकता नहीं है)
    • वे (तुलनात्मक रूप से) लागू करने के लिए बहुत आसान हैं
    • वे "माप मानदंड" की पूरी मेजबानी के लिए इष्टतम परिशोधन जटिलता प्रदान करते हैं (लॉग एन लुकअप समय जिसे हर कोई जानता है)। देखhttp://en.wikipedia.org/wiki/Splay_tree#Performance_theorems
  • हीप-ऑर्डर किए गए खोज ट्री: आप ट्री में (की, प्रियो) जोड़े का एक गुच्छा स्टोर करते हैं, जैसे कि यह कुंजी के संबंध में खोज ट्री है, और प्राथमिकता के संबंध में हीप-ऑर्डर किया गया है। एक दिखा सकता है कि इस तरह के पेड़ का एक अनूठा आकार होता है (और यह हमेशा पूरी तरह से पैक नहीं किया जाता है, और बाएं तरफ)। यादृच्छिक प्राथमिकताओं के साथ, यह आपको अपेक्षित O (लॉग एन) खोज समय, IIRC देता है।

  • एक आला एक हे (1) पड़ोसी प्रश्नों के साथ अप्रत्यक्ष प्लानर रेखांकन के लिए आसन्न सूची है। मौजूदा डेटा संरचना को व्यवस्थित करने के लिए एक विशेष तरीके के रूप में यह इतना अधिक डेटा संरचना नहीं है। यहां बताया गया है कि आप इसे कैसे करते हैं: प्रत्येक प्लानर ग्राफ में डिग्री के साथ नोड होता है। 6. ऐसा नोड चुनें, अपने पड़ोसियों को इसकी पड़ोसी सूची में डाल दें, इसे ग्राफ से हटा दें, और ग्राफ़ खाली होने तक पुनरावृत्ति करें। जब एक जोड़ी (यू, वी) दी जाती है, तो आप वी की पड़ोसी सूची में और यू की पड़ोसी सूची में देखें। दोनों का आकार अधिकतम 6 है, इसलिए यह O (1) है।

उपरोक्त एल्गोरिथ्म के अनुसार, यदि u और v पड़ोसी हैं, तो आपके पास v की सूची में और u की सूची में v दोनों नहीं होंगे। यदि आपको इसकी आवश्यकता है, तो बस प्रत्येक नोड के लापता पड़ोसियों को उस नोड की पड़ोसी सूची में जोड़ें, लेकिन स्टोर करें कि आपको फास्ट लुकअप के लिए कितनी पड़ोसी सूची देखनी होगी।


हीप का आदेश दिया गया खोज पेड़ को ट्रीप कहा जाता है। एक चाल आप इन के साथ कर सकते हैं एक नोड की प्राथमिकता को बदलने के लिए इसे पेड़ के नीचे धकेल दिया जाता है, जहां इसे हटाना आसान है।
पेपरहॉर्स

1
"हीप का आदेश दिया गया खोज पेड़ को ट्रीप कहा जाता है।" - परिभाषा में, मैंने सुना है, IIRC, एक treap यादृच्छिक प्राथमिकताओं के साथ एक ढेर-आदेशित खोज ट्री है । आप आवेदन के आधार पर अन्य प्राथमिकताएं चुन सकते हैं ...
जोनास कोल्कर

2
एक प्रत्यय ट्राय लगभग नहीं बल्कि काफी अधिक कूलर प्रत्यय के पेड़ के समान है , जिसमें तार होते हैं और इसके किनारों पर व्यक्तिगत पत्र नहीं होते हैं और इसे रैखिक समय (!) में बनाया जा सकता है। इसके अलावा, asymptotically धीमे होने के बावजूद, अभ्यास में प्रत्यय सरणियों अक्सर अपने छोटे आकार और कम सूचक अप्रत्यक्षता के कारण कई कार्यों के लिए प्रत्यय पेड़ों की तुलना में बहुत तेज होते हैं। ओ (1) प्लेनर ग्राफ लुकिंग बीटीडब्लू से प्यार करें!
j_random_hacker

@j_random_hacker: प्रत्यय सरणियाँ asymptotically धीमी नहीं हैं। यहाँ रैखिक प्रत्यय सरणी निर्माण के लिए कोड की ~ 50 पंक्तियाँ है: cs.helsinki.fi/u/tpkarkka/publications/icalp03.pdf
एडवर्ड KMETT

1
@ एडवर्ड केमेट: मैंने वास्तव में उस कागज को पढ़ा है, यह प्रत्यय सरणी निर्माण में काफी हद तक सफल रहा । (हालांकि यह पहले से ही ज्ञात था कि रैखिक समय का निर्माण एक प्रत्यय के पेड़ के माध्यम से "जाने" से संभव था, यह 1 निर्विवाद रूप से व्यावहारिक "प्रत्यक्ष" एल्गोरिथ्म था।) लेकिन निर्माण के बाहर कुछ संचालन अभी भी एक प्रत्यय पर धीमी हैं जब तक कि एलसीए नहीं होता है। टेबल भी बनी है। यह O (n) में भी किया जा सकता है, लेकिन आप ऐसा करके शुद्ध प्रत्यय सरणी के आकार और स्थानीयता लाभ खो देते हैं।
j_random_hacker

65

मुझे लगता है कि मानक डेटा संरचनाओं के लिए लॉक-फ्री विकल्प यानी लॉक-फ्री कतार, स्टैक और सूची को बहुत अधिक अनदेखा किया गया है।
वे तेजी से प्रासंगिक हैं क्योंकि समवर्ती प्राथमिकता एक उच्च प्राथमिकता बन जाती है और समवर्ती पढ़ने / लिखने के लिए म्यूटेक्स या ताले का उपयोग करने की तुलना में बहुत अधिक सराहनीय लक्ष्य है।

यहां कुछ लिंक हैं
http://www.cl.cam.ac.uk/research/srg/netos/lock-free/
http://www.research.ibm.com/people/m/michael/podc-1996.pdf [PDF से लिंक]
http://www.boyet.com/Articles/LockfreeStack.html

माइक एक्टन (अक्सर उत्तेजक) ब्लॉग में लॉक-फ्री डिज़ाइन और दृष्टिकोणों पर कुछ उत्कृष्ट लेख हैं


लॉक-फ्री विकल्प आज के मल्टी-कोर में बहुत महत्वपूर्ण हैं, बहुत समानांतर, स्केलेबिलिटी
एडिक्टेड

खैर, एक व्यवधान वास्तव में ज्यादातर मामलों में बेहतर काम करता है।
deadalnix

55

मुझे लगता है कि जब आप अलग-अलग सेट और क्वेरी सदस्यता में आइटमों का एक गुच्छा विभाजित करने की आवश्यकता होती है, तो ऐसे मामलों के लिए Disjoint Set काफी निफ्टी है। संघ का अच्छा कार्यान्वयन और परिचालनात्मक परिचालनों में परिचालित लागतों का परिणाम मिलता है जो प्रभावी रूप से स्थिर हैं (एकरमैन के कार्य का उलटा, अगर मुझे अपने डेटा संरचनाओं को सही ढंग से याद है)।


8
इसे "संघ-खोज डेटा संरचना" भी कहा जाता है जब मैं पहली बार एल्गोरिथम वर्ग में इस चतुर डेटा संरचना के बारे में सीखा था तो मैं आश्चर्य में था ...
ब्लूराजा - डैनी पीफ्लुगुएफ्ट

यूनियन-फाइंड-डिलीट एक्सटेंशन एक स्थिर-समय को हटाने की अनुमति देते हैं।
पीकर

4
मैंने अपने कालकोठरी जनरेटर के लिए एक डिसजॉइंट सेट का उपयोग किया, यह सुनिश्चित करने के लिए कि सभी कमरे मार्ग से पहुंच रहे हैं :)
Goldenratio

52

फाइबोनैचि ढेर

वे ग्राफ़िक्स से संबंधित समस्याओं, जैसे कि शॉर्ट पाथ समस्या के लिए सबसे तेज़ ज्ञात एल्गोरिदम (asymptotically) में से कुछ में उपयोग किए जाते हैं। दिजाकस्ट्रा का एल्गोरिथ्म मानक बाइनरी ढेर के साथ ओ (ई लॉग वी) समय में चलता है; फाइबोनैचि ढेर का उपयोग करने से ओ (ई + वी लॉग वी) में सुधार होता है, जो घने रेखांकन के लिए बहुत बड़ा गति है। दुर्भाग्य से, हालांकि, उनके पास एक उच्च स्थिर कारक है, अक्सर उन्हें अभ्यास में अव्यवहारिक बना देता है।


उच्च स्थिर कारक जैसा आपने कहा था, और एक दोस्त के अनुसार अच्छी तरह से लागू करना मुश्किल था। मंगेतर नहीं है कि शांत है, लेकिन अभी भी, शायद जानने लायक है।
p4bl0

इन लोगों ने यहां अन्य ढेर प्रकारों की तुलना में उन्हें प्रतिस्पर्धात्मक बना दिया: cphstl.dk/Presentation/SEA2010/SEA-10.pdf एक संबंधित डेटा संरचना है जिसे पेयरिंग हैप्स कहा जाता है जिसे लागू करना आसान है और जो बहुत अच्छा व्यावहारिक प्रदर्शन प्रदान करता है। हालांकि, सैद्धांतिक विश्लेषण आंशिक रूप से खुला है।
मैनुएल

फाइबोनैचि ढेर के साथ अपने अनुभव से, मुझे पता चला कि स्मृति आवंटन का महंगा संचालन एक सरणी द्वारा समर्थित एक साधारण बाइनरी हीप से कम कुशल बनाता है।
22

44

3 डी प्रतिपादन में अनुभव वाले किसी भी व्यक्ति को बसपा के पेड़ों से परिचित होना चाहिए । आम तौर पर, यह कैमरा निर्देशांक और असर को जानने के प्रतिपादन के लिए प्रबंधनीय होने के लिए एक 3D दृश्य को संरचित करके विधि है।

द्विआधारी अंतरिक्ष विभाजन (बीएसपी) हाइपरप्लेन द्वारा उत्तल सेटों में एक स्थान को पुन: विभाजित करने की एक विधि है। यह उपखंड बीएसपी के पेड़ के रूप में जाना जाता है एक पेड़ डेटा संरचना के माध्यम से दृश्य के प्रतिनिधित्व को जन्म देता है।

दूसरे शब्दों में, यह उत्तल सेटों में जटिल आकार के बहुभुजों को तोड़ने की एक विधि है, या छोटे बहुभुज पूरी तरह से गैर-प्रतिवर्त कोण (180 ° से छोटे कोण) से मिलकर होते हैं। अंतरिक्ष विभाजन के अधिक सामान्य विवरण के लिए, अंतरिक्ष विभाजन देखें।

मूल रूप से, इस दृष्टिकोण को प्रतिपादन दक्षता बढ़ाने के लिए 3 डी कंप्यूटर ग्राफिक्स में प्रस्तावित किया गया था। कुछ अन्य अनुप्रयोगों में सीएडी में आकृतियों (रचनात्मक ठोस ज्यामिति) के साथ ज्यामितीय संचालन करना, रोबोटिक्स और 3 डी कंप्यूटर गेम में टकराव का पता लगाना, और अन्य कंप्यूटर अनुप्रयोग शामिल हैं जो जटिल स्थानिक दृश्यों को संभालते हैं।


... और संबंधित अष्टक और केडी-पेड़।
लोईकी

43

हफमैन के पेड़ - संपीड़न के लिए उपयोग किया जाता है।


हालांकि यह दिलचस्प है, इस तरह का 'इन्ट्रो टू अल्गोरिथम' नहीं है, यहाँ-ए-उदाहरण-ए-लालची-एलगो टाइप विषय है?
rshepherd

38

फ़िंगर ट्री पर एक नज़र डालें , खासकर यदि आप पहले बताए गए विशुद्ध रूप से कार्यात्मक डेटा संरचनाओं के प्रशंसक हैं । वे लगातार स्थिर समय में अंत तक पहुंच का समर्थन करने वाले लगातार अनुक्रमों का एक कार्यात्मक प्रतिनिधित्व करते हैं, और छोटे टुकड़े के आकार में लघुगणक में समतल और विभाजन करते हैं।

मूल लेख के अनुसार :

हमारे कार्यात्मक 2-3 उंगली के पेड़ एक सामान्य डिजाइन तकनीक का एक उदाहरण हैं, जिसे ओकासाकी (1998) द्वारा प्रस्तुत किया गया है, जिसे अंतर्निहित पुनरावर्ती मंदी कहा जाता है । हमने पहले ही नोट कर लिया है कि ये पेड़ उसकी निहित संरचना का विस्तार हैं, जो 2-3 स्थानों के साथ जोड़े को प्रतिस्थापित करते हैं ताकि कुशल संघनन और विभाजन के लिए आवश्यक लचीलापन प्रदान किया जा सके।

एक फिंगर ट्री को एक मोनॉइड के साथ परिमाणित किया जा सकता है , और विभिन्न मोनॉइड्स का उपयोग करने से पेड़ के लिए अलग-अलग व्यवहार होंगे। इससे फिंगर ट्री अन्य डेटा संरचनाओं का अनुकरण कर सकते हैं।


मैं
क्लोजर

इस डुप्लिकेट उत्तर पर एक नज़र डालें , यह पढ़ने लायक है!
फ्रेंकोइस जी

34

परिपत्र या रिंग बफर - स्ट्रीमिंग के लिए उपयोग किया जाता है, अन्य चीजों के बीच।


4
इसके अलावा, घृणित रूप से, किसी तरह पेटेंट कराया गया (कम से कम जब वीडियो के लिए इस्तेमाल किया गया)। ip.com/patent/USRE36801
डेविड एलिसन

लिंक को पढ़ने के आधार पर, मुझे नहीं लगता कि डेटा संरचना स्वयं पेटेंट है, लेकिन इसके आधार पर कुछ आविष्कार। मैं मानता हूं कि यह निश्चित रूप से एक बहुत ही कम इस्तेमाल की जाने वाली डेटा संरचना है।
गुरुत्वाकर्षण

33

मुझे आश्चर्य है कि किसी ने भी मर्कल ट्री (यानी हैश ट्री ) का उल्लेख नहीं किया है ।

कई मामलों में उपयोग किया जाता है (पी 2 पी प्रोग्राम, डिजिटल हस्ताक्षर) जहां आप पूरी फाइल के हैश को सत्यापित करना चाहते हैं जब आपके पास केवल आपके पास उपलब्ध फाइल का हिस्सा होता है।


32

<zvrba> वान एमडे-बोस पेड़

मुझे लगता है कि यह जानना उपयोगी होगा कि वे शांत क्यों हैं। सामान्य तौर पर, सवाल "क्यों" सबसे महत्वपूर्ण है;)

मेरा उत्तर यह है कि वे आपको {1..n} कुंजियों के साथ O (लॉग लॉग एन) डिक्शनरी देते हैं, इस बात से स्वतंत्र हैं कि कितनी कुंजियाँ उपयोग में हैं। जैसे बार-बार रुकने से आपको ओ (लॉग एन) मिलता है, बार-बार चकरा देने से आपको ओ (लॉग लॉग एन) मिलता है, जो कि वीईबी पेड़ में होता है।


वे सैद्धांतिक दृष्टिकोण से अच्छे हैं। व्यवहार में, हालांकि, उनमें से प्रतिस्पर्धात्मक प्रदर्शन प्राप्त करना काफी कठिन है। मुझे पता है कि पेपर उन्हें 32 बिट कुंजियों ( citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.2.7403 ) तक अच्छी तरह से काम करने के लिए मिला है, लेकिन दृष्टिकोण 34-35 बिट्स या उससे अधिक के पैमाने पर नहीं होगा या इसलिए और इसका कोई कार्यान्वयन नहीं है।
मैनुअल

एक और कारण है कि वे शांत हैं कि वे कई कैश-अनजान एल्गोरिदम के लिए एक महत्वपूर्ण बिल्डिंग ब्लॉक हैं।
एडवर्ड KMETT


29

हैश टेबल के एक दिलचस्प संस्करण को कोयल हाशिंग कहा जाता है । यह हैश टक्कर से निपटने के लिए सिर्फ 1 के बजाय कई हैश फ़ंक्शन का उपयोग करता है। प्राथमिक हैश द्वारा निर्दिष्ट स्थान से पुरानी वस्तु को हटाकर, और वैकल्पिक हैश फ़ंक्शन द्वारा निर्दिष्ट स्थान पर ले जाकर टकराव को हल किया जाता है। कोयल हाशिंग मेमोरी स्पेस के अधिक कुशल उपयोग की अनुमति देती है क्योंकि आप केवल 3 हैश फ़ंक्शन के साथ अपने लोड फैक्टर को 91% तक बढ़ा सकते हैं और अभी भी अच्छी पहुंच का समय है।


5
चेक होपसॉच हैशिंग ने और तेज़ होने का दावा किया है।
चमीक

27

एक मिनट-अधिकतम ढेर एक की एक विविधता है ढेर कि औजार एक डबल समाप्त हो गया प्राथमिकता कतार। यह ढेर संपत्ति में एक साधारण परिवर्तन से इसे प्राप्त करता है: एक पेड़ को न्यूनतम-अधिकतम आदेश कहा जाता है अगर सभी तत्वों को समान (विषम) स्तर पर सभी बच्चों और भव्य बच्चों की तुलना में कम (अधिक) हो। स्तर 1 से शुरू किए गए हैं।

http://internet512.chonbuk.ac.kr/datastructure/heap/img/heap8.jpg


लागू करने के लिए मुश्किल। यहां तक कि सर्वश्रेष्ठ प्रोग्रामर भी इसे गलत कर सकते हैं।
finnw

26

मुझे Cache Oblivious datastructures पसंद है । मूल विचार पुनरावर्ती छोटे ब्लॉकों में एक पेड़ रखना है ताकि कई अलग-अलग आकारों के कैश उन ब्लॉकों का लाभ ले सकें जो उनमें सुविधाजनक फिट हों। यह उन सभी में से किसी भी लेयरिंग के आकार की बारीकियों को जानने की आवश्यकता के बिना रैम में एल 1 कैश से रैम में सब कुछ पर कैशिंग का कुशल उपयोग करता है।


उस लिंक से दिलचस्प प्रतिलेखन: "कुंजी वैन एम्ड बोस लेआउट है, जिसका नाम 1977 में पीटर वैन
एम्ड

23

वाम झुकाव लाल-काले पेड़ । 2008 में प्रकाशित रॉबर्ट सेडविक द्वारा लाल-काले पेड़ों का एक काफी सरल कार्यान्वयन (~ लागू करने के लिए कोड की आधी लाइनें)। यदि आपको कभी रेड-ब्लैक ट्री के कार्यान्वयन के चारों ओर अपना सिर लपेटने में परेशानी हुई है, तो इस संस्करण के बारे में पढ़ें।

बहुत ही समान (यदि समान नहीं) एंडरसन पेड़ों के लिए।



19

गर्थ स्टोर्लिंग ब्रोडल और क्रिस ओकासाकी द्वारा बूटस्ट्रैप्ड तिरछी-द्विपदीय ढेर :

अपने लंबे नाम के बावजूद, वे फ़ंक्शन सेटिंग में भी विषम रूप से इष्टतम हीप संचालन प्रदान करते हैं।

  • O(1)आकार, संघ , सम्मिलित, न्यूनतम
  • O(log n) deleteMin

ध्यान दें कि संघ अधिक प्रसिद्ध ढेर के विपरीत समय के O(1)बजाय O(log n)समय लेता है जो आमतौर पर डेटा संरचना पाठ्यपुस्तकों में कवर होते हैं, जैसे कि वामपंथी ढेर । और फाइबोनैचि ढेर के विपरीत , उन एसिम्प्टोटिक्स को सबसे खराब स्थिति में रखा जाता है, न कि परिशोधन के बजाय, भले ही लगातार उपयोग किया जाता हो!

हास्केल में कई कार्यान्वयन हैं ।

ब्रोडल और ओकासाकी द्वारा संयुक्त रूप से व्युत्पन्न किए गए थे, ब्रोडल के समान हीमाइटोटिक्स के साथ एक क्रमागत ढेर के साथ आने के बाद ।


18
  • Kd-Trees , स्थानिक डेटा संरचना का उपयोग (अन्य के साथ) रियल-टाइम रिस्ट्रिक्शन में, यह नकारात्मक पक्ष है कि विभिन्न स्थानों को पार करने वाले त्रिकोणों को क्लिप करने की आवश्यकता होती है। आम तौर पर बीवीएच अधिक तेज़ होते हैं क्योंकि वे अधिक हल्के होते हैं।
  • एमएक्स-सीआईएफ क्वाडट्रीज , एक नियमित क्वाडट्री को बाइनरी ट्री के साथ क्वैड्स के किनारों पर जोड़कर मनमाने ढंग से बिंदु सेट के बजाय बाउंडिंग बॉक्स स्टोर करते हैं।
  • एचएएमटी , पदानुक्रमित हैश मैप जिसमें एक्सेस टाइम होता है जो आमतौर पर ओ (1) हैश-मैप में शामिल होते हैं।
  • इन्वर्टेड इंडेक्स , जिसे सर्च-इंजन सर्कल में काफी अच्छी तरह से जाना जाता है, क्योंकि इसका उपयोग विभिन्न खोज-शब्दों से जुड़े दस्तावेजों की तेजी से पुनर्प्राप्ति के लिए किया जाता है।

अधिकांश, यदि सभी नहीं हैं, तो इनमें से NIST डिक्शनरी ऑफ अल्गोरिद्म और डेटा स्ट्रक्चर्स पर प्रलेखित हैं


18

बॉल ट्री। सिर्फ इसलिए कि वे लोगों को गदगद करते हैं।

एक बॉल ट्री एक डेटा संरचना है जो एक मीट्रिक अंतरिक्ष में अनुक्रमित करता है। यहाँ उनके निर्माण पर एक लेख है। वे अक्सर एक बिंदु पर निकटतम पड़ोसियों को खोजने या के-साधनों को तेज करने के लिए उपयोग किया जाता है।


इन्हें आमतौर पर "सहूलियत बिंदु" पेड़ों या वीपी-पेड़ों के रूप में भी जाना जाता है। en.wikipedia.org/wiki/Vp-tree
एडवर्ड KMETT

17

वास्तव में डेटा संरचना नहीं; डायनामिक रूप से आवंटित सरणियों को ऑप्टिमाइज़ करने का एक तरीका है, लेकिन Emacs में प्रयुक्त गैप बफ़र एक प्रकार का शांत है।


1
मैं निश्चित रूप से विचार करूंगा कि डेटा संरचना हो।
क्रिस्टोफर नाई

रुचि रखने वाले किसी भी व्यक्ति के लिए, यह उसी तरह है जैसे कि स्विंग पाठ घटकों का समर्थन करने वाले दस्तावेज़ (जैसे प्लेनडक्वामेंटमेंट) मॉडल को भी लागू किया जाता है; 1.2 से पहले मुझे विश्वास है कि दस्तावेज़ मॉडल सीधे एरे थे, जो बड़े दस्तावेजों के लिए भयानक सम्मिलन प्रदर्शन का नेतृत्व करते हैं; जैसे ही वे गैप बफर में चले गए, सब फिर से दुनिया के साथ सही था।
रियाद कल्ला

16

फेनविक वृक्ष। यह एक डेटा संरचना है जो वेक्टर के सभी तत्वों की संख्या को दो दिए गए उप-बिंदुओं i और j के बीच रखता है। तुच्छ समाधान, पूर्वगामी राशि के बाद से बीगिंग किसी आइटम को अपडेट करने की अनुमति नहीं देता है (आपको रखने के लिए ओ (एन) काम करना होगा)।

फ़ेनविक ट्री आपको ओ (लॉग एन) में अपडेट और क्वेरी करने की अनुमति देता है, और यह कैसे काम करता है यह वास्तव में शांत और सरल है। यह फेनविक के मूल पेपर में वास्तव में अच्छी तरह से समझाया गया है, यहाँ स्वतंत्र रूप से उपलब्ध है:

http://www.cs.ubc.ca/local/reading/proceedings/spe91-95/spe/vol24/issue3/spe884.pdf

इसके पिता, आरक्यूएम पेड़ भी बहुत अच्छा है: यह आपको वेक्टर के दो अनुक्रमों के बीच न्यूनतम तत्व के बारे में जानकारी रखने की अनुमति देता है, और यह ओ (लॉग एन) अपडेट और क्वेरी में भी काम करता है। मुझे पहले आरक्यूएम और फिर फेनविक ट्री सिखाना पसंद है।


मुझे डर है कि यह एक डुप्लिकेट है । शायद आप पिछले उत्तर में जोड़ना चाहते हैं?
फ्रेंकोइस जी

संबंधित भी सेगमेंट ट्री हैं, जो सभी प्रकार के रेंज क्वेश्चन करने के लिए उपयोगी हैं।
druvbird


13

नेस्टेड सेट रिलेशनल डेटाबेस में पेड़ों का प्रतिनिधित्व करने और उन पर क्वेरी चलाने के लिए अच्छे हैं। उदाहरण के लिए, ActiveRecord (रूबी ऑन रेल्स डिफॉल्ट ORM) एक बहुत ही सरल नेस्टेड सेट प्लगइन के साथ आता है , जो पेड़ों को तुच्छ बनाने के साथ काम करता है।


12

यह सुंदर डोमेन-विशिष्ट है, लेकिन आधा-किनारा डेटा संरचना बहुत साफ है। यह बहुभुज मेश (चेहरे और किनारों) पर पुनरावृति करने का एक तरीका प्रदान करता है जो कंप्यूटर ग्राफिक्स और कम्प्यूटेशनल ज्यामिति में बहुत उपयोगी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.