Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Unicode字符集的Trie_Java_Regex_Unicode_Trie - Fatal编程技术网

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。但是,我也想探索其他的选择。