我想知道在String
数组中检查单词是否存在的最快方法/算法是什么。举个例子,如果我有一个包含10,000个元素的String数组,我想知道它是否有“Human”这个词。我可以对数组进行排序,没问题。
但是,不允许二进制搜索(Arrays.binarySearch()
)。其他收集类型如HashSet
,HashMap
和ArrayList
也是不允许的。
有没有经过验证的算法?还是其他方法?搜索的方式应该非常快。
答案 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。它可以建立在线性时间内(假设字母表的大小恒定)。然后您也可以在线性时间内查询(与查询字长度成比例的时间)。预处理和查询时间都是渐近最优的。