我有一个包含单词列表的字典,我有一个字符串URL。我希望在使用分隔符将URL分解为令牌后找到URL中包含的所有单词。现在,我正在测试字典中的每个单词,对应大于一定数量的每个标记(使用java&#39s的String包含函数)。例如,我搜索像" ground"在wunderground中www.wunderground.com
我相信有更有效的方法可以做到这一点。有什么想法吗?
答案 0 :(得分:1)
如果你将字典加载到HashMap中,你可以测试每个候选子字符串(" wunderground","地下"," nderground"," derground",...," wundergroun",...,"",..." ground",...)很快,具体而言,在O(1)时间内。
衡量效率:弄清楚它需要执行多少步骤。我们估计它的大O复杂性。
您当前的算法必须遍历整个字典:与字典大小成比例,D条目)。对于每个字典单词,它调用contains()
:与URL字的大小成比例,C chars,减去平均字典单词大小,我们将调用5.这样就采用D的顺序*(C - 5)步骤,O(D *(C - 5)),用于URL中的每个单词。
构建哈希表后,查找的开销与条目数无关。 C chars的每个URL术语都有C 2 子串。如果你将它修剪成至少5个字符的子串,那个(C - 5) 2 子串。 [嗯,技术上它(C - 5)*(C - 4)/ 2,但我们正在计算渐近复杂度,这是大图近似。]所以看到它们的成本字典是(C - 5) 2 步骤。同样,这是URL中每个单词的内容,与字典大小无关。
我们假设您的词典有10,000个条目,平均URL长度为10个字符。然后旧算法每个URL术语 50,000步骤,而哈希算法每个URL术语 25步。有意义吗?