Bagaimana runtime dari algoritma Ukkonen tergantung pada ukuran alfabet?

19

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 Θ(m|Σ|) , atau batas waktu O(m) harus diganti dengan minimum O(mlogm) dan O(mlog|Σ|) ".

[ m 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.Θ(|Σ|)Θ(m|Σ|)Θ(m)Θ(m)O(1)
  • 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 .O(1)O(m)O(m)

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.

Mikhail Dubov
sumber
3
Saya tidak berpikir ada bukti yang menyatakan bahwa waktu / ruang bebas ukuran alfabet tidak mungkin. Saya percaya Gusfield membuat pernyataan itu karena tidak ada metode yang diketahui untuk membuang waktu yang terikat sepenuhnya. Untuk membuat satu, Anda harus menguraikan fungsi hash Anda secara lebih rinci. Kasus terburuk O (1) yang benar-benar terikat untuk pencarian hash membutuhkan hash yang sempurna. Tidak jelas bagi saya bagaimana melakukan ini selama algoritma (karena entri hash tidak statis pada saat itu).
jogojapan
(lanjutan) Anda bisa melakukannya setelah pohon selesai, tetapi kemudian batas waktu untuk algoritma itu sendiri masih tidak akan berubah. (+1 untuk pertanyaan.)
jogojapan
1
Konteks yang berguna: Algoritma
Ukkonen

Jawaban:

2

O(1)O(1)Ω(Σ)Θ(mΣ)

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.

FrankW
sumber