Java Unicode字符集的Trie
我必须将输入字符串与一组前缀进行匹配。匹配应该是最好的,这样如果同时存在Java Unicode字符集的Trie,java,regex,unicode,trie,Java,Regex,Unicode,Trie,我必须将输入字符串与一组前缀进行匹配。匹配应该是最好的,这样如果同时存在abcd*和abcde*,那么abcdef应该匹配abcde*。我用Trie来做这个。问题在于输入和前缀集中的字符可以是任何Unicode字符。因此,我们在一个简单的trie中拥有的子数组是不可能的(至少不会有足够的效率,因为数组的大小将非常大)。使用map而不是数组仍然是低效的。我应该如何着手解决这个问题呢?要构造trie,可以将Unicode字符串编码为UTF-8,然后用编码的字节序列构造trie。或者您可以使用代码点,
abcd*
和abcde*
,那么abcdef
应该匹配abcde*
。我用Trie来做这个。问题在于输入和前缀集中的字符可以是任何Unicode字符。因此,我们在一个简单的trie中拥有的子数组是不可能的(至少不会有足够的效率,因为数组的大小将非常大)。使用map而不是数组仍然是低效的。我应该如何着手解决这个问题呢?要构造trie,可以将Unicode字符串编码为UTF-8,然后用编码的字节序列构造trie。或者您可以使用代码点,并在节点中使用哈希映射。您必须对应用程序进行基准测试,以确定哪种方法最有效
但难题是如何确定两个字符串何时匹配
考虑一下café这个词
这可以表示为:A=
[U+0063U+0061U+0066U+0065U+0301]
(以e和一个组合重音结尾)但也作为
B=
[U+0063u+0061u+0066u+00E9]
(以组合形式结尾)
因此:
- 字符串是否应与前缀cafe匹配(无重音)?A以前缀开头,B不以前缀开头。但是,A和B都应该匹配前缀,或者不匹配,因为它们都表示同一个单词café
- 如果你的trie中有A,而你试图匹配B呢?它是同一个词,所以应该匹配吗?
→ 插入trie和匹配时,可能需要将字符串转换为相同的字符串 - 还有其他问题。在德语中,双s通常写为ß。ß和ss是否应该匹配
事情还在继续。决定两个Unicode字符串是否相等本身就是一个非常重要的问题。由您决定匹配的复杂程度,这取决于您的应用。我不确定是否正确理解了这个问题;使用unicode作为字符集会使问题变得更加困难吗?支持unicode(而不是ASCII)的问题是否是子数组所需的存储空间?对于简单的trie,我们使用该节点的字符为下一个节点引用编制索引。@Simon,是的。没错,一种可能是按位Trie。但是,我也想探索其他的选择。