एक लिंक्ड सूची और एक BinarySearchTree के बीच मुख्य अंतर क्या हैं? BST सिर्फ एक LinkedList बनाए रखने का एक तरीका है? मेरे प्रशिक्षक LinkedList बारे में बात की और उसके बाद BST लेकिन उनकी तुलना नहीं समझे या नहीं कहा जब दूसरे पर एक को पसंद करते हैं। यह शायद एक गूंगा सवाल है, लेकिन मैं वास्तव में संदेह में हूँ। अगर किसी को एक सरल तरीके से इस स्पष्ट कर सकते हैं मुझे खुशी होगी।
एक LinkedList और एक द्विआधारी खोज वृक्ष के बीच अंतर
मैं कहूंगा कि मुख्य अंतर यह है कि एक द्विआधारी खोज वृक्ष क्रमबद्ध किया जाता है है। जब आप एक द्विआधारी खोज वृक्ष है, जहां उन तत्वों अंत स्मृति में संग्रहीत किया जा रहा में डालने उनके मूल्य का एक समारोह है। किसी लिंक किए गए सूची के साथ, तत्वों आँख बंद करके उनके मूल्य की परवाह किए बिना सूची में जोड़ा जाता है।
अभी आप कुछ व्यापार नापसंद कर सकते हैं: लिंक्ड सूचियों प्रविष्टि को बनाए रखने और डालने कम खर्चीला द्विआधारी खोज के पेड़ खोज करने के लिए आम तौर पर तेज हो रहा है
कंप्यूटर विज्ञान में, एक द्विआधारी खोज वृक्ष (बीएसटी) एक द्विआधारी पेड़ डेटा संरचना जो निम्नलिखित गुण है:
- प्रत्येक नोड (ट्री में आइटम) एक अलग महत्व है;
- दोनों बाएँ और दाएँ subtrees भी द्विआधारी खोज के पेड़ होना चाहिए;
- एक नोड के बाईं सबट्री केवल नोड के मूल्य से कम मान हैं;
- एक नोड के दाईं सबट्री केवल से अधिक या नोड के मूल्य के बराबर मान हैं।
कंप्यूटर विज्ञान में, एक लिंक्ड सूची मौलिक डेटा संरचनाओं में से एक है, और अन्य डेटा संरचनाओं को लागू करने के लिए इस्तेमाल किया जा सकता है।
तो एक द्विआधारी खोज वृक्ष एक अमूर्त अवधारणा है कि एक लिंक्ड सूची या एक सरणी के साथ लागू किया जा सकता है। जबकि लिंक्ड सूची एक मौलिक डेटा संरचना है।
लिंक्ड सूचियों और BSTs वास्तव में, सिवाय इसके कि वे दोनों डेटा संरचनाओं कि कंटेनर के रूप में कार्य कर रहे हैं काफी समान नहीं है। लिंक्ड सूचियों मूल रूप से आप सम्मिलित और, सूची में किसी भी स्थान पर कुशलता तत्वों को दूर करते हुए सूची के आदेश को बनाए रखने के लिए अनुमति देते हैं। इस सूची में अगले (और अक्सर पिछले) करने के लिए एक तत्व से संकेत का उपयोग कर कार्यान्वित किया जाता है।
एक द्विआधारी खोज वृक्ष दूसरी तरफ (यानी यह निर्दिष्ट नहीं कर रहा है एक उच्च अमूर्त के एक डेटा संरचना है कि कैसे इस आंतरिक रूप से कार्यान्वित किया जाता है) है कि कुशल खोजों के लिए अनुमति देता है (यानी आदेश में एक विशिष्ट तत्व खोजने के लिए आप सब पर देखने के लिए की जरूरत नहीं है अवयव।
ध्यान दें कि एक लिंक्ड सूची, एक degenerated द्विआधारी पेड़ के रूप में सोचा जा सकता है एक पेड़ जहां सभी नोड्स केवल एक ही बच्चा है अर्थात्।
लिंक्ड सूची:
Item(1) -> Item(2) -> Item(3) -> Item(4) -> Item(5) -> Item(6) -> Item(7)
द्विआधारी पेड़:
Node(1)
/
Node(2)
/ \
/ Node(3)
RootNode(4)
\ Node(5)
\ /
Node(6)
\
Node(7)
किसी लिंक किए गए सूची में, आइटम एक भी अगले सूचक के माध्यम से एक साथ जुड़े हुए हैं। एक बाइनरी ट्री में, प्रत्येक नोड 0, 1 या 2 subnodes, जहां (एक द्विआधारी खोज वृक्ष के मामले में) छोड़ दिया नोड के प्रमुख नोड के प्रमुख और सही नोड के प्रमुख की तुलना में कम है की तुलना में अधिक है हो सकता है नोड। जब तक पेड़ संतुलित है के रूप में, प्रत्येक आइटम के searchpath कि एक लिंक्ड सूची में की तुलना में बहुत कम है।
Searchpaths:
------ ------ ------
key List Tree
------ ------ ------
1 1 3
2 2 2
3 3 3
4 4 1
5 5 3
6 6 2
7 7 3
------ ------ ------
avg 4 2.43
------ ------ ------
बड़ा संरचनाओं तक औसत खोज पथ महत्वपूर्ण छोटा हो जाता है:
------ ------ ------
items List Tree
------ ------ ------
1 1 1
3 2 1.67
7 4 2.43
15 8 3.29
31 16 4.16
63 32 5.09
------ ------ ------
एक द्विआधारी खोज वृक्ष किसी भी फैशन में लागू किया जा सकता है, यह एक लिंक्ड सूची उपयोग करने की आवश्यकता नहीं है।
एक लिंक्ड सूची बस एक संरचना है जो नोड्स और संकेत दिए गए / एक नोड के अंदर अन्य नोड के लिए संदर्भ शामिल है। एक सूची के सिर नोड देखते हुए, आप एक लिंक्ड सूची में किसी भी अन्य नोड के लिए ब्राउज़ कर सकते हैं। अगले नोड के लिए सामान्य संदर्भ, लेकिन यह भी पिछले नोड के लिए एक संदर्भ: दोगुना से जुड़े सूचियों दो संकेत / संदर्भ है। एक दोगुना से जुड़े सूची में अंतिम नोड अगले नोड के रूप में सूची में पहले नोड का संदर्भ है, और प्रथम नोड का संदर्भ अपने पिछले नोड के रूप में पिछले नोड है, यह एक परिपत्र सूची होना कहा जाता है।
एक द्विआधारी खोज वृक्ष एक पेड़ है कि दो मोटे तौर पर बराबर एक द्विआधारी खोज एल्गोरिथ्म तुलना के आधार पर दो हिस्सों में अपने इनपुट अप विभाजन है। इस प्रकार, यह केवल एक बहुत कुछ खोज की जरूरत है एक तत्व को खोजने के लिए। उदाहरण के लिए, यदि आप 1-10 के साथ एक पेड़ था और आप तीन के लिए खोज करने की जरूरत है, पहले शीर्ष पर तत्व की जाँच की जानी हैं, शायद एक 5 या 6. तीन तुलना में कम होगा, इसलिए केवल की पहली छमाही पेड़ तो जाँच की जाएगी। तो अगले मान 3 है, तो आप इसे, अन्यथा, एक तुलना किया जाता है, आदि, जब तक या तो यह नहीं पाया जाता है या उसका डेटा दिया जाता है की है। इस प्रकार के पेड़ देखने के लिए तेजी से होता है, लेकिन नहीं nessecarily तेजी से प्रविष्टि या हटाने के लिए। ये बहुत ही किसी न किसी तरह बताया गया है।
सूची लिंक्ड विकिपीडिया, और से बाइनरी खोजें ट्री विकिपीडिया से, यह भी।
एक लिंक्ड सूची सिर्फ इतना है कि ... एक सूची है। यह रैखिक है, प्रत्येक नोड (, आप एक दोगुना से जुड़े सूची की बात कर रहे हैं और पिछले) अगले नोड के लिए एक संदर्भ है। एक पेड़ की शाखाओं --- प्रत्येक नोड विभिन्न बच्चे नोड्स के लिए एक संदर्भ है। एक द्विआधारी पेड़ एक विशेष मामला है, जिसमें प्रत्येक नोड केवल दो बच्चे हैं है। इस प्रकार, एक लिंक्ड सूची में प्रत्येक नोड पिछले एक नोड और एक अगले नोड है, और एक द्विआधारी पेड़ में, एक नोड एक छोड़ दिया बच्चे को सही बच्चे, और माता पिता है।
इन रिश्तों, द्वि-दिशात्मक या uni-दिशात्मक हो सकता है कि कैसे आप संरचना पार करने के लिए सक्षम होना चाहिए पर निर्भर करता है।
यह वास्तव में बहुत सरल है। एक लिंक्ड सूची बस कोई विशेष क्रम में एक साथ श्रृंखलित, आइटम का एक समूह है। आप एक बहुत पतली पेड़ कि कभी नहीं शाखाओं के रूप में यह के बारे में सोच सकते हैं:
1 -> 2 -> 5 -> 3 -> 9 -> 12 -> |i. (है कि पिछले एक समाप्त अशक्त पर एक ascii अत्याधुनिक प्रयास है)
एक द्विआधारी खोज वृक्ष 2 मायनों में अलग है: द्विआधारी हिस्सा मतलब यह है कि प्रत्येक नोड है 2 बच्चों, नहीं एक है, और खोज हिस्सा मतलब है कि उन बच्चों को खोजें लाने के लिए व्यवस्थित कर रहे हैं - बाईं ओर केवल छोटे आइटम, और केवल बड़ों दांई ओर:
5
/ \
3 9
/ \ \
1 2 12
9 कोई बाईं बच्चे 2 है, और 1,, और 12 "पत्ते" हैं - वे कोई शाखाएं हैं।
सही बात?
का उपयोग करता है के सबसे "देखने" प्रकार के लिए, एक BST बेहतर है। लेकिन सिर्फ बातें की तरह "बातें बाद में पहले-इन-फर्स्ट-आउट या अंतिम-इन-फर्स्ट-आउट के साथ सौदा करने की एक सूची रखने के लिए", एक लिंक्ड सूची में अच्छी तरह से काम कर सकते हैं।
लिंक्ड सूची एक दूसरे को जैसे A-> बी> सी के साथ जुड़े हुए आसन्न नोड्स के साथ सीधे रैखिक डाटा नहीं है। आप एक सीधी बाड़ के रूप में यह विचार कर सकते हैं।
BST बस शाखाओं और में बारी उन शाखाओं अन्य शाखाओं और इतने पर से जुड़ा से जुड़ा मुख्य ट्रंक के साथ एक पेड़ की तरह एक सौपानिक संरचना है। "बाइनरी" शब्द यहां प्रत्येक शाखा दो शाखाओं की एक अधिकतम से जुड़ा है का मतलब है।
आप केवल एक आइटम की एक अधिकतम करने के लिए जुड़ा प्रत्येक आइटम के साथ सीधे डेटा का प्रतिनिधित्व करने के लिए जोड़ा सूची का उपयोग करें; आपको दो आइटम के लिए एक आइटम कनेक्ट करने के लिए उपयोग कर सकते हैं BST जबकि। आप इस तरह के वंश-वृक्ष के रूप में एक डेटा का प्रतिनिधित्व करने के BST उपयोग कर सकते हैं, लेकिन यह n-ary खोज पेड़ के रूप में वहाँ प्रत्येक व्यक्ति के लिए दो से अधिक बच्चों को हो सकता है हो जाएगा।
वे पूरी तरह से अलग डेटा संरचनाओं हैं।
एक लिंक्ड सूची तत्व प्रत्येक तत्व का अगले एक से जुड़ा हुआ है के एक दृश्य है, और एक दोगुना लिंक्ड सूची, पिछले एक के मामले में।
एक द्विआधारी खोज वृक्ष कुछ पूरी तरह से अलग है। यह एक रूट नोड है, रूट नोड दो बच्चे नोड्स अप करने के लिए है, और प्रत्येक बच्चे नोड अप करने के लिए दो बच्चे नोट्स आदि आदि यह एक बहुत चालाक डेटा संरचना है हो सकता है, लेकिन यह इसे यहाँ समझाने के लिए कुछ हद तक कठिन हो जाएगा। की जाँच करें विकिपीडिया artcle उस पर।
एक लिंक्ड सूची के साथ इस मुद्दे (चाहे पुनः प्राप्ति के लिए या सम्मिलित) के भीतर खोज कर रहा है।
एक एकल लिंक्ड सूची के लिए, आप सिर पर शुरू करने और क्रमिक रूप से खोज वांछित तत्व को खोजने के लिए करना है। पूरी सूची स्कैन करने के लिए आवश्यकता से बचने के लिए, आप सूची के भीतर नोड्स अतिरिक्त संदर्भ की जरूरत है, जो मामले में, यह अब एक सरल लिंक्ड सूची है।
एक द्विआधारी पेड़ स्वाभाविक क्रमबद्ध और नौगम्य द्वारा किया जा रहा और अधिक तेजी से खोज और प्रविष्टि के लिए अनुमति देता है।
एक वैकल्पिक कि मैंने पहले भी सफलतापूर्वक उपयोग किया है एक SkipList है। यह कुछ एक लिंक्ड सूची के लिए, लेकिन अतिरिक्त संदर्भ के साथ सदृश खोज प्रदर्शन एक द्विआधारी पेड़ के बराबर अनुमति देने के लिए प्रदान करता है।
एक लिंक्ड सूची "नोड्स", एक दूसरे से जुड़ा हुआ यानी की एक अनुक्रमिक संख्या है:
public class LinkedListNode
{
Object Data;
LinkedListNode NextNode;
}
एक द्विआधारी खोज वृक्ष एक समान नोड संरचना का उपयोग करता है, लेकिन बजाय अगले नोड को जोड़ने के लिए, यह दो बच्चे नोड्स के लिए लिंक:
public class BSTNode
{
Object Data
BSTNode LeftNode;
BSTNode RightNode;
}
विशिष्ट नियमों का पालन जब एक BST करने के लिए नए नोड्स जोड़कर, आप एक डेटा संरचना बहुत पार करने के लिए तेजी से होता है कि बना सकते हैं। यहाँ अन्य उत्तर इन नियमों विस्तृत, मैं सिर्फ कोड के स्तर पर नोड वर्गों के बीच अंतर को दिखाने के लिए चाहता था।
यह ध्यान रखें कि यदि आप एक BST में क्रमबद्ध डेटा डालें, कि आपके पास लिंक की सूची के साथ पहुंच जाएंगे महत्वपूर्ण है, और आप एक पेड़ उपयोग करने का लाभ खो देते हैं।
इस वजह से, एक LinkedList, एक हे (एन) ट्रेवर्सल डेटा संरचना है, जबकि एक BST एक हे (एन) सबसे खराब स्थिति में ट्रेवर्सल डेटा संरचना है, और एक हे (लॉग एन) सबसे अच्छा मामले में।
एक द्विआधारी खोज वृक्ष एक द्विआधारी पेड़ जिसमें प्रत्येक आंतरिक नोड है x संग्रहीत करता है एक तत्व ऐसी है कि तत्व के बाईं सबट्री में संग्रहीत एक्स से कम या उसके बराबर हैं एक्स और के अधिकार सबट्री में संग्रहीत तत्वों एक्स से अधिक या उसके बराबर हैं एक्स ।
![]()
अब एक लिंक्ड सूची नोड्स, प्रत्येक में मनमाने ढंग से मूल्यों और एक या दो संदर्भों अगले और / या पिछले नोड की ओर इशारा करते के अनुक्रम के होते हैं।
![]()
वे समानताएं हैं, लेकिन मुख्य अंतर यह है कि एक द्विआधारी खोज वृक्ष एक तत्व के लिए कुशल खोज, या "कुंजी" का समर्थन करने के लिए बनाया गया है।
एक द्विआधारी खोज पेड़, एक दोगुना से जुड़े सूची की तरह, संरचना में दो अन्य कारकों को इंगित करता है। हालांकि, जब बस सूची के अंत में उन्हें जोड़कर से संरचना करने के लिए तत्वों को जोड़ने, बल्कि, द्विआधारी पेड़ को पुनर्गठित किया है, ताकि "छोड़" नोड से जुड़ा हुआ तत्वों वर्तमान नोड और तत्वों "सही" से जुड़ा हुआ की तुलना में कम कर रहे हैं नोड वर्तमान नोड से अधिक है।
एक सरल कार्यान्वयन में, नए तत्व संरचना (पेड़ की जड़) के पहले तत्व की तुलना में है। यदि यह कम है, "बाएं" शाखा लिया जाता है, अन्यथा "सही" शाखा की जांच की है। जब तक एक शाखा खाली पाया गया है यह प्रत्येक नोड के साथ जारी है,; नए तत्व है कि स्थिति को भर सके।
इस सरल दृष्टिकोण के साथ, तत्वों क्रम में जोड़े जाते हैं, तो आप एक लिंक्ड सूची (एक ही प्रदर्शन के साथ) के साथ समाप्त। अलग एल्गोरिदम, पेड़ में संतुलन बनाए रखने के कुछ उपाय नोड्स उलटफेर द्वारा लिए मौजूद हैं। उदाहरण के लिए, AVL पेड़ पेड़ संभव के रूप में संतुलित रखने के लिए, सबसे अच्छा खोज बार दे रही है सबसे काम करते हैं। लाल-काले पेड़ पेड़ के रूप में संतुलित थोड़ी धीमी खोज में जिसके परिणामस्वरूप रखने नहीं है, है, लेकिन औसतन कम काम करने के रूप में कुंजी डाला जाता है या निकाल दिए जाते हैं।













