【发布时间】:2014-09-14 23:25:24
【问题描述】:
我有以下方式指定的数据:
<type:id> <relevance-score> <data>
例如:
a:1 0.8 "This is a post by PhD"
a:2 0.9 "Current rep of PhD is 3,800+"
b:1 1.0 "Pikl F'Nandez is not an existing user on stackoverflow"
c:2 1.0 "AJAX is a tag on stackoverflow"
...
假设将这些值放入哈希图中,这样:
key = (<type:id>) | value = (<relevance-score>,<data>)
现在,如果要搜索关键字PhD,可以在哈希图中的两个条目中找到它。我希望按相关性分数的降序检索与查询字符串匹配的所有键:
Example output: a:2, a:1
查询字符串也可以是Pikl 或Pikl F 或Pikl F'n,这意味着字符串匹配算法是进行搜索的最佳方式。
当前方法:对哈希图中的所有值使用 Boyer-Moore 算法,并将结果数据存储到最大堆中(根据相关性得分)。
时间复杂度:
- 博耶-摩尔:
O(m+n) - 总计,对于每个值
O(q(m+n))其中q: # of keys in hashmap - 还需要添加从堆中弹出的值。假设
O(s)其中s是匹配数。由于s << q我们可以说上述(搜索)是主要成本。
问题:这是最有效的吗?有什么可以更有效的吗?其他数据结构/算法,我可能没有考虑过?
【问题讨论】:
-
Boyer-Moore 是正确的工具吗?它通过预处理一个正在寻找的模式而不是正在搜索的目标字符串来工作。在这里给你带来什么?
-
不确定。我只用它来匹配字符串。一种天真的方法开始。想知道是否有更有效的做事方式?你有什么建议?
-
我们在谈论多少个数据项?另外,是否可以将其存储在具有良好文本搜索能力的 dbms 中?
-
轻松达到 100,000。这一切都必须“在内存中”才能更快地访问。所以想想从头开始设计这样的能力,上面的方法就是这样的想法。
标签: java performance algorithm data-structures time-complexity