क्या त्रिक और मूलांक तीनों डेटा संरचना एक ही बात है?
यदि वे समान हैं, तो मूलांक तीन (AKA Patricia trie) का क्या अर्थ है?
क्या त्रिक और मूलांक तीनों डेटा संरचना एक ही बात है?
यदि वे समान हैं, तो मूलांक तीन (AKA Patricia trie) का क्या अर्थ है?
radix trie
लेख को शीर्षक देता है Radix tree
। इसके अलावा, "रेडिक्स ट्री" शब्द का साहित्य में व्यापक रूप से उपयोग किया जाता है। अगर कुछ भी कॉलिंग "उपसर्ग पेड़" की कोशिश करता है, तो मुझे अधिक समझ में आएगा। आखिरकार, वे सभी पेड़ डेटा संरचनाएं हैं।
radix = 2
, जिसका अर्थ है कि आप एक समय में इनपुट स्ट्रिंग के बिट्स को देखकर पेड़ को पार करते हैंlog2(radix)=1
।
जवाबों:
मूलांक का पेड़ त्रि का संकुचित संस्करण है। एक तिकड़ी में, प्रत्येक किनारे पर आप एक ही पत्र लिखते हैं, जबकि एक पेट्रीसिया पेड़ (या मूलांक वृक्ष) में आप अपने शब्दों को संग्रहीत करते हैं।
अब, मान लें कि आपके पास शब्द हैं hello
, hat
और have
। उन्हें एक तिकड़ी में संग्रहीत करने के लिए , ऐसा लगेगा:
e - l - l - o
/
h - a - t
\
v - e
और आपको नौ नोड चाहिए। मैंने अक्षरों को नोड्स में रखा है, लेकिन वास्तव में वे किनारों को लेबल करते हैं।
एक मूलांक वृक्ष में, आपके पास होगा:
*
/
(ello)
/
* - h - * -(a) - * - (t) - *
\
(ve)
\
*
और आपको केवल पांच नोड्स चाहिए। नोड्स के ऊपर की तस्वीर में तारांकन हैं।
तो, कुल मिलाकर, एक मूलांक वृक्ष कम स्मृति लेता है , लेकिन इसे लागू करना कठिन है। अन्यथा दोनों का उपयोग मामला बहुत अधिक समान है।
मेरा सवाल है कि क्या Trie डेटा संरचना और Radix Trie एक ही चीज़ हैं?
संक्षेप में, नहीं। श्रेणी मूलांक Trie की एक विशेष वर्ग का वर्णन Trie , लेकिन इसका मतलब यह नहीं है कि सभी की कोशिश करता मूलांक की कोशिश करता है।
यदि वे समान हैं, तो मूलांक तीन (उर्फ पेट्रीसिया ट्राय) का क्या अर्थ है?
मुझे लगता है कि आपको लिखने का मतलब आपके प्रश्न में नहीं है, इसलिए मेरा सुधार है।
इसी तरह, पैट्रिकिया एक विशेष प्रकार के मूलांक तीनों को दर्शाता है, लेकिन सभी मूलांक कोशिश नहीं करता है पाटिरिया कोशिश करता है।
"ट्राइ" एक साहचर्य सरणी के रूप में उपयोग के लिए उपयुक्त एक पेड़ डेटा संरचना का वर्णन करता है, जहां शाखाएं या किनारे एक कुंजी के कुछ हिस्सों के अनुरूप होते हैं । भागों की परिभाषा यहाँ अस्पष्ट है, क्योंकि कोशिशों के विभिन्न कार्यान्वयन किनारों के अनुरूप अलग-अलग बिट-लंबाई का उपयोग करते हैं। उदाहरण के लिए, एक बाइनरी ट्राइ में प्रति नोड दो किनारों होते हैं जो 0 या 1 के अनुरूप होते हैं, जबकि 16-तरफ़ा ट्राइ में प्रति नोड सोलह किनारों होते हैं जो चार बिट्स (या एक हेक्सिडेसिमल अंक: 0x0 के माध्यम से 0xf) के अनुरूप होते हैं।
विकिपीडिया से लिया गया यह आरेख, 'A', 'to', 'to', 'tea', 'ted', 'ten' और 'inn' सम्मिलित की गई (कम से कम) कुंजी के साथ एक चित्रण लगता है:
यदि यह तिकड़ी कुंजी 't', 'te', 'i' या 'in' के लिए आइटम संग्रहीत करने के लिए होती है, तो प्रत्येक नोड में मौजूद अतिरिक्त जानकारी को वास्तविक मानों के साथ अशक्त नोड्स और नोड्स के बीच अंतर करने की आवश्यकता होगी।
"मूलांक तीन" एक प्रकार के त्रि का वर्णन करता प्रतीत होता है जो सामान्य उपसर्ग भागों को संघनित करता है, जैसा कि आइवालो स्ट्रैंडजेव ने अपने उत्तर में वर्णित किया है। इस बात पर विचार करें कि एक 256-तरफ़ा ट्राइ जो कुंजी "स्माइल", "स्माइल", "स्माइल" और "स्माइलिंग" को निम्न स्टेटिक असाइनमेंट का उपयोग करके अनुक्रमित करता है:
root['s']['m']['i']['l']['e']['\0'] = smile_item;
root['s']['m']['i']['l']['e']['d']['\0'] = smiled_item;
root['s']['m']['i']['l']['e']['s']['\0'] = smiles_item;
root['s']['m']['i']['l']['i']['n']['g']['\0'] = smiling_item;
प्रत्येक सबस्क्रिप्ट एक आंतरिक नोड तक पहुँचता है। इसका मतलब यह है कि smile_item
, आपको सात नोड का उपयोग करना होगा। आठ नोड एक्सेस के साथ smiled_item
और smiles_item
, और नौ से मेल खाती है smiling_item
। इन चार वस्तुओं के लिए, कुल चौदह नोड्स हैं। उन सभी में पहले चार बाइट्स (पहले चार नोड्स के अनुरूप) हैं, हालाँकि। उन चार बाइट्स को बनाने के लिए जो एक root
से मेल खाती है बनाने के लिए ['s']['m']['i']['l']
, चार नोड एक्सेस दूर अनुकूलित किए गए हैं। इसका मतलब है कि कम मेमोरी और कम नोड एक्सेस, जो एक बहुत अच्छा संकेत है। अनावश्यक प्रत्यय बाइट्स तक पहुंचने की आवश्यकता को कम करने के लिए अनुकूलन को पुनरावर्ती रूप से लागू किया जा सकता है। आखिरकार, आप एक ऐसे बिंदु पर पहुँच जाते हैं जहाँ आप केवल खोज कुंजी और अनुक्रमित कुंजियों के बीच अंतरों की तुलना तिकड़ी द्वारा अनुक्रमित स्थानों पर करते हैं।। यह मूलांक तीन है।
root = smil_dummy;
root['e'] = smile_item;
root['e']['d'] = smiled_item;
root['e']['s'] = smiles_item;
root['i'] = smiling_item;
आइटम पुनर्प्राप्त करने के लिए, प्रत्येक नोड को एक स्थिति की आवश्यकता होती है। "मुस्कान" और root.position
4 की एक खोज कुंजी के साथ , हम पहुंचते हैं root["smiles"[4]]
, जो कि होता है root['e']
। इसे हम एक वैरिएबल में संग्रहीत करते हैं जिसे कहा जाता है current
। current.position
5 है, जो कि "smiled"
और के बीच अंतर का स्थान है "smiles"
, इसलिए अगली पहुंच होगी root["smiles"[5]]
। यह हमें smiles_item
और हमारे स्ट्रिंग के अंत में लाता है । हमारी खोज समाप्त हो गई है, और आइटम को आठ के बजाय सिर्फ तीन नोड एक्सेस के साथ पुनर्प्राप्त किया गया है।
PATRICIA ट्राई मूलांक का एक प्रकार है, जिसके लिए केवल ऐसे n
नोड्स होने चाहिए जिनका उपयोग n
वस्तुओं को करने के लिए किया जाता है । हमारे कुदरती तौर से प्रदर्शन किया मूलांक trie ऊपर स्यूडोकोड में, वहाँ कुल में पांच नोड्स हैं: root
(जो एक nullary नोड है, यह कोई वास्तविक मूल्य शामिल हैं), root['e']
, root['e']['d']
, root['e']['s']
और root['i']
। एक PATRICIA तिकड़ी में केवल चार होने चाहिए। आइए एक नज़र डालते हैं कि इन उपसर्गों को द्विआधारी में देखकर अलग-अलग कैसे हो सकता है, क्योंकि PATRICIA एक बाइनरी एल्गोरिथ्म है।
smile: 0111 0011 0110 1101 0110 1001 0110 1100 0110 0101 0000 0000 0000 0000
smiled: 0111 0011 0110 1101 0110 1001 0110 1100 0110 0101 0110 0100 0000 0000
smiles: 0111 0011 0110 1101 0110 1001 0110 1100 0110 0101 0111 0011 0000 0000
smiling: 0111 0011 0110 1101 0110 1001 0110 1100 0110 1001 0110 1110 0110 0111 ...
आइए हम विचार करें कि नोड्स को उस क्रम में जोड़ा गया है जो वे ऊपर प्रस्तुत किए गए हैं। smile_item
इस पेड़ की जड़ है। यह अंतर, इसे थोड़ा आसान करने के लिए बोल्ड किया गया है, अंतिम बाइट में "smile"
, बिट 36 पर है। इस बिंदु तक, हमारे सभी नोड्स में एक ही उपसर्ग है। smiled_node
के अंतर्गत आता है smile_node[0]
। के बीच का अंतर "smiled"
और "smiles"
बिट 43 है, जहां पर होता है "smiles"
एक '1' बिट है, तो smiled_node[1]
है smiles_node
।
बल्कि का उपयोग करने से NULL
शाखाओं और / या निरूपित करने के लिए अतिरिक्त आंतरिक जानकारी के रूप में जब एक खोज समाप्त, शाखाओं वापस लिंक अप पेड़ कहीं, तो एक खोज समाप्त जब परीक्षण करने के लिए ऑफसेट कम हो जाती है के बजाय बढ़ रही है। यहाँ इस तरह के एक पेड़ का एक सरल आरेख है (हालांकि पैट्रीसिया वास्तव में एक चक्रीय ग्राफ है, एक पेड़ की तुलना में, जैसा कि आप देखेंगे), जो नीचे उल्लेखित सेडगविक की पुस्तक में शामिल था:
वैरिएंट की लंबाई की चाबियों से युक्त एक अधिक जटिल पैट्रिआको एल्गोरिथ्म संभव है, हालांकि PATRICIA के कुछ तकनीकी गुणों को प्रक्रिया में खो दिया जाता है (अर्थात किसी भी नोड में इसके साथ नोड के साथ एक सामान्य उपसर्ग होता है):
इस तरह से ब्रांच करने से कई फायदे होते हैं: हर नोड में एक मूल्य होता है। वह जड़ भी शामिल है। नतीजतन, कोड की लंबाई और जटिलता बहुत कम हो जाती है और शायद वास्तविकता में थोड़ा तेज होती है। किसी आइटम का पता लगाने के लिए कम से कम एक शाखा और अधिकांश k
शाखाओं पर (जहां k
खोज कुंजी में बिट्स की संख्या होती है)। नोड छोटे हैं , क्योंकि वे केवल दो शाखाओं को संग्रहीत करते हैं, जो उन्हें कैश स्थानीयता अनुकूलन के लिए काफी उपयुक्त बनाता है। इन संपत्तियों को अब तक मेरा पसंदीदा एल्गोरिदम बना दिया गया है ...
मैं अपने आसन्न गठिया की गंभीरता को कम करने के लिए, यहाँ इस विवरण को कम करने जा रहा हूँ, लेकिन यदि आप PATRICIA के बारे में अधिक जानना चाहते हैं, तो आप डोनाल्ड नथ द्वारा "द आर्ट ऑफ़ कंप्यूटर प्रोग्रामिंग, वॉल्यूम 3" जैसी पुस्तकों से परामर्श कर सकते हैं। , या सेडगविक द्वारा "आपकी-पसंदीदा-भाषा", भागों 1-4 में किसी भी "एल्गोरिदम"।
TRIE:
हमारे पास एक खोज योजना हो सकती है, जहाँ सभी मौजूदा कुंजियों (जैसे हैश योजना) के साथ संपूर्ण खोज कुंजी की तुलना करने के बजाय, हम खोज कुंजी के प्रत्येक वर्ण की तुलना भी कर सकते हैं। इस विचार के बाद, हम एक संरचना बना सकते हैं (जैसा कि नीचे दिखाया गया है) जिसमें तीन मौजूदा चाबियाँ हैं - " डैड ", " डैब ", और " कैब "।
[root]
...// | \\...
| \
c d
| \
[*] [*]
...//|\. ./|\\... Fig-I
a a
/ /
[*] [*]
...//|\.. ../|\\...
/ / \
B b d
/ / \
[] [] []
(cab) (dab) (dad)
यह अनिवार्य रूप से आंतरिक नोड वाला एम-एरी ट्री है, जिसे [*] और लीफ नोड के रूप में दर्शाया जाता है। इस संरचना को त्रिक कहा जाता है । प्रत्येक नोड पर शाखा का निर्णय वर्णमाला के अद्वितीय प्रतीकों की संख्या के बराबर रखा जा सकता है, आर कहते हैं। कम मामले के लिए अंग्रेजी वर्णमाला az, R = 26; विस्तारित ASCII वर्णमाला के लिए, R = 256 और बाइनरी अंक / स्ट्रिंग्स R = 2 के लिए।
कॉम्पैक्ट Trie:
आमतौर पर, एक में एक नोड trie के साथ आकार = आर एक सरणी का उपयोग करता है और इस तरह स्मृति की बर्बादी का कारण बनता है जब प्रत्येक नोड कम किनारों है। स्मृति की चिंता को दरकिनार करने के लिए, विभिन्न प्रस्ताव बनाए गए थे। उन विविधताओं के आधार पर ट्राई को " कॉम्पैक्ट ट्राई " और " कंप्रेस्ड ट्राई " के नाम से भी जाना जाता है । जबकि एक सुसंगत नामकरण दुर्लभ है, एक कॉम्पैक्ट तिकड़ी का सबसे आम संस्करण सभी किनारों को समूहित करके बनाया जाता है जब नोड्स में एक किनारे होता है। इस अवधारणा से ऊपर (चित्र I) का उपयोग करना, trie कुंजी "पिता" के साथ, "थपका", और "टैक्सी" फ़ॉर्म नीचे ले जा सकते हैं।
[root]
...// | \\...
| \
cab da
| \
[ ] [*] Fig-II
./|\\...
| \
b d
| \
[] []
ध्यान दें कि प्रत्येक 'c', 'a', और 'b' इसके संबंधित अभिभावक नोड के लिए एकमात्र किनारा है और इसलिए, इन्हें एक ही किनारे "कैब" में रखा जाता है। इसी तरह, 'डी' और 'ए' को 'दा' कहे जाने वाले सिंगल एज में मिला दिया जाता है।
मूलांक तीन: गणित में मूलांक
शब्द का अर्थ है एक संख्या प्रणाली का एक आधार, और यह अनिवार्य रूप से उस प्रणाली में किसी भी संख्या का प्रतिनिधित्व करने के लिए आवश्यक अद्वितीय प्रतीकों की संख्या को इंगित करता है। उदाहरण के लिए, दशमलव प्रणाली मूलांक दस है, और बाइनरी सिस्टम मूलांक दो है। इसी तरह की अवधारणा का उपयोग करते हुए, जब हम अंतर्निहित प्रतिनिधित्व प्रणाली के अद्वितीय प्रतीकों की संख्या के आधार पर एक डेटा संरचना या एक एल्गोरिथ्म को चिह्नित करने में रुचि रखते हैं, तो हम "रेडिक्स" शब्द के साथ अवधारणा को टैग करते हैं। उदाहरण के लिए, कुछ छँटाई एल्गोरिथ्म के लिए "मूलांक सॉर्ट"। तर्क की एक ही पंक्ति में, तीनों के सभी प्रकारजिनकी विशेषताएं (जैसे कि गहराई, स्मृति की आवश्यकता, खोज मिस / हिट रनटाइम, आदि) अंतर्निहित वर्णमाला के मूलांक पर निर्भर करती हैं, हम उन्हें मूलांक "त्रिक" कह सकते हैं। उदाहरण के लिए, एक संयुक्त राष्ट्र के रूप में अच्छी तरह से एक कॉम्पैक्ट ट्राई जब अक्षर az का उपयोग करता है, तो हम इसे मूलांक 26 ट्राई कह सकते हैं । कोई भी तिकड़ी जो केवल दो प्रतीकों (पारंपरिक रूप से '0' और '1') का उपयोग करती है, को मूलांक 2 त्रि कहा जा सकता है । हालांकि, किसी भी तरह कई साहित्यकारों ने "रेडिक्स ट्राइ" शब्द का उपयोग केवल संकुचित त्रि के लिए किया ।
PATRICIA ट्री / ट्राई को छोड़ें:
यह ध्यान रखना दिलचस्प होगा कि बाइनरी-अल्फाबेट्स का उपयोग करके कुंजी को स्ट्रिंग के रूप में भी दर्शाया जा सकता है। यदि हम ASCII एन्कोडिंग को मानते हैं, तो एक कुंजी "डैड" को द्विआधारी रूप में प्रत्येक चरित्र के द्विआधारी प्रतिनिधित्व को अनुक्रम में लिखकर " 01100100 01100001 01100100 " के रूप में लिखा जा सकता है, जो 'd', 'a', और के रूप में लिखते हैं। क्रमिक रूप से 'd'। इस अवधारणा का उपयोग करते हुए, एक त्रि (मूलांक दो के साथ) का गठन किया जा सकता है। नीचे हम इस अवधारणा को एक सरलीकृत धारणा का उपयोग करके दर्शाते हैं कि अक्षर 'ए', 'बी', 'सी' और 'विल' ASCII के बजाय एक छोटी वर्णमाला से हैं।
चित्र- III के लिए नोट: जैसा कि उल्लेख किया गया है, चित्रण को आसान बनाने के लिए, आइए केवल 4 अक्षरों {a, b, c, d} के साथ एक वर्णमाला मान लें और उनके संबंधित द्विआधारी प्रतिनिधित्व "00", "01", "10" और "11" क्रमशः। इसके साथ, हमारी स्ट्रिंग कुंजियाँ "डैड", "डैब" और "कैब" क्रमशः "110011", "110001" और "100001" बन जाती हैं। इसके लिए तिकड़ी नीचे दी गई है जैसा कि चित्र- III में दिखाया गया है (बिट्स को बाएं से दाएं की तरह ही पढ़ा जाता है जैसे तार को बाएं से दाएं पढ़ा जाता है)।
[root]
\1
\
[*]
0/ \1
/ \
[*] [*]
0/ /
/ /0
[*] [*]
0/ /
/ /0
[*] [*]
0/ 0/ \1 Fig-III
/ / \
[*] [*] [*]
\1 \1 \1
\ \ \
[] [] []
(cab) (dab) (dad)
पेट्रीसिया Trie / ट्री:
हम ऊपर द्विआधारी संकुचित तो trie (चित्र-तृतीय) एकल बढ़त संघनन का उपयोग कर, यह बहुत कम नोड्स ऊपर दिखाए से होता है और अभी तक, नोड्स अभी भी अधिक से अधिक 3 होगा, कुंजियों की संख्या इसमें । डोनाल्ड आर। मॉरिसन ने पाया (1968 में) केवल N नोड्स का उपयोग करके N कीज़ को चित्रित करने के लिए बाइनरी ट्राइ का उपयोग करने का एक अभिनव तरीका और उन्होंने इस डेटा संरचना का नाम PATRICIA रखा।। उनकी त्रिक संरचना अनिवार्य रूप से एकल किनारों (एक-तरफा शाखा) से छुटकारा पा गई; और ऐसा करने में, उन्होंने दो प्रकार के नोड्स की धारणा से भी छुटकारा पा लिया - आंतरिक नोड्स (जो किसी भी कुंजी को चित्रित नहीं करते हैं) और पत्ती नोड्स (कि चित्रण कुंजी)। ऊपर बताए गए संघनन तर्क के विपरीत, उनकी तिकड़ी एक अलग अवधारणा का उपयोग करती है जहां प्रत्येक नोड में एक ब्रांचिंग निर्णय लेने के लिए कुंजी के कितने बिट्स को छोड़ दिया जाना शामिल है। अभी तक उनके पैट्रियिया ट्राई की एक और विशेषता यह है कि यह कुंजियों को संग्रहीत नहीं करता है - जिसका अर्थ है कि ऐसी डेटा संरचना सवालों के जवाब देने के लिए उपयुक्त नहीं होगी, सभी कुंजियों को सूचीबद्ध करें जो किसी दिए गए उपसर्ग से मेल खाते हैं , लेकिन खोजने के लिए अच्छा है क्या कोई कुंजी मौजूद है या तीनों में नहीं। फिर भी, पेट्रीसिया ट्री या पेट्रीसिया ट्राई शब्द का उपयोग तब से किया गया है, जिसका उपयोग कई अलग-अलग लेकिन समान इंद्रियों में किया जाता है, जैसे कि, एक कॉम्पैक्ट तिकड़ी [NIST] को इंगित करने के लिए, या मूलांक दो के साथ एक मूलांक तीन को इंगित करने के लिए - जैसा कि सूक्ष्म रूप में इंगित किया गया है। WIKI में रास्ता] और इसी तरह।
एक रेडिक्स ट्राई नहीं हो सकता है कि ट्राइ:
टर्नरी सर्च ट्राइ (उर्फ टर्नेरी सर्च ट्री) को अक्सर संक्षिप्त रूप में TST के रूप में जाना जाता है ( जे। बेंटले और आर। सेडगविक द्वारा प्रस्तावित ) जो तीन-तरफा शाखाओं के साथ एक ट्राइ के समान दिखता है। इस तरह के पेड़ के लिए, प्रत्येक नोड में एक विशेषता वर्णमाला 'x' होती है, ताकि ब्रांचिंग निर्णय से प्रेरित हो कि क्या एक कुंजी का चरित्र 'x' के बराबर या उससे अधिक है। इस फिक्स्ड 3-वे ब्रांचिंग फ़ीचर के कारण, यह ट्राइ के लिए एक मेमोरी-कुशल विकल्प प्रदान करता है, खासकर जब R (मूलांक) बहुत बड़ा होता है जैसे कि यूनिकोड अक्षर के लिए। दिलचस्प है, टीएसटी, (आर-वे) ट्राइ के विपरीत, आर से प्रभावित इसकी विशेषताएं नहीं हैं। उदाहरण के लिए, टीएसटी के लिए खोज मिस है ln (N) हैविरोध के रूप में आर-ट्राइ के लिए लॉग आर (एन) का विरोध किया । TST के मेमोरी आवश्यकताओं, के विपरीत आर रास्ता trie है नहीं के रूप में अच्छी तरह से अनुसंधान के एक समारोह। इसलिए हमें एक TST को मूलांक-त्रिक कहने के लिए सावधान रहना चाहिए। मैं, व्यक्तिगत रूप से, यह नहीं सोचता कि हमें इसे मूलांक-त्रिक कहना चाहिए क्योंकि इसकी विशेषताओं में से कोई भी (जहाँ तक मुझे पता है) इसके अंतर्निहित वर्णमाला के मूलांक, आर से प्रभावित है।
uintptr_t
अपने पूर्णांक के रूप में भी उपयोग कर सकते हैं , क्योंकि ऐसा लगता है कि आम तौर पर मौजूद होने की उम्मीद है (हालांकि आवश्यक नहीं)।
radix-tree
बजाय टैग हैradix-trie
? इसके साथ टैग किए गए कुछ सवाल भी हैं।