Java 如何高效地搜索hashmap中所有值的子字符串?
我有以下方式指定的数据:Java 如何高效地搜索hashmap中所有值的子字符串?,java,performance,algorithm,data-structures,time-complexity,Java,Performance,Algorithm,Data Structures,Time Complexity,我有以下方式指定的数据: <type:id> <relevance-score> <data> 假设将这些值放入hashmap中,以便: key = (<type:id>) | value = (<relevance-score>,<data>) 查询字符串也可以是Pikl或Pikl F或Pikl F'n,这意味着字符串匹配算法是进行搜索的最佳方式 当前方法:对hashmap中的所有值使用Boyer-Moore算法,并将
<type:id> <relevance-score> <data>
假设将这些值放入hashmap中,以便:
key = (<type:id>) | value = (<relevance-score>,<data>)
查询字符串也可以是Pikl
或Pikl F
或Pikl F'n
,这意味着字符串匹配算法是进行搜索的最佳方式
当前方法:对hashmap中的所有值使用Boyer-Moore算法,并将结果数据存储到最大堆中(根据相关性得分)
时间复杂性:
- 博耶·摩尔:
O(m+n)
- 总计,对于hashmap中键的每个值
其中O(q(m+n))
q:#
- 还需要添加从堆弹出的值。让我们假设
其中O(s)
是匹配数。由于s
s您当前的方法基本上归结为:
- 遍历所有数据并查找与搜索字符串匹配的数据
- 根据相关性得分对所有匹配数据执行堆排序
唯一的区别是执行1时执行2,但结果的时间复杂度是相同的
即使我们假设每个字符串搜索的时间是
,字符串搜索的总时间也是O(1)
,排序的时间是O(q)
。既然O(slog(s))
s,Boyer Moore是正确的工具吗?它的工作原理是预处理用户正在寻找的模式,而不是正在搜索的目标字符串。你在这里买什么?不确定。我只是用它来匹配字符串。一开始是一种幼稚的方法。想知道是否有更有效的做事方式?你有什么建议?我们讨论了多少数据项?此外,将其存储在具有良好文本搜索功能的dbms中是一种选择吗?最简单的方法是10万次。为了更快地访问,所有这些都必须“在内存中”。因此,考虑从头开始设计这样的功能,上述方法就是这样的“一个”想法。
key = (<type:id>) | value = (<relevance-score>,<data>)
Example output: a:2, a:1