[英]Constructing a O(n) time complexity algorithm for search for a value in two arrays
假设我有2个按升序排序的int数组。 我试图找出数组A中的值是否与数组B中的值相匹配,而时间复杂度为n。 起初,我想到了线性搜索,但由于我需要嵌套的for循环,因此无法实现。 我的另一个想法是尝试使用二进制搜索并为此添加一个for循环。 那行得通吗?
就像...
for (int i = 0;i<B.length(), i++) {
BinarySearch(A[0..N-1], value, low, high) {
if (high < low)
return -1 // not found
mid = low + (high - low) / 2
if (A[mid] > value)
return BinarySearch(A, value, low, mid-1)
else if (A[mid] < value)
return BinarySearch(A, value, mid+1, high)
else
return mid // found
}
}
这不是完整的代码,我只是从wiki复制了此代码作为示例。 我朝着正确的方向前进吗?
您说数组已经排序 。 这是您必须使用的非常重要的前提条件。 然后,您有两个类似的序列:
1 <A -7
2 0
5 <B 1 <A
10 5 <B
13 11
14 13
想象一下,您从上到下并行地处理序列,尝试以使这些索引处的值匹配的方式平衡索引-请参见示例中的<A
和<B
标记。 其余的只是使用整数比较。 这将导致O(Max(a.Length, b.Length))
(因此O(n)
)的时间复杂度。
可能的改进:从一开始就弄清楚是否完全可以进行输入。
其余的如果真的留作家庭作业。
合并两个列表,合并为O(n)。
合并过程为:
1)比较两个列表中的“最小元素”,如果它们相等,则形成我们的答案。 2)如果没有,请从列表中删除两者中较小的一个并更新列表。 3)重复1)和2),直到完成任何列表。
如果一个数组相对于另一个数组而言非常小,则复杂度将为Min(a.length,b.length),也可能为O(1)。
展示python如何自我解释的示例代码;)
def find_first_matching_value(array_a, array_b):
"Return the first value in both arrays"
# both arrays are sorted
assert sorted(array_a) == array_a
assert sorted(array_b) == array_b
array_a_index = 0
array_b_index = 0
while (array_a_index < len(array_a)
and array_b_index < len(array_b)):
if array_a[array_a_index] > array_b[array_b_index]:
# skip to next element in array b
array_b_index += 1
elif array_a[array_a_index] < array_b[array_b_index]:
# skip to next element in array a
array_a_index += 1
else:
# found
return array_a[array_a_index]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.