【问题标题】:Searching for a set of Strings contain a particular string from ArrayList in Java在 Java 中搜索一组包含来自 ArrayList 的特定字符串的字符串
【发布时间】:2014-02-02 00:35:15
【问题描述】:

是否有任何快速算法可以在字符串的 Arraylist 中搜索特定字符串?

例如:

我有一个数组列表:

{"white house","yellow house","black door","house in heaven","wife"}

并且想要搜索包含“house”的字符串。 它应该在最短的时间内返回{"white house","yellow house","house in heaven"}。 我的意思是我的问题是处理没有索引的大数据(大约 167000 个字符串的列表)。

谢谢!

【问题讨论】:

  • " 但在最短的时间内" 无论你做什么,这将是 O(n)
  • 真正加快速度的唯一方法是按字符数或最大单词对列表进行排序。然后,您可以忽略所有字符较少的字符串,例如“wife”。否则,你真的做不了什么。您可以更快地搜索数字列表的唯一原因是它们很容易排序。没有简单的方法来订购您的清单。
  • @BobbyD17 我敢打赌我可以用线程池加速它;)(这不会改变复杂性,请注意)

标签: java string search arraylist


【解决方案1】:

您的问题有两个答案,具体取决于您是否计划运行多个查询:

  • 如果您只需要运行一次查询,那您就不走运了:您必须从头到尾搜索整个数组。
  • 如果您需要运行大量查询,可以通过构建索引来减少工作量。

制作一个数据结构Map<String,List<String>>,遍历List<String>中的字符串,并将它们拆分成单词。对于标记列表中的每个单词,将原始字符串添加到相应的列表中。

此操作在O(N*W) 中运行,其中N 是长字符串的数量,W 是每个字符串的平均单词数。有了这样的地图,您可以在O(1) 中运行查询。

请注意,只有当查询数量显着超过每个字符串中的平均单词数时,这种方法才会奏效。例如,如果您的字符串平均有 10 个单词,并且您需要运行 5 到 8 个查询,那么线性搜索会更快。

【讨论】:

  • 谢谢,我终于索引了arraylist进行搜索。
【解决方案2】:

我同意乔什·恩格斯玛的观点。迭代列表并一一检查是最简单的方法。而 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}
...

这意味着“房子”包含在列表的第 0,1 和 3 个元素中,依此类推。索引可以用HashMap实现:

Map<String, LinkedList<Integer>> = new HashMap<String, LinkedList<Integer>>();

理想情况下,搜索操作将加速到 O(1) 复杂度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多