Tôi đã tìm kiếm một triển khai String trie hiệu quả. Hầu như tôi đã tìm thấy mã như thế này:
Triển khai tham chiếu trong Java (mỗi wikipedia)
Tôi không thích những triển khai này vì hai lý do:
- Họ chỉ hỗ trợ 256 ký tự ASCII. Tôi cần phải bao gồm những thứ như cyrillic.
- Chúng cực kỳ kém hiệu quả.
Mỗi nút chứa một mảng gồm 256 tham chiếu, là 4096 byte trên máy 64 bit trong Java. Mỗi nút này có thể có tối đa 256 mã con với 4096 byte tham chiếu mỗi nút. Vì vậy, một Trie đầy đủ cho mỗi chuỗi ký tự ASCII 2 sẽ yêu cầu hơn 1MB. Ba chuỗi ký tự? 256MB chỉ cho các mảng trong các nút. Và như thế.
Tất nhiên tôi không có ý định có tất cả 16 triệu ba chuỗi ký tự trong Trie của mình, vì vậy rất nhiều không gian bị lãng phí. Hầu hết các mảng này chỉ là các tham chiếu null vì dung lượng của chúng vượt xa số lượng các phím được chèn thực tế. Và nếu tôi thêm unicode, các mảng thậm chí còn lớn hơn (char có 64k giá trị thay vì 256 trong Java).
Có bất kỳ hy vọng để làm cho một trie hiệu quả cho chuỗi? Tôi đã xem xét một vài cải tiến đối với các loại triển khai này:
- Thay vì sử dụng mảng tham chiếu, tôi có thể sử dụng một mảng kiểu nguyên nguyên, chỉ mục thành một mảng tham chiếu đến các nút có kích thước gần bằng số nút thực tế.
- Tôi có thể chia các chuỗi thành 4 phần bit cho phép các mảng nút có kích thước 16 với chi phí của một cây sâu hơn.