अनवाइंड अनिवार्य रूप से सही है कि ट्राई को लागू करने के कई अलग-अलग तरीके हैं; और एक बड़े, स्केलेबल ट्राई के लिए, नेस्टेड डिक्शनरी बोझिल हो सकती हैं - या कम से कम जगह अक्षम हो सकती है। लेकिन जब से आप बस शुरू कर रहे हैं, मुझे लगता है कि यह सबसे आसान तरीका है; आप trie
बस कुछ ही पंक्तियों में एक सरल कोड कर सकते हैं। सबसे पहले, त्रि का निर्माण करने के लिए एक कार्य:
>>> _end = '_end_'
>>>
>>> def make_trie(*words):
... root = dict()
... for word in words:
... current_dict = root
... for letter in word:
... current_dict = current_dict.setdefault(letter, {})
... current_dict[_end] = _end
... return root
...
>>> make_trie('foo', 'bar', 'baz', 'barz')
{'b': {'a': {'r': {'_end_': '_end_', 'z': {'_end_': '_end_'}},
'z': {'_end_': '_end_'}}},
'f': {'o': {'o': {'_end_': '_end_'}}}}
यदि आप परिचित नहीं हैं setdefault
, तो यह केवल शब्दकोश में एक कुंजी दिखता है (यहाँ, letter
या _end
)। यदि कुंजी मौजूद है, तो यह संबद्ध मान लौटाता है; यदि नहीं, तो यह उस कुंजी को एक डिफ़ॉल्ट मान प्रदान करता है और मान ( {}
या _end
) वापस करता है । (यह get
उस संस्करण की तरह है जो शब्दकोश को भी अपडेट करता है।)
अगला, यह परीक्षण करने के लिए कि क्या शब्द त्रि में है:
>>> def in_trie(trie, word):
... current_dict = trie
... for letter in word:
... if letter not in current_dict:
... return False
... current_dict = current_dict[letter]
... return _end in current_dict
...
>>> in_trie(make_trie('foo', 'bar', 'baz', 'barz'), 'baz')
True
>>> in_trie(make_trie('foo', 'bar', 'baz', 'barz'), 'barz')
True
>>> in_trie(make_trie('foo', 'bar', 'baz', 'barz'), 'barzz')
False
>>> in_trie(make_trie('foo', 'bar', 'baz', 'barz'), 'bart')
False
>>> in_trie(make_trie('foo', 'bar', 'baz', 'barz'), 'ba')
False
मैं एक अभ्यास के रूप में आपके लिए प्रविष्टि और निष्कासन छोड़ दूंगा।
बेशक, अनविंड का सुझाव ज्यादा कठिन नहीं होगा। इसमें थोड़ी गति का नुकसान हो सकता है जिसमें सही उप-नोड को खोजने के लिए एक रैखिक खोज की आवश्यकता होगी। लेकिन खोज संभव पात्रों की संख्या तक सीमित होगी - यदि हम शामिल करते हैं तो 27 _end
। इसके अलावा, नोड्स की एक विशाल सूची बनाने और इंडेक्स द्वारा उन्हें एक्सेस करने से कुछ भी हासिल होने वाला नहीं है, जैसा कि वह सुझाव देता है; आप सूची को केवल घोंसला बना सकते हैं।
अंत में, मैं यह जोड़ूंगा कि एक निर्देशित एसाइक्लिक शब्द ग्राफ (DAWG) बनाना थोड़ा अधिक जटिल होगा, क्योंकि आपको उन स्थितियों का पता लगाना होगा, जिसमें आपका वर्तमान शब्द संरचना में दूसरे शब्द के साथ एक प्रत्यय साझा करता है। वास्तव में, यह बल्कि जटिल हो सकता है, इस पर निर्भर करता है कि आप DAWG की संरचना कैसे करना चाहते हैं! आपको इसे ठीक करने के लिए लेवेंसहाइट दूरी के बारे में कुछ चीजें सीखनी पड़ सकती हैं ।