Saya telah mencari implementasi String trie yang efisien. Sebagian besar saya telah menemukan kode seperti ini:
Implementasi referensial di Jawa (per wikipedia)
Saya tidak menyukai implementasi ini karena sebagian besar dua alasan:
- Mereka hanya mendukung 256 karakter ASCII. Saya perlu membahas hal-hal seperti cyrillic.
- Mereka sangat tidak efisien memori.
Setiap node berisi array 256 referensi, yaitu 4096 byte pada mesin 64 bit di Jawa. Masing-masing node dapat memiliki hingga 256 subnode dengan masing-masing 4096 byte referensi. Jadi Trie lengkap untuk setiap string karakter ASCII 2 akan membutuhkan sedikit lebih dari 1MB. Tiga string karakter? 256MB hanya untuk array dalam node. Dan seterusnya.
Tentu saja saya tidak berniat untuk memiliki semua 16 juta tiga karakter string dalam Trie saya, jadi banyak ruang yang terbuang sia-sia. Sebagian besar array ini hanyalah referensi nol karena kapasitasnya jauh melebihi jumlah sebenarnya dari kunci yang dimasukkan. Dan jika saya menambahkan unicode, array menjadi lebih besar (char memiliki nilai 64k bukannya 256 di Java).
Apakah ada harapan membuat trie yang efisien untuk string? Saya telah mempertimbangkan beberapa peningkatan atas jenis implementasi ini:
- Alih-alih menggunakan array referensi, saya bisa menggunakan array tipe integer primitif, yang mengindeks menjadi array referensi ke node yang ukurannya dekat dengan jumlah node aktual.
- Saya dapat memecah string menjadi 4 bagian bit yang akan memungkinkan untuk array node ukuran 16 dengan biaya pohon yang lebih dalam.
jika Anda menyandikan string ke UTF8 Anda dapat menggunakan trie bercabang 256 standar dan masih kompatibel dengan unicode
Anda juga harus mencatat bahwa hanya sekitar 70 karakter dari kemungkinan 128 karakter ascii (yang semuanya dikodekan ke 1 byte dalam UTF8) akan ditemukan paling banyak yang dapat Anda optimalkan untuk itu (seperti menyertakan digraf umum di tempat karakter kontrol yang tidak digunakan) )
sumber
byte*
untuk mengkodekan semua jenis dalam trie bitwise.