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