Saya prihatin dengan pertanyaan waktu berjalan asimtotik dari algoritma Ukkonen , mungkin algoritma yang paling populer untuk membangun pohon sufiks dalam waktu linear (?).
Berikut ini adalah kutipan dari buku "Algoritma pada string, pohon dan urutan" oleh Dan Gusfield (bagian 6.5.1):
"... Algoritma Aho-Corasick, Weiner, Ukkonen , dan McCreight semuanya membutuhkan ruang , atau batas waktu harus diganti dengan minimum dan ".
[ adalah panjang string dan adalah ukuran alfabet]
Saya tidak mengerti mengapa itu benar.
- Spasi: baik, jika kita mewakili cabang dari node menggunakan array ukuran , maka, memang, kita berakhir dengan penggunaan ruang . Namun, sejauh yang saya bisa lihat, juga dimungkinkan untuk menyimpan cabang menggunakan tabel hash (katakanlah, kamus dengan Python). Kami kemudian hanya memiliki pointer yang disimpan di semua tabel hash sekaligus (karena ada tepi di pohon), sementara masih dapat mengakses node anak-anak dalam waktu , secepat seperti saat menggunakan array.
- Waktu : seperti yang disebutkan di atas, menggunakan tabel hash memungkinkan kita untuk mengakses cabang keluar dari sembarang simpul dalam waktu . Karena algoritma Ukkonen membutuhkan operasi (termasuk mengakses node anak-anak), keseluruhan waktu berjalan kemudian juga akan menjadi .
Saya akan sangat berterima kasih kepada Anda untuk setiap petunjuk tentang mengapa saya salah dalam kesimpulan saya dan mengapa Gusfield benar tentang ketergantungan algoritma Ukkonen pada alfabet.
algorithms
data-structures
algorithm-analysis
strings
Mikhail Dubov
sumber
sumber
Jawaban:
Terlebih lagi, dalam praktiknya waktu untuk menyiapkan semua tabel hash ini akan jauh lebih tinggi daripada waktu untuk mengatur array.
Anda mungkin lebih baik menggunakan tabel hash global yang diindeks dengan (node, karakter) -pairs, tetapi setidaknya argumen "hanya diamortisasi" akan tetap ada.
sumber