Verimli bir String trie uygulaması arıyordum. Çoğunlukla böyle bir kod buldum:
Java'da referans uygulama (wikipedia başına)
Bu uygulamaları çoğunlukla iki nedenden dolayı beğenmiyorum:
- Yalnızca 256 ASCII karakteri destekler. Kiril gibi şeyleri kapsamam gerekiyor.
- Bunlar son derece bellek verimsizdir.
Her düğüm, Java'daki 64 bit makinede 4096 bayt olan 256 referanslık bir dizi içerir. Bu düğümlerin her biri, her biri 4096 bayt referansla 256 adede kadar alt düğüme sahip olabilir. Bu nedenle, her ASCII 2 karakter dizesi için tam bir Trie, 1MB'den biraz daha fazla gerektirir. Üç karakter dizesi? 256MB sadece düğümlerdeki diziler için. Ve bunun gibi.
Tabii ki Trie'mde 16 milyon üç karakter dizisinin hepsini istemiyorum, bu yüzden çok fazla alan boşa harcanıyor. Bu dizilerin çoğu, gerçek anahtarlar eklenen anahtar sayısını aştığından yalnızca boş referanslardır. Ve unicode eklersem, diziler daha da büyür (char, Java'da 256 yerine 64k değerlere sahiptir).
Teller için etkili bir üçlü yapma umudu var mı? Bu tür uygulamalar üzerinde birkaç iyileştirmeyi düşündüm:
- Referanslar dizisi kullanmak yerine, boyutu gerçek düğümlerin sayısına yakın olan düğümlere bir dizi başvuruyu indeksleyen bir dizi ilkel tamsayı türü kullanabilirim.
- Daha derin bir ağaç pahasına 16 boyutlu düğüm dizilerine izin verecek 4 bit parçalara dizeleri kırabilirim.