我一直在寻找有效的String trie实现。通常,我发现这样的代码:
我不喜欢这些实现主要有两个原因:
- 它们仅支持256个ASCII字符。我需要介绍西里尔字母。
- 它们的内存效率极低。
每个节点包含256个引用的数组,在Java的64位计算机上为4096字节。这些节点中的每个节点最多可以具有256个子节点,每个子节点具有4096字节的引用。因此,每个ASCII 2字符串的完整Trie要求超过1MB。三个字符串?256MB仅用于节点中的阵列。等等。
当然,我不打算在Trie中使用全部1600万个三个字符串,因此浪费了很多空间。这些数组中的大多数只是空引用,因为它们的容量远远超过了插入键的实际数量。而且,如果我添加unicode,数组会更大(char具有64k值,而不是Java中的256)。
有没有希望对字符串进行有效的尝试?我考虑了对这些类型的实现的一些改进:
- 除了使用引用数组之外,我还可以使用原始整数类型的数组,该数组将对大小与实际节点数接近的节点的引用数组进行索引。
- 我可以将字符串分成4位部分,这将允许以更大的树为代价允许大小为16的节点数组。