ओकासाकी के बाद से विशुद्ध रूप से कार्यात्मक डेटा संरचनाओं में नया क्या है?


563

क्रिस ओकासाकी की 1998 की पुस्तक "विशुद्ध रूप से कार्यात्मक डेटा संरचनाएं" के बाद से, मैंने कई नए रोमांचक विशुद्ध रूप से कार्यात्मक डेटा संरचनाएं नहीं देखी हैं; मैं कुछ ही नाम दे सकता हूं:

  • IntMap (1998 में ओकासाकी द्वारा आविष्कार किया गया था, लेकिन उस पुस्तक में मौजूद नहीं है)
  • उंगली के पेड़ (और monoids पर उनका सामान्यीकरण)

पहले से ही ज्ञात डेटास्ट्रक्चर को लागू करने के कुछ दिलचस्प तरीके भी हैं, जैसे कि पेड़ के आक्रमणकारियों को सुनिश्चित करने के लिए "नेस्टेड प्रकार" या "सामान्यीकृत बीजीय डेटाैटिप्स" का उपयोग करना।

इस क्षेत्र में 1998 से कौन से अन्य नए विचार प्रकट हुए हैं?


20
अच्छा प्रश्न। मेरे पास सिर्फ एक छात्र मुझसे इस बारे में पूछ रहा था, और मुझे इसका जवाब नहीं पता था।
सुरेश वेंकट

यह यहां के लिए ठीक है, लेकिन आपको स्टैक ओवरफ्लो पर बेहतर जवाब मिल सकता है। यदि आप वहां पूछते हैं, तो सुनिश्चित करें और यहां चर्चा से लिंक करें।
चार्ल्स स्टीवर्ट

3
वैसे हास्केल रेडिट ने इसे देखा है इसलिए वहाँ से भी कुछ अच्छे उत्तर आएंगे, लेकिन उत्कृष्ट प्रश्न। ओकासाकी की किताब के आधे रास्ते में ही मैं सोच रहा था कि मैं खुद ऐसा सोचूं। +1
रॉबर्ट मसाइली


जवाबों:


553

1998 के बाद से प्रकाशित नई विशुद्ध रूप से कार्यात्मक डेटा संरचनाएं:

  • 2001: आइडियल हैश ट्री , और इसके 2000 पूर्ववर्ती, फास्ट एंड स्पेस एफिशिएंट ट्राई सर्च्स , फिल बागवेल द्वारा : जाहिर तौर पर क्लोजर के मानक पुस्तकालय में एक मौलिक बिल्डिंग ब्लॉक के रूप में उपयोग किया जाता है।

  • 2001: राल्फ हिंज द्वारा प्रायोरिटी सर्च क्यूस के लिए एक सरल कार्यान्वयन तकनीक : इस महत्वपूर्ण डाटस्ट्रक्चर को लागू करने के लिए एक बहुत ही सरल और सुंदर तकनीक (उपयोगी, दीजकस्ट्रा एल्गोरिदम में)। "व्यू पैटर्न" के भारी उपयोग के कारण कार्यान्वयन विशेष रूप से सुंदर और पठनीय है।

  • 2002: Ralf Hinze द्वारा एक तरफा लचीली सरणियों को बूटस्ट्रैप करना : ओकासाकी की रैंडम-एक्सेस सूचियों के समान, लेकिन उन्हें बीच के समय के ट्रेडऑफ़ को बदलने consऔर अनुक्रमित करने के लिए ट्यून किया जा सकता है ।

  • 2003: राडू मिहास्कु और रॉबर्ट टार्जन द्वारा नए प्रायद्वीपीय और गैर-अभेद्य देवताओं , कुछ पुराने काम (कपलान और टारजन द्वारा) पर एक नया ले कि ओकासाकी का हवाला ( कपलान और टारजन के काम का सबसे हालिया संस्करण 2000 में प्रकाशित हुआ था )। यह संस्करण कुछ मायनों में सरल है।

  • 2005: क्रिस ओकासाकी द्वारा मैक्सिपहोबिक हीप्स ( कागज और कोड ) : एक नई, अधिक कुशल संरचना के रूप में प्रस्तुत नहीं किया गया, लेकिन प्राथमिकता कतारों को सिखाने के तरीके के रूप में।

  • 2006: विशुद्ध रूप से कार्यात्मक सबसे खराब मामला लगातार समय में क्रमबद्ध क्रमबद्ध सूची , Gerth Stølting Brodal, Christos Makris, और Kostas Tsichlas द्वारा : O (lg n) सम्मिलित करें, खोज, और हटाएं और O के साथ एक संरचना का प्रदर्शन करके कपलान और टारजन के एक उत्कृष्ट प्रश्न का उत्तर दें। (१) समास।

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

  • 2010: मैट ब्लैक द्वारा रेड-ब्लैक ट्रीज के लिए एक नया विशुद्ध रूप से कार्यात्मक डिलीट एल्गोरिदम : ओकासाकी के रेड-ब्लैक ट्री इंसर्शन अल्गोरिदम की तरह, यह एक नया डेटा स्ट्रक्चर या डेटा संरचना पर एक नया ऑपरेशन नहीं है, बल्कि एक नया, सरल तरीका है एक ज्ञात ऑपरेशन लिखें।

  • 2012: आरआरबी-ट्रीज: फिल बागवेल और टिएक रोमपफ द्वारा कुशल इम्यूटेबल वेक्टर्स : हैश अर्रे मैप्ड ट्रिप्स का विस्तार, अपरिवर्तनीय वेक्टर कॉनसैटेनेशन का समर्थन, इन्सर्ट-ऑन और स्प्लिट ओ (lg n) टाइम में, इंडेक्स को बनाए रखते हुए, अपडेट करें , और मूल अपरिवर्तनीय वेक्टर की प्रविष्टि गति।

1997 में ज्ञात, लेकिन ओकासाकी की पुस्तक में चर्चा नहीं की गई:

  • संतुलित खोज पेड़ की कई अन्य शैलियाँ । AVL, भाई, रैंक-संतुलित, बाउंड-बैलेंस, और कई अन्य संतुलित खोज पेड़ पथ नकल द्वारा विशुद्ध रूप से कार्यात्मक रूप से कार्यान्वित (और किए गए) हो सकते हैं। शायद विशेष उल्लेख योग्य हैं:

    • सैमुअल डब्ल्यू बेंट, डैनियल डी। स्लेटोर, और रॉबर्ट ई। टारजन : बायोडेड सर्च ट्रीज़ , ब्रोडल एट अल। 2006 के पेपर में एक प्रमुख तत्व और डेमनी एट अल 2008 पेपर।
  • अनंत सेट जो तेजी से खोज को स्वीकार करते हैं , मार्टीन एस्कोर्डो द्वारा : शायद प्रति डेटा संरचना नहीं।

  • क्रिस ऑकसाकी द्वारा ब्रौन पेड़ों पर तीन एल्गोरिदम : ब्रौन पेड़ सबसे खराब स्थिति में कई ढेर संचालन प्रदान करते हैं ओ (lg n)। इस सीमा को कई अन्य डेटा संरचनाओं द्वारा पार कर लिया गया है, लेकिन ब्रौन के पेड़ोंconsमें इसके दूसरे तर्क मेंएकऑपरेशन आलसी है, और इसलिए इसे कुछ तरीकों से अनंत ढेर के रूप में इस्तेमाल किया जा सकता है जो अन्य संरचनाएं नहीं कर सकती हैं।

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

  • जिपर , जेरार्ड ह्यूट द्वारा : कई अन्य डेटा संरचनाओं (जैसे कि हेंज और पैटर्सन की उंगली के पेड़) में उपयोग किया जाता है, यह डेटा संरचना को अंदर-बाहर मोड़ने का एक तरीका है।

  • अंतर सूचियाँ O (1) सामान्य सूचियों में O (n) परिवर्तन के साथ प्राप्य consसूचियाँ हैं। वे स्पष्ट रूप से प्रोलॉग समुदाय में पुरातनता के बाद से जाने जाते हैं, जहां उनके पास सामान्य consसूचियों में ओ (1) परिवर्तन है । पारंपरिक कार्यात्मक प्रोग्रामिंग में O (1) परिवर्तन असंभव प्रतीत होता है, लेकिन POPL '98 से Minamide का छिद्र अमूर्त , शुद्ध कार्यात्मक प्रोग्रामिंग के भीतर O (1) परिशिष्ट और O (1) परिवर्तन की अनुमति देने के तरीके पर चर्चा करता है। अंतर सूचियों के सामान्य कार्यात्मक प्रोग्रामिंग कार्यान्वयनों के विपरीत, जो फ़ंक्शन क्लोजर पर आधारित होते हैं, छेद अमूर्त अनिवार्य रूप से समान अंतर सूचियों के रूप में समान (उनके उपयोग और उनके कार्यान्वयन दोनों में) होते हैं। हालांकि, ऐसा लगता है कि वर्षों से एकमात्र व्यक्ति जिसने इस पर ध्यान दिया थामिनामाइड के समीक्षकों में से एक

  • O(n)Θ(nlgn)Θ(nlgn)Θ(lg2n)

ओकासाकी की पुस्तक के पहले, दौरान और बाद में अधिकतर कार्यात्मक डेटा संरचनाएं:

  • O(m)mO(lglgn)

  • 1989: बेतरतीब पेड़ खोजें सीसिलिया आर आरागॉन और रैमंड सेडल द्वारा : इन में लड़का ई Blelloch और मार्गरेट रीड-मिलर द्वारा एक पूरी तरह कार्यात्मक सेटिंग में चर्चा की गई फास्ट सेट संचालन Treaps का उपयोग में दान Blandford और गाय ब्लेलोच और से के साथ कार्यात्मक सेट संचालन ट्रेप्स ( कोड))। वे विशुद्ध रूप से कार्यात्मक उंगलियों और पक्षपाती खोज पेड़ों के सभी संचालन प्रदान करते हैं, लेकिन यादृच्छिकता के स्रोत की आवश्यकता होती है, जिससे उन्हें विशुद्ध रूप से कार्यात्मक नहीं बनाया जाता है। यह भी समय पर संचालन की समय जटिलता को अमान्य कर सकता है, एक प्रतिकूल मानकर जो ऑपरेशन कर सकता है और लंबे लोगों को दोहरा सकता है। (यह एक ही कारण है कि लगातार परिमाण में तर्कपूर्ण परिशोधन तर्क मान्य नहीं हैं, लेकिन इसके लिए स्टॉपवॉच के साथ एक विरोधी की आवश्यकता होती है)

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

  • 1998: ओकासाकी की पुस्तक में सभी परिशोधित संरचनाएँ! ओकासाकी ने परिशोधन और कार्यात्मक डेटा संरचनाओं के मिश्रण के लिए इस नई विधि का आविष्कार किया, जिसे पहले असंगत माना जाता था। यह संस्मरण पर निर्भर करता है, जैसा कि कपलान और टार्जन ने कभी-कभी उल्लेख किया है, वास्तव में एक दुष्प्रभाव है। कुछ मामलों में ( जैसे प्रदर्शन कारणों के लिए SSDs पर PFDS ), यह अनुचित हो सकता है।

  • 1998: सरल Confluently लगातार Catenable सूचियाँ , हैम कापलान, क्रिस ओकासाकी, और रॉबर्ट ई Tarjan द्वारा : परिशोधित हे (1) catenable deques देने के लिए, एक पहले (पूरी तरह कार्यात्मक रूप में एक ही इंटरफ़ेस पेश हुड के नीचे संशोधन का उपयोग करता है, लेकिन Memoization साथ ) ओकासाकी की पुस्तक में प्रदर्शित संस्करण। कपलान और टारजन ने पहले विशुद्ध रूप से कार्यात्मक O (1) सबसे खराब संरचना बनाई थी, लेकिन यह काफी अधिक जटिल है।

  • 2007: जैसा कि इस पृष्ठ पर एक अन्य जवाब में उल्लेख किया गया है, सिल्वेन कोंचोन और जीन-क्रिस्टोफ़ फ़िलियैटे द्वारा अर्द्ध-स्थायी डेटा संरचनाएं और निरंतर संघ-खोज

ओकासाकी की पुस्तक के पहले, दौरान और बाद में, कार्यात्मक डेटा संरचनाओं की पुष्टि करने की तकनीकें:

ओकासाकी की पुस्तक में इम्पीरियल डेटा संरचनाओं या विश्लेषणों पर चर्चा नहीं की गई है, लेकिन विशुद्ध रूप से कार्यात्मक डेटा संरचनाओं से संबंधित है:

  • द सॉफ्ट हीप: एक अनुमानित प्राथमिकता कतार, ऑप्टिमल एरर रेट के साथ , बर्नार्ड चेज़ेल द्वारा : यह डेटा संरचना सरणियों का उपयोग नहीं करता है, और इसलिए पहले #haskell IRC चैनल और बाद में स्टैक ओवरफ़्लो उपयोगकर्ताओं को लुभाया है , लेकिन इसमेंdeleteओ (lg n) शामिल है , जो आम तौर पर एक कार्यात्मक सेटिंग में संभव नहीं है, और अनिवार्य परिशोधित विश्लेषण, जो विशुद्ध रूप से कार्यात्मक सेटिंग में मान्य नहीं है।

  • ओ (1) उंगली अपडेट के साथ संतुलित बाइनरी सर्च ट्री । में डेटा सरंचनाएं लगातार बनाना , जेम्स आर Driscoll, नील Sarnak, डैनियल डी Sleator, और रॉबर्ट ई Tarjan एक लाल-काले पेड़ में नोड्स समूहीकरण ताकि लगातार अपडेट केवल हे (1) स्थान की आवश्यकता के लिए एक विधि प्रस्तुत करते हैं। टारजन, कपलान और मिहास्कु द्वारा डिज़ाइन किए गए विशुद्ध रूप से कार्यात्मक देवताओं और उंगली के पेड़, दोनों छोर पर ओ (1) अपडेट की अनुमति देने के लिए एक समान समूह तकनीक का उपयोग करते हैं। एथनसियोस के। क्लेकिलेजिस द्वारा स्थानीय खोज के लिए एवीएल-पेड़ इसी तरह काम करता है।

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

  • नियतात्मक पक्षपातपूर्ण उंगली पेड़ : में पक्षपातपूर्ण छोड़ें सूचियाँ , अमिताभ बागची, एडम एल Buchsbaum, और माइकल टी गुडरिक द्वारा, एक डिजाइन नियतात्मक पक्षपाती छोड़ सूचियों के लिए प्रस्तुत किया है। ऊपर उल्लिखित स्किप लिस्ट / ट्री परिवर्तन के माध्यम से, निर्धारक पक्षपाती खोज पेड़ों को बनाना संभव हो सकता है। मेरिएक डिक्शनरी में जॉन इकोनो और ürzgür inzkan द्वारा वर्णित उंगली पक्षपाती छोड़ें सूची फिर पक्षपाती छोड़ पेड़ों पर संभव हो सकता है। एक पक्षपाती उंगली का पेड़ डेमिने एट अल द्वारा सुझाया गया है। विशुद्ध रूप से कार्यात्मक कोशिशों पर अपने पेपर में (ऊपर देखें) कोशिशों में उंगली अपडेट पर समय और स्थान की सीमा को कम करने के तरीके के रूप में।

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


5
मुझे इस जवाब पर "समुदाय विकि" बॉक्स की जाँच याद नहीं है। क्या इसे पूर्ववत करने का कोई तरीका है?
जप्पल

7
@jbapple: एक निश्चित संख्या में संपादन के बाद, सभी पोस्ट सामुदायिक विकि बन जाते हैं। यह एक प्रभावशाली समीक्षा है। धन्यवाद।
फिल मिलर

29
महान सूची! जिससे मुझे लगता है कि ओकासाकी एक दूसरा संस्करण प्रकाशित करेगा।
रादु GRIGore

4
ध्यान दें कि इसाबेल / HOL SML, OCaml, Haskell, Scala के लिए कोड उत्पन्न कर सकता है। हास्कबेल टूल हास्केल को इसाबेल / एचओएल में भी आयात कर सकता है।
मकारि

2
"प्रोग्राम निष्कर्षण" की शब्दावली कोक में से एक है: आप एक रचनात्मक प्रमाण लेते हैं और उसमें से एक निष्पादन योग्य कार्यक्रम बनाते हैं, कुछ चीजों को अलग कर देते हैं। इसाबेल में इसे "कोड पीढ़ी" कहा जाता है और अलग-अलग तरीके से काम करता है, एचओएल विनिर्देशों को छद्म कोड के रूप में उपयोग करते हुए , सबूत नहीं। बर्गॉफ़र के अनुसार इसाबेल / एचओएल में सबूत निष्कर्षण कोक की तरह काम करता है, लेकिन इन दिनों शायद ही कभी इस्तेमाल किया जाता है।
मकारि

63

पहले से किए गए उत्कृष्ट नोट्स के लिए, मैं Zippers जोड़ूंगा

हूएट, जेरार्ड। "फंक्शनल पर्ल: द जिपर" जर्नल ऑफ़ फंक्शनल प्रोग्रामिंग 7 (5): 549-554, सितंबर 1997।

जिपर: डेटा संरचना


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

1
XML हेरफेर के लिए उनके उपयोग का एक उदाहरण: anti-xml.org/zippers.html
मैकेनिकल घोंघा

40

वाह, एक निरंतर यूनिअन-फ़िनड! धन्यवाद!
जक्कफ

3
खैर, इस तरह का ... लेख देखें।
रादू GRIGore

1
... या, अगर आप चाहें, कुछ कोड (मैट पार्किंसंस द्वारा) को देखने के github.com/septract/jstar/blob/master/src/utils/...
राडू ग्रिगोर

5
अब मैं देख रहा हूँ कि "किस तरह का .." टिप्पणी पर हंगामा हुआ। उनके पास अच्छा प्रदर्शन केवल तभी होता है जब कोई लगभग विशेष रूप से दृढ़ता का उपयोग नहीं करता है, या हर समय बैकट्रैक करता है: यदि आप अक्सर "नए" और "पुराने" दोनों संस्करणों का उपयोग करते हैं, तो आप खराब हो जाते हैं। हालांकि कूल रिरूटिंग आइडिया।
jkff

अब राडू का लिंक github.com/septract/jstar-old/blob/…
jbapple

20

मैं डेटा के प्रकारों के व्युत्पन्न के रूप में ज़िपर्स के मैकब्राइड के संस्करण को जोड़ूंगा।


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

3
सैमबी, आपको नियमित अभिव्यक्तियों के व्युत्पन्न में भी दिलचस्पी हो सकती है (यदि आप पहले से ही उनके बारे में नहीं जानते थे)।
जप्पल


14

Rangemaps

यह एक विशेष डेटा संरचना है, लेकिन इसे मार्टिन एर्विग के DIET के विकल्प के रूप में इस्तेमाल किया जा सकता है, थोड़े अलग गुणों के साथ, इसलिए इसकी तुलना करने के लिए कम से कम एक मौजूदा डेटा संरचना है। DIET को 1998 में JFP के एक लेख में वर्णित किया गया था, इसलिए शायद यह विशुद्ध रूप से कार्यात्मक डेटा संरचनाओं में शामिल नहीं है।


7

ऊपर दिए गए 2012 के पेपर के बाद, आरआरबी वैक्टर पर काम आईसीएफ 15 में विस्तारित और प्रकाशित किया गया है।

आरआरबी वेक्टर: एक व्यावहारिक सामान्य उद्देश्य अपरिहार्य अनुक्रम http://dl.acm.org/citation.cfm?id=2784739

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