假设我们有两个序列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)空间算法只对序列进行排序并进行比较,同时保持对最小/最大元素的跟踪。
我无法想到线性时间算法,但我不确定这个问题会被调用。
答案 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)算法:
显然,您还需要检查数组边界。