Saya tertarik dengan percobaan dan DAWGs (grafik kata asiklik langsung) dan saya telah banyak membaca tentang mereka tetapi saya tidak mengerti seperti apa seharusnya tampilan trie keluaran atau file DAWG.
- Haruskah trie menjadi objek kamus bertingkat? Dimana setiap huruf dibagi menjadi huruf dan seterusnya?
- Apakah pencarian yang dilakukan pada kamus seperti itu akan cepat jika ada 100k atau 500k entri?
- Bagaimana menerapkan blok kata yang terdiri dari lebih dari satu kata yang dipisahkan dengan
-
spasi? - Bagaimana cara menghubungkan prefiks atau sufiks sebuah kata ke bagian lain dalam struktur? (untuk DAWG)
Saya ingin memahami struktur keluaran terbaik untuk mengetahui cara membuat dan menggunakannya.
Saya juga akan menghargai apa yang seharusnya menjadi output dari DAWG bersama dengan trie .
Saya tidak ingin melihat representasi grafis dengan gelembung yang terhubung satu sama lain, saya ingin mengetahui objek keluaran setelah sekumpulan kata diubah menjadi percobaan atau DAWG.
Jawaban:
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: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 versiget
yang juga memperbarui kamus.)Selanjutnya, fungsi untuk menguji apakah kata tersebut ada di trie:
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.
sumber
dict.setdefault()
(ini kurang dimanfaatkan dan hampir tidak cukup terkenal), sebagian karena membantu mencegah bug yang terlalu mudah dibuat dengandefaultdict
(di mana Anda tidak akan mendapatkanKeyError
kunci yang tidak ada untuk pengindeksan). Satu-satunya hal sekarang yang membuatnya dapat digunakan untuk kode produksi adalah menggunakan_end = object()
:-)Lihatlah ini:
https://github.com/kmike/marisa-trie
Berikut adalah entri blog dari perusahaan yang berhasil menggunakan marisa trie:
https://www.repustate.com/blog/sharing-large-data-structure-across-processes-python/
Ada juga beberapa implementasi pure-python, meskipun kecuali Anda menggunakan platform terbatas, Anda ingin menggunakan implementasi yang didukung C ++ di atas untuk performa terbaik:
sumber
Berikut adalah daftar paket python yang menerapkan Trie:
sumber
Dimodifikasi dari
senderle
metode (di atas). Saya menemukan bahwa Pythondefaultdict
sangat ideal untuk membuat pohon trie atau prefiks.sumber
Tidak ada "seharusnya"; terserah kamu. Berbagai implementasi akan memiliki karakteristik kinerja yang berbeda, membutuhkan waktu yang berbeda-beda untuk diterapkan, dipahami, dan dilakukan dengan benar. Ini tipikal untuk pengembangan perangkat lunak secara keseluruhan, menurut saya.
Saya mungkin pertama-tama akan mencoba memiliki daftar global dari semua node trie yang sejauh ini dibuat, dan mewakili anak-pointer di setiap node sebagai daftar indeks ke dalam daftar global. Memiliki kamus hanya untuk mewakili anak yang menghubungkan terasa terlalu berat, bagi saya.
sumber
Jika Anda ingin TRIE diimplementasikan sebagai kelas Python, berikut adalah sesuatu yang saya tulis setelah membaca tentang mereka:
sumber
Versi ini menggunakan rekursi
Keluaran:
sumber
Tentukan Trie:
Buat Percobaan:
Menengadah:
Uji:
sumber
True
hanya untuk seluruh kata, tetapi tidak untuk awalan, untuk perubahan awalanreturn '_end' in curr
menjadireturn True
Di luar
sumber
Kelas Python untuk Trie
Trie Data Structure dapat digunakan untuk menyimpan data
O(L)
dimana L adalah panjang string sehingga untuk penyisipan N string kompleksitas waktu akanO(NL)
string dapat dicariO(L)
hanya dengan cara yang sama untuk penghapusan.Dapat di-clone dari https://github.com/Parikshit22/pytrie.git
Kode Oputpt
Benar
Salah
['minakshi', 'minhaj']
7
minakshi
minhajsir
pari
parikesit
shubh
shubham
shubhi
sumber