繁体   English   中英

构造O(n)时间复杂度算法以在两个数组中搜索值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM