在Java中搜索排序列表中的字符串,并且可能是以字符串的一部分开头的所有字符串

时间:2011-06-13 18:58:45

标签: java algorithm

在Java的字符串排序列表中实现搜索字符串的最有效方法是什么?

那么搜索以字符串的一部分开头的所有字符串呢?

感谢您的帮助。

6 个答案:

答案 0 :(得分:3)

我认为您正在为这两项要求寻找Collections#binarySearch

答案 1 :(得分:1)

http://en.wikipedia.org/wiki/Binary_search假设您使用的是java.util.ArrayList或类似的非链接结构。

答案 2 :(得分:1)

要搜索非开头的字符串(例如'和'匹配'andrew','candy'和'sand'),你将不得不做蛮力。

对于字符串的开头,请使用BST。

答案 3 :(得分:1)

您可以使用Collections.binarySearch()

答案 4 :(得分:1)

列表确实不是正确的数据结构。首先,binarySearch在最好的情况下会对链接列表执行O(N) - 因为列表不支持随机访问,所以通过对其进行排序不会获得任何结果。

您要找的是trie。维基页面描述了它的优点以及它如何工作得足以让我不要浪费时间试图胜过它。虽然它没有描述优于排序的LinkedList的优点,但是请记住,插入到已排序的LinkedList中的是O(N)链接遍历和O(log n)元素比较,就像查找对象一样。 trie更有效,并且仍然支持从排序链表中获得的所有操作。

Google为支持该结构的库找到了几个结果,例如this one,但我没有使用过任何结果。 trie仍然是一个非常简单的数据结构(与例如AVL树相比),所以你可以很容易地自己实现它。

答案 5 :(得分:0)

  

uther.lightbringer死记硬背:

     

在Java的字符串排序列表中实现搜索字符串的最有效方法是什么?

正如其他已经提到的那样,您可以使用Collections.binarySearch(...)。确保您的列表已排序:否则您很可能无法获得正确的结果。

  

uther.lightbringer死记硬背:

     

那么搜索以字符串的一部分开头的所有字符串呢?

从头到尾遍历列表并检查每个单词,或创建(或从网上抓取)一个radix tree,它可以找到以某个(子)字符串开头的单词比循环结束快得多单词列表。