【发布时间】:2010-01-06 15:30:25
【问题描述】:
你好堆栈溢出的人。我想就以下问题提出一些建议。我正在使用 Java。
我有一个带有多个字符串的数组 #1。例如,其中两个字符串可能是:“一个苹果落在牛顿的头上”和“苹果长在树上”。
另一方面,我有另一个数组 #2,其中包含 (Fruits => Apple, Orange, Peach; Items => Pen, Book; ...) 之类的术语。我将这个数组称为我的“字典”。
通过将一个数组中的项目与另一个数组进行比较,我需要查看 #1 中的项目从 #2 属于哪个“类别”。例如。来自 #1 的两者都属于“水果”。
我最重要的考虑是速度。我需要快速完成这些操作。允许恒定时间检索的结构会很好。
我考虑了一个带有 contains() 方法的 Hashset,但它不允许子字符串。我还尝试在不区分大小写标志的情况下运行像 (apple|orange|peach|...etc) 这样的正则表达式,但我读到当术语数量增加时它不会很快(预计至少 200 个)。最后,我搜索并正在考虑使用带有 indexOf() 的 ArrayList,但我不知道它的性能。我还需要知道哪些术语实际匹配,所以在这种情况下,它将是“Apple”。
请提供您对此问题的看法、想法和建议。
我看到了 Aho-Corasick 算法,但关键字/术语很可能经常变化。所以我认为我不能使用它。哦,我不是文本挖掘和数学方面的专家,所以请详细说明复杂的概念。
感谢 Stack Overflow 的人们抽出宝贵时间! :)
【问题讨论】:
-
我已经检查了后缀树。它似乎类似于 Aho-Corasick 算法使用的 Trie 结构。我担心的是我有许多不同的类别,每个类别有很多术语。为每个类别构建一棵树对我来说似乎效率低下。谢谢马特K!
-
实际上,我认为您不需要为每个类别构建一棵树。您应该能够将多个字符串插入到单个后缀树中,并在每个有效字符串的树的终止点处添加对类别对象的引用。
-
这个想法很有趣!但我不明白您答案的“添加对类别对象的引用”部分。我该怎么做?
-
您将需要一些与树中的每个字符相关联的数据来指示树中的哪些字符串(如果有)以该字符终止。您可以将有关字符串所属的零个或多个类别的数据与其终止数据相关联。