.NET में कोई ट्री <T> क्लास क्यों नहीं है?


87

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

क्या मैं बस अंधा हूं, और इसे नहीं खोज रहा ... क्या यह बीसीएल में कहीं दफन है? यदि नहीं, तो क्या कोई बाइनरी पेड़ों के लिए नि: शुल्क या ओपन-सोर्स सी # /। नेट लाइब्रेरी की सिफारिश कर सकता है? अधिमानतः एक कि जेनेरिक कार्यरत हैं।

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


माना। मुझे कभी-कभी दो नोड्स (ओ (लॉग एन) समय) को खोजने की आवश्यकता होती है जो एक मान को बाध्य करते हैं (जब मूल्य संग्रह में नहीं मिलता है)। उदाहरण के लिए संग्रह (वृक्ष) में १३ और १ tree (अन्य के बीच) शामिल हैं और मैं सबसे बड़ी और कम से कम १६ से अधिक की तलाश में हूं। एक पेड़ ऐसा कर सकता था, लेकिन डिक्शनरी, सॉर्ट की गई सूचियां और हैश टेबल O (N) लेते हैं। ।
लेस

जवाबों:


31

आप सही हैं, बीसीएल में कुछ भी नहीं है। मुझे इस पर संदेह है क्योंकि एक पेड़ का उपयोग करने का विकल्प आमतौर पर एक कार्यान्वयन विवरण है और अन्यथा डेटा तक पहुंचने का एक अपरंपरागत तरीका है। यही है, आप यह नहीं कहते हैं, "बाइनरी-सर्च-फॉर एलिमेंट # 37"; इसके बजाय, आप कहते हैं, "मुझे तत्व # 37 प्राप्त करें"।

लेकिन क्या आपने C5 पर एक नज़र डाली है ? यह सुपर-आसान है और उनके पास कई पेड़ कार्यान्वयन ( 1 , 2 , 3 ) हैं।


3
C5 बी-ट्री नहीं, रेड ब्लैक पेड़ों का समर्थन करता है। वे ऐसे मतभेद हैं जिनके बारे में लोगों को जागरूक होना चाहिए। बी-ट्री डिस्क आधारित पेड़ या बड़े मेमोरी आधारित पेड़ के लिए अधिक इष्टतम है। अधिक नोड्स को उसी इलाके में रखा जाता है ताकि आपको बेहतर प्रोसेसर कैश परफॉर्मेंस मिले और डिस्क पर राइट टू रीड लिखा जा सके।
एंथनीलैम्बर्ट

68

आप अपने खुद को परिभाषित कर सकते हैं:

public class MyTree<K, V> : Dictionary<K, MyTree<K, V>>
{
    public V Value { get; set; }
}

या अप्राप्त:

public class MyTree<V> : HashSet<MyTree<V>>
{
    public V Value { get; set; }
}

हालाँकि आपको यह जानने की आवश्यकता है कि आप संकलन के समय कितने पेड़ के स्तर को संभालेंगे, क्या मैं गलत हूं?
14

1
नहीं, C # कंपाइलर इस सिंटैक्स का समर्थन करता है।
जेसन

2
सावधान रहें कि तत्व इस तरह से अन-ऑर्डर किए गए हैं
सेबस्टियन

@Veverke शायद आप C ++ टेम्प्लेट के बारे में सोच रहे थे। .NET जेनरिक रनटाइम प्रकार हैं।
टॉम ब्लोडेट

मैं उत्सुक हूँ। आप इसका उपयोग कैसे करते हैं? व्यावहारिक रूप से? कोई नमूना?
स्यात्फ़ुल निज़ाम याह्या

39

ऐसे कार्यान्वयन से आप क्या चाहते हैं?

बाइनरी ट्री? लाल कला? मूलांक का पेड़? बी पेड़? आर पेड़? आर * पेड़?

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


1
प्रश्न के "क्यों" भाग के लिए सर्वश्रेष्ठ उत्तर।
जोएल कोएहॉर्न

और वे केवल खोज वृक्ष हैं। एक्सप्रेशन ट्री, डिसीजन ट्रेस भी हैं ...
हेनक होल्टरमैन

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

11
समानांतर ब्रह्मांड में कोई व्यक्ति प्रश्न पूछ रहा है: ".Net में कोई सूची प्रकार क्यों नहीं हैं?" शब्दकोश?" मुझे लगता है कि यह एक गैर अनुक्रमिक उत्तर है।
rymdsmurf


12

SortedSet<T>एक द्विआधारी खोज ट्री रेफरी के रूप में कार्यान्वित किया जाता है । SortedDictionary<TKey, TValue>आंतरिक रूप से इसका उपयोग करता है SortedSet<T>इसलिए यह एक द्विआधारी खोज ट्री रेफरी है


5
दुर्भाग्य से ये केवल आदेशित नक्शे और सूचियों के कार्यान्वयन हैं। न तो एक द्विआधारी पेड़ के रूप में पुन: उपयोग के लिए उपयोगी है - ये पेड़ संरचनाएं केवल संग्रह का कार्यान्वयन विवरण हैं। मैं वास्तव में एक वर्ग की तलाश कर रहा हूं जो पेड़ की संरचना को उजागर करता है।
21

9

नहीं, Tree<T>BCL में कोई भी " जैसा" प्रकार नहीं है (कुछ ऐसा है जिसने मुझे हमेशा के लिए हैरान कर दिया है ) लेकिन यहाँ एक अच्छा लेख है जो आपको C # में अपने स्वयं के कार्यान्वयन के माध्यम से चलेगा।

मुझे लगता है कि आप यह तर्क दे सकते हैं कि पेड़-आधारित डेटा संरचनाएं आमतौर पर उस तरह के अनुप्रयोगों में उपयोग की जाती हैं जो .NET आमतौर पर (व्यावसायिक ऐप, डेटा-मूविंग ऐप आदि) के लिए उपयोग की जाती हैं। फिर भी, मैं आपसे सहमत हूं, यह अजीब है कि बीसीएल का कोई कार्यान्वयन नहीं है।



-5

एक ट्रीनोड है जिसका आप उपयोग कर सकते हैं। यह सामान्य नहीं है और विंडोज़ के रूपों में छिपा हुआ है और ट्रीव्यू नियंत्रण के साथ उपयोग किया जाता है, लेकिन आप इसे कहीं और भी उपयोग कर सकते हैं।


हाँ, लेकिन इसमें सिर्फ System.Object ype का टैग गुण है। कोई जेनेरिक <टी> पैरामीटर
हेंक होल्टरमैन

3
मुझे हमेशा ऐसा करने में अजीब लगता है। यह आपके विशिष्ट उदाहरण के साथ कम दिखाई देता है, लेकिन अगर लोग नियमित रूप से पुन: प्रयोजन वर्गों से, कहते हैं, निर्भरताएँ, तो यह कठिन-से-निर्भर निर्भरता में परिणाम कर सकता है और यदि पुन: जानबूझकर वर्ग अप्रत्याशित तरीके से बदल जाता है, तो आप मुसीबत में पड़ सकते हैं। निर्भरता संस्करण।
पॉल मोरी

4
इसका उपयोग करने से क्या लाभ होगा? एक ट्री नोड में आमतौर पर कोई प्रासंगिक कार्यक्षमता नहीं होती है। यह सिर्फ बच्चों और अंत में एक माता-पिता के संदर्भ में है। इसके लिए किसी System.Windows का दुरुपयोग करने का कोई कारण नहीं है। बस इसे स्वयं लिखें - एक मिनट या उससे कम में।
user492238
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.