【问题标题】:Trie for Unicode character set尝试 Unicode 字符集
【发布时间】:2015-10-04 11:05:19
【问题描述】:

我必须将输入字符串与一组前缀进行匹配。匹配应该是最好的,这样如果abcd*abcde* 都存在,那么abcdef 应该匹配abcde*。我为此使用 Trie。问题是输入和前缀集中的字符可以是任何 Unicode 字符。所以,我们在一个简单的 trie 中拥有的 children 数组是不可能的(至少不会足够有效,因为数组大小会非常大)。使用 map 而不是 array 仍然是低效的。我应该如何解决这个问题?

【问题讨论】:

  • 我不确定我是否正确理解了这个问题;使用 unicode 作为字符集如何使问题变得更难?
  • 支持 unicode(而不是 ASCII)的问题是子数组所需的存储空间吗?
  • 对于一个简单的 trie,我们使用该节点的字符索引下一个节点引用。
  • @Simon,是的。没错。
  • 一种可能性是按位特里。但是,我也想探索其他选择。

标签: java regex unicode trie


【解决方案1】:

要构造 trie,您可以将 Unicode 字符串编码为 UTF-8,然后使用编码的字节序列构造一个 trie。或者您可以使用代码点,并在您的节点中使用哈希映射。您必须对您的应用程序进行基准测试,以确定哪种方法最有效。

但难题是如何判断两个字符串何时匹配

考虑一下咖啡馆

这个词

这可以表示为:
A = [U+0063 U+0061 U+0066 U+0065 U+0301](以 e组合重音 结尾)
但也可以作为
B = [U+0063 U+0061 U+0066 U+00E9](以 é 结尾,组合形式)

所以:

  • 字符串是否应与前缀 cafe 匹配(无重音)? A 以该前缀开头,B 没有。然而,AB 应该要么都匹配前缀,要么不匹配,因为它们都代表同一个词 café

  • 如果你的 trie 中有 A 并且你试图匹配 B 怎么办?是同一个词,所以应该匹配吗?
    → 在插入 trie 和匹配时,您可能需要将字符串转换为相同的 normalized form

  • 还有其他问题。在德语中,双 s 通常写为 ß。 ßss 是否应该匹配?

然后继续。 判断两个 Unicode 字符串是否相等本身就是一个不小的问题。由您决定匹配的复杂程度,这取决于您的应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2018-08-03
    相关资源
    最近更新 更多