在数组中搜索特定的String

时间:2014-04-13 15:13:27

标签: java arrays string performance algorithm

我想知道在String数组中检查单词是否存在的最快方法/算法是什么。举个例子,如果我有一个包含10,000个元素的String数组,我想知道它是否有“Human”这个词。我可以对数组进行排序,没问题。

但是,不允许二进制搜索(Arrays.binarySearch())。其他收集类型如HashSetHashMapArrayList也是不允许的。

有没有经过验证的算法?还是其他方法?搜索的方式应该非常快。

3 个答案:

答案 0 :(得分:2)

您可以排序的最快方式将导致O(nLogn)复杂性 因此,如果您正在寻找无序数据中的特定单词,只需使用单个循环扫描数组,这将花费您O(n)

答案 1 :(得分:1)

为了获得最快的性能,您必须使用散列    您可以使用rolling hash 它确保较少数量的碰撞。

hash = [0]*base^(n-1) + [1]*base^(n-2) + ... + [n-1]   

其中base是素数,例如31

您还需要采用模数,因此prime number不会超出整数范围。

时间复杂度:O(number of characters)考虑乘法和模O(1)运算。

这里给出了非常好的解释:Fast implementation of Rolling hash

答案 2 :(得分:1)

从数组中构建trie。它可以建立在线性时间内(假设字母表的大小恒定)。然后您也可以在线性时间内查询(与查询字长度成比例的时间)。预处理和查询时间都是渐近最优的。