在Java中搜索包含ArrayList中特定字符串的字符串集
是否有任何快速算法可以在字符串数组列表中搜索特定字符串 例如: 我有一个Arraylist:在Java中搜索包含ArrayList中特定字符串的字符串集,java,string,search,arraylist,Java,String,Search,Arraylist,是否有任何快速算法可以在字符串数组列表中搜索特定字符串 例如: 我有一个Arraylist: {"white house","yellow house","black door","house in heaven","wife"} 并希望搜索包含“house”的字符串。 它应该返回{“白宫”、“黄房子”、“天堂之家”},但必须在最短的时间内返回。 我的意思是,我的问题是处理没有索引的大数据(大约167000个字符串的列表) 谢谢 根据您是否计划运行多个查询,您的问题有两个答案: 如果只需要运
{"white house","yellow house","black door","house in heaven","wife"}
并希望搜索包含“house”的字符串。
它应该返回{“白宫”、“黄房子”、“天堂之家”}
,但必须在最短的时间内返回。
我的意思是,我的问题是处理没有索引的大数据(大约167000个字符串的列表)
谢谢 根据您是否计划运行多个查询,您的问题有两个答案:
- 如果只需要运行一次查询,那就太倒霉了:必须从头到尾搜索整个数组
- 如果需要运行大量查询,可以通过构建索引来减少工作量
映射图
,浏览列表中的字符串
,并将它们拆分为单词。对于令牌列表中的每个单词,将原始字符串添加到相应的列表中
此操作在O(N*W)
中运行,其中N
是长字符串的数量,W
是每个字符串的平均字数。有了这样的映射,您可以在O(1)
中运行查询
请注意,只有当查询数量显著超过每个字符串中的平均字数时,这种方法才有回报。例如,如果字符串平均有十个单词,并且需要运行五到八个查询,那么线性搜索会更快。我同意Josh Engelsma的观点。迭代列表并逐个检查是最简单的方法。167000并不是一个很大的数据,除非列表中的每个字符串都很长。在普通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}
...
这意味着“房子”包含在列表的第0、1和3个元素中,依此类推。可以使用HashMap实现索引:
Map<String, LinkedList<Integer>> = new HashMap<String, LinkedList<Integer>>();
Map=newhashmap();
理想情况下,搜索操作的复杂度将提高到O(1)。“但在最短的时间内”无论你做什么,这都将是O(n)。真正提高搜索速度的唯一方法是按字符数或最大单词对列表进行排序。然后你可以忽略所有字符较少的字符串,比如“妻子”。否则,你真的做不了什么。您可以更快地搜索数字列表的唯一原因是它们很容易排序。没有简单的方法来排序列表。@BobbyD17我打赌我可以用线程池来加速排序;)(请注意,这不会改变复杂性)谢谢,最后我为arraylist编制了索引以进行搜索。