是否有任何快速算法在String的Arraylist中搜索特定字符串?
例如:
我有一个Arraylist:
{"white house","yellow house","black door","house in heaven","wife"}
想要搜索包含" house"的字符串。
它应该在最短的时间内返回{"white house","yellow house","house in heaven"}
。
我的意思是我的问题是处理没有索引的大数据(大约167000个字符串的列表)。
谢谢!
答案 0 :(得分:1)
您的问题有两个答案,具体取决于您是否计划运行多个查询:
制作数据结构Map<String,List<String>>
,浏览List<String>
中的字符串,然后将其拆分为单词。对于令牌列表中的每个单词,将原始字符串添加到相应的列表中。
此操作在O(N*W)
中运行,其中N
是长字符串的数量,W
是每个字符串的平均字数。有了这样的地图,您可以在O(1)
中运行查询。
请注意,只有当查询数量明显超过每个字符串中的平均字数时,此方法才会获得回报。例如,如果您的字符串平均有10个单词,并且您需要运行5到8个查询,则线性搜索会更快。
答案 1 :(得分:1)
我同意Josh Engelsma的观点。迭代列表并逐个检查是最简单的方法。并且167000实际上不是一个非常大的数据,除非List中的每个String都很长。衬垫搜索算法可以在普通PC中仅几秒完成。
考虑编码约定,代码可能是这样的:
for(String s : list) {
if(s.contains.("house")) {
//do sth.
}
}
如果搜索将在具有不同关键字的同一列表上多次执行,则可以构建反向索引以加快搜索速度。
在你的例子中:
{"white house","yellow house","black door","house in heaven","wife"}
您可以预处理列表,将每个句子分成单词,并构建索引,如:
"house" --> {0,1,3}
"white" --> {0}
"yellow" --> {1}
...
表示“house”包含在列表的第0和第3个元素中,依此类推。索引可以使用HashMap实现:
Map<String, LinkedList<Integer>> = new HashMap<String, LinkedList<Integer>>();
理想情况下,搜索操作将加速到O(1)复杂度。