Algorithm 在字符串数组中查找字符串的最快算法?

Algorithm 在字符串数组中查找字符串的最快算法?,algorithm,Algorithm,这个问题仅仅是关于算法的。 在伪代码中是这样的: A = Array of strings; //let's say count(A) = N S = String to find; //let's say length(S) = M for (Index=0; Index<count(A); Index++) if (A[Index]==S) { print "First occurrence at index\x20"+Index; break; }

这个问题仅仅是关于算法的。 在伪代码中是这样的:

A = Array of strings; //let's say count(A)  = N
S = String to find;   //let's say length(S) = M

for (Index=0; Index<count(A); Index++)
  if (A[Index]==S) {
    print "First occurrence at index\x20"+Index;
    break;
  }
A=字符串数组//假设计数(A)=N
S=要查找的字符串//假设长度(s)=M

对于(Index=0;Index将字符串放入一个基于散列的集合中,并测试该集合中是否包含给定字符串。一旦建立了该集合,该集合将为您提供或多或少的恒定性能。

您可以将整个字符串数组转换为有限状态机,其中转换是字符串的字符,并放入最小的索引将产生状态的字符串排序为状态。这需要大量时间,可能会被视为索引。

您可以首先对字符串数组进行排序,这将花费O(m*nlogn)时间。排序后,您可以执行二进制搜索而不是线性搜索,这可以将总运行时间减少到O(m*logn)

这种方法的优点是很容易实现。例如,在Java中,只需两行代码即可实现:

Arrays.sort(A);
int index = Arrays.binarySearch(A, "S");
大多数实现都有O(log(n))来插入,O(log(n))来搜索


如果你的集合不是很大,并且你的值有一个很好的散列函数,那么基于散列的集合是一个更好的解决方案,因为在这种情况下,你需要插入O(1)和搜索O(1)。但是如果你的散列函数不好或者集合太大,则需要插入O(n)和O(n)搜索。

尽可能快地搜索的最佳方法是对数组进行排序 正如您所描述的,似乎没有可能的先验信息允许在搜索中使用一些启发式或约束

首先对数组进行排序(例如快速排序,O(NlogN)),
然后进行二进制搜索O(log(N))

如果要查找索引,请使用基于哈希的字符串字典->第一次出现。但我有点担心某些2项可能具有相同的哈希值。如果哈希值相等,您仍然需要进行最终比较。“当字符串S太长时”与此无关,除非
A
中有许多字符串具有相同的长度和相同的长前缀。(如果长度不同,字符串相等性检查可以立即终止,或者在遍历它们时发现不匹配时立即终止。)为什么使用
\x20
而不是空格?我很好奇:-)@LucM只是个人风格:)你如何定义最快的?最坏的情况?一般情况?多个搜索的平均性能?有几种有趣的字符串搜索算法,但没有一种是最快的。这包括字符串的处理吗?[f]lex可以帮助您构造此DFA。@Dougal感谢您的名字,但他不知道。二进制搜索之前的排序过程占用了大量时间,不是吗it@PaulDinh它需要O(M N log N)时间。@PaulDinh我认为在实践中时间是可以的。在最坏的情况下,它需要O(mn logn)时间。但是加载所有字符串需要MN时间,所以它只比IO长logN倍。在大多数情况下,logn非常小,可能比实际构建trie或哈希表还要快。如果您关心理论上的时间复杂性,那么构建trie或哈希表将花费O(MN)时间。