簡體   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