Bersantai pada dasarnya benar bahwa ada banyak cara berbeda untuk menerapkan trie; dan untuk percobaan yang besar dan dapat diskalakan, kamus bertingkat mungkin menjadi rumit - atau setidaknya tidak efisien ruang. Tetapi karena Anda baru saja memulai, saya pikir itu pendekatan yang paling mudah; Anda bisa membuat kode sederhana trie
hanya dalam beberapa baris. Pertama, fungsi untuk membangun 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_'}}}}
Jika Anda tidak terbiasa setdefault
, itu hanya mencari kunci dalam kamus (di sini, letter
atau _end
). Jika kunci ada, ia mengembalikan nilai terkait; jika tidak, itu memberikan nilai default ke kunci itu dan mengembalikan nilai ( {}
atau _end
). (Ini seperti versi get
yang juga memperbarui kamus.)
Selanjutnya, fungsi untuk menguji apakah kata tersebut ada di trie:
>>> 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
Saya akan menyerahkan penyisipan dan pemindahan kepada Anda sebagai latihan.
Tentu saja, saran Unwind tidak akan jauh lebih sulit. Mungkin ada sedikit kerugian kecepatan dalam menemukan sub-node yang benar akan membutuhkan pencarian linier. Tetapi pencarian akan dibatasi pada jumlah karakter yang memungkinkan - 27 jika kita memasukkannya _end
. Juga, tidak ada yang bisa diperoleh dengan membuat daftar node yang besar dan mengaksesnya dengan indeks seperti yang dia sarankan; Anda mungkin juga hanya menyusun daftar.
Terakhir, saya akan menambahkan bahwa membuat grafik kata asiklik terarah (DAWG) akan sedikit lebih rumit, karena Anda harus mendeteksi situasi di mana kata Anda saat ini berbagi sufiks dengan kata lain dalam struktur. Nyatanya, ini bisa menjadi agak rumit, bergantung pada bagaimana Anda ingin menyusun DAWG! Anda mungkin harus mempelajari beberapa hal tentang jarak Levenshtein untuk melakukannya dengan benar.