Я шукав ефективну реалізацію String trie. Здебільшого я знайшов такий код:
Референційна реалізація на Java (за вікіпедією)
Мені не подобаються такі реалізації з двох причин:
- Вони підтримують лише 256 символів ASCII. Мені потрібно висвітлювати такі речі, як кирилиця.
- Вони надзвичайно малоефективні.
Кожен вузол містить масив з 256 посилань, що становить 4096 байт на 64-бітній машині в Java. Кожен з цих вузлів може мати до 256 підвузлів з 4096 байтами посилань кожен. Таким чином, повне Trie для кожного символьного рядка ASCII 2 вимагатиме трохи більше 1 Мб. Три символьні рядки? 256 Мб просто для масивів у вузлах. І так далі.
Звичайно, я не маю наміру мати в моєму Трі 16 мільйонів трьох рядків символів, тому багато місця просто витрачено. Більшість цих масивів є лише нульовими посиланнями, оскільки їх ємність значно перевищує фактичну кількість вставлених ключів. І якщо я додаю unicode, масиви стають ще більшими (char має 64k значення замість 256 у Java).
Чи є надія зробити ефективну трійку для струн? Я розглянув декілька вдосконалень щодо таких типів реалізацій:
- Замість використання масиву посилань я міг би використовувати масив примітивного цілого типу, який індексує масив посилань на вузли, розмір яких близький до кількості фактичних вузлів.
- Я міг би розбити рядки на 4 бітні частини, що дозволило б створити масиви вузлів розміром 16 ціною глибшого дерева.