আনওয়াইন্ড মূলত সঠিক যে ট্রাই বাস্তবায়নের বিভিন্ন উপায় রয়েছে; এবং একটি বৃহত, স্কেলেবল ট্রাইয়ের জন্য, নেস্টেড অভিধানগুলি জটিল হয়ে উঠতে পারে - বা কমপক্ষে স্থান অদক্ষ করে। তবে আপনি যেহেতু সবে শুরু করছেন, আমি মনে করি এটিই সবচেয়ে সহজ পদ্ধতির; আপনি 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
। এছাড়াও, নোডগুলির একটি বিশাল তালিকা তৈরি করে এবং সূচক অনুসারে সেগুলি অ্যাক্সেস করার মাধ্যমে তাঁর লাভের কিছুই নেই; আপনি পাশাপাশি তালিকাগুলি বাসাতে পারেন।
পরিশেষে, আমি যুক্ত করব যে একটি নির্দেশিত অ্যাসাইক্লিক শব্দ গ্রাফ তৈরি করা (ডিএডাব্লুজি) কিছুটা জটিল হবে, কারণ আপনার এমন পরিস্থিতি সনাক্ত করতে হবে যেখানে আপনার বর্তমান শব্দটি কাঠামোর অন্য একটি শব্দের সাথে একটি প্রত্যয় ভাগ করে দেয়। বাস্তবে, আপনি ডিএডাব্লুজি কীভাবে কাঠামো তৈরি করতে চান তার উপর নির্ভর করে এটি জটিল হয়ে উঠতে পারে! এটিকে সঠিক করার জন্য আপনাকে লেভেনস্টাইন দূরত্ব সম্পর্কে কিছু জিনিস শিখতে হতে পারে ।