Java 在数组中搜索特定字符串

Java 在数组中搜索特定字符串,java,arrays,string,performance,algorithm,Java,Arrays,String,Performance,Algorithm,我想知道检查字符串数组中是否存在单词的最快方法/算法是什么。例如,如果我有一个包含10000个元素的字符串数组,我想知道它是否有单词“Human”。我可以对数组进行排序,没问题 但是,不允许进行二进制搜索(Arrays.binarySearch())。不允许使用其他集合类型,如HashSet、HashMap和ArrayList 有没有经过验证的算法?还是其他方法?搜索的方式应该非常快。最快的排序方式将导致O(nLogn)复杂性 因此,如果要在无序数据中查找特定单词,只需使用single for

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

但是,不允许进行二进制搜索(
Arrays.binarySearch()
)。不允许使用其他集合类型,如
HashSet
HashMap
ArrayList


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

最快的排序方式将导致O(nLogn)复杂性
因此,如果要在无序数据中查找特定单词,只需使用single for cycle扫描数组,这将花费O(n)

要获得最快的性能,您必须使用哈希。
您可以使用。
它确保了更少的碰撞次数

hash = [0]*base^(n-1) + [1]*base^(n-2) + ... + [n-1]   
其中
base
是一个素数,比如
31

您还需要取模,这样整数范围就不会被一个
素数所超出

时间复杂度:
O(字符数)
考虑乘法和模运算
O(1)
运算


这里给出了一个很好的解释:

从数组中构建一个。它可以在线性时间内构建(假设字母表大小不变)。然后,您还可以使用线性时间进行查询(时间与查询字长成比例)。预处理和查询时间都是渐近最优的。

是不允许的二进制搜索,还是仅仅使用它的库实现?类似地,您可以使用自己的散列数据结构吗?@PatriciaShanahan:嗨,您是说HashMap吗?@PatriciaShanahan:我的话已经散列了。也就是说,我有3个字符的格式。例如,“宇航员”一词将是“!2#”不,我的意思是自己实现一个散列数据结构,而不依赖于现有的库实现。
这将花费你O(n*单词长度)
。。。非常昂贵。单词的长度本质上不是一个变量,所以从渐近符号O(n)=O(10000000000*n)@VilenMelkumyan来看,它当然是一个变量。我很容易想象字典的字号是无限的,但我想这取决于你的数据和你如何查看它,一般来说,如果你有一个字符串数组,那么肯定有一个字符串具有最大长度,所以单词的长度是有界的。如果字符串数组不同,您是对的。+1用于显示此值。创建trie的成本是一次性的吗?比如,如果我想在已经创建的trie中添加一组单词,它会再次搜索该特定节点并添加到该节点中,还是创建一个新的trie?@bgth是的,您可以通过该算法直接在trie中插入和删除。那里的运行时也是线性的(最优的),因此,如果您最初从一个空的trie开始,然后一个接一个地添加单词,那么总体上仍然会得到线性时间,但是它是否是查找整个字符串的正确工具,而不是最接近的拟合?它还会不会为上面的所有节点抛出匹配项?比如,如果你正在搜索“哼哼”,它会不会抛出匹配“哼哼”和“呼玛”以及“人类”和“人道主义”?@bgth:你会走到代表字符串“人类”的节点。然后检查它是否有一个布尔标记,上面写着“一个输入字由这个节点表示”。老实说,我不认为有什么问题。从算法的角度来看,它绝对是正确的工具,因为它具有最佳的运行时边界。它在实践中也非常快(但可能没有基于哈希的方法快,因为缓存未命中)。你能给我指一本书,里面有关于这个和其他算法的详细信息吗?