我按以下方式指定数据:
<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"
...
假设这些值放在一个hashmap中,使得:
key = (<type:id>) | value = (<relevance-score>,<data>)
现在,如果要搜索关键字PhD
,可以在hashmap中的两个条目中找到它。我希望按相关性分数的降序检索与查询字符串匹配的所有密钥:
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
我们可以说上述(搜索)是主要成本。问题:这是最有效的吗?还有什么能更有效率的吗?其他数据结构/算法也许,我可能没想过?
答案 0 :(得分:1)
您当前的方法基本归结为:
唯一的区别是您在执行1时执行2,但结果时间复杂度相同。
即使我们假设每个字符串搜索的时间为O(1)
,字符串搜索的总时间也会变为O(q)
,排序时间为O(slog(s))
。自s << q
起,声称O(slog(s)) < O(q)
是合理的。换句话说,字符串搜索所用的时间总是占主导地位。
我能想到的实现有意义加速的唯一方法是预处理所有数据,以便每次字符串搜索所花费的时间确实变得更接近O(1)
。如果保证查询字符串是单词列表而不是随机子字符串,这将更容易。但是,如果Pikl F'n
等查询字符串成为可能,则数据的预处理将非常困难。实质上,如果您有关于可能获得的查询字符串类型的任何信息,您可以相应地预处理数据以便更快地搜索。