找到线性时间内两个序列之间的第一个元素匹配?

时间:2016-01-26 19:40:02

标签: string algorithm big-o time-complexity

假设我们有两个序列x = {x_i:i elem [1,M]}和y = {y_i:i elem [1,N]}带有有序字母表。是否有可能找到最小的(如果有的话)对(i,j),使得x_i = y_j?

平凡的O(n ^ 2)时间O(1)空间算法只需将两个序列中的每个元素进行比较,同时跟踪距序列起点的最小距离差异。

O(n log n)时间O(n)空间算法只对序列进行排序并进行比较,同时保持对最小/最大元素的跟踪。

我无法想到线性时间算法,但我不确定这个问题会被调用。

3 个答案:

答案 0 :(得分:1)

一种选择是建立一个大小为|Σ|的表,其中Σ是你的字母表,它将每个符号与它在字符串x中占据的第一个位置相关联。然后,您可以遍历x,并且对于每个字符,在表中的x中记录该字符的第一个位置。然后,您可以对字符串y进行传递,并且对于y的每个字符,请查阅该表以查找该字符第一次出现在字符串x中。你没有在你的问题中提到你如何定义“最小”对(词典顺序?最小化i + j?还有其他什么?),但是你应该能够生成所有可能的对,然后将它们中的最小对完成线性时间。

总的来说,这需要时间O(n + |Σ|)并使用空间O(|Σ|),所以如果你的字母表不是太大,这是非常快的。如果您的字母表很大,只需使用哈希表,这最终会在O(n)空间的O(n)时间内完成。

答案 1 :(得分:1)

首先,请注意可以在O(max{m,n}log(min{m,n}))中通过仅对较小的列表进行排序,并在迭代较大的列表时对其使用二进制搜索来完成。

此外,您可以使用哈希表将一个列表索引为x_i->min{j, x_j = x_i }对 - 这需要预期的线性时间和空间。
然后,简单地迭代另一个列表,在表中查找y_i,同时保持到目前为止找到的最小值。

这总计在O(n)空间和平均时间的情况下。

伪代码:

table = {}
for each element x_i in x in ascending order of i:
  if x_i is not in table:
    table[x_i] = i
best_pair = (-1,-1)
for each element y_j in y:
  if y_j in table:
    if (table[y_j],j) is "better" than best_pair:
      best_pair = (table[y_j], j)
return best_pair

我很确定它与element distinctness problem太相似,无法使用散列来克服Omega(nlogn)边界,但没有想到任何证据。

答案 2 :(得分:0)

O(n + m)算法:

  • 以i = 0和j = 0
  • 开头
  • 如果x [i]< y [j] i ++
  • 如果x [i]> y [j] j ++
  • 如果x [i] == y [j] =>你找到了它

显然,您还需要检查数组边界。