在两个有序的数组中找第N个数,二分查找 O(lgm+lgn)级
在兩個有序的數組中找第N個數,O(lgm+lgn)級
分類:?算法2009-10-09 20:52?981人閱讀?評論(3)?收藏?舉報問題描述:
Give a divide and conquer algorithm for the following problem:
you are given two sorted lists of size m and n, and are allowed?
unit time access to the ith element of each list. Give an O(lg m + lgn)?
time algorithm for computing the kth largest element in the union of the? two lists. (For simplicity, you can assume that the elements of the?
two lists are distinct).
問題分析:
1. 把 A 平均分為前后兩個部分,前部分有 x 個元素,后部分有 n-x 個元素
(由于 A 是有序的,所以后一部分的所有元素大于前一部分)。A[x] = A的
后一部分的第一個元素。
?
2. 同理把 B 也平均分成前后兩個部分,前部分有 y 個元素,后部分有 m-y 個元素。?
B[y] = B的后一部分的第一個元素。
3. 由于兩個數組都是被平均分割的,所以可以近似地認為 x = n/2, y = m/2。?
這里不妨設 A[x] <= B[y](如果 A[x] > B[y] 處理過程和下面類似):?
?
part1:
?
由于在 A 中,A[x] 前面有 x 個元素,在 B 中,B[y] 前面有 y 個元素,?
并且又有 A[x] <= B[y],那么,合并以后,A[x]前面原來那些元素必然?
也在B[y]前面,也就是說,B[y]前面至少會有 x + y 個元素,我們再規定?
如果 A, B 中有相同元素,則合并后 A 中的元素排在 B 前面,那么歸并?
以后 A[x] 也會排在 B[y] 前面,于是乎合并之后 B[y] 至少有 x+y+1 個元素。?
?
如果 k <= x+y+1,也就是說,合并后第 k 大的元素必然落在 B[y] 前面。?
所以,原來在 B 數組中,第二部分(B[y]以及 B[y] 之后)那些元素都不可能?
包含我們要找到內容(第 k 大元素),所以我們可以把他們排除掉。?
這樣就排除了 B 中一半的內容。?
?
?
part2:
?
在 A 中,A[x] 及其后面有 n1-x 個元素,除去 A[x] 之后有 n-x-1 個元素,?
B[y] 及其后面有 m-y 個元素。那么,由于 A[x] <= B[y],所以合并起來之后,?
B[y] 后面那些元素必然也在 A[x] 后面,則合并后 A[x] 后面至少有??
(n-x-1) + (m-y) = (n+m)-(x+y+1) 個元素。?
?
如果 k > x+y+1,也就說,合并后第 k 大的元素必然落在 A[x] 后面。?
所以,原來在 A 數組中,第一部分(A[x]之前)以及 A[x] 都不可能包含我們?
要找的元素,所以我們可以把他們排除掉。這樣就排除了 A 中一半的內容。?
?
?
all:
?
綜上所訴,對于 k <= x+y+1 還是 k > x+y+1 我們都提出了解決的方案,并且每種方案?
都能把 A 或者 B 的規模減小一半。減小了一半之后,我們將其作為一個新的問題?
繼續使用上面的算法處理,直到 A 或者 B 減小到足夠小:?
?
1. A沒有了,這樣只需要找出 B 中第 k 大的元素,也就是 B[k].?
2. B沒有了,同上結果就是 A[k].
?
代碼如下:
?
[c-sharp]?view plaincopy?
總結
以上是生活随笔為你收集整理的在两个有序的数组中找第N个数,二分查找 O(lgm+lgn)级的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 模式(一)javascript设计模式
- 下一篇: Nginx工作原理和优化、漏洞