日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在两个有序的数组中找第N个数,二分查找 O(lgm+lgn)级

發布時間:2023/12/10 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在两个有序的数组中找第N个数,二分查找 O(lgm+lgn)级 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在兩個有序的數組中找第N個數,O(lgm+lgn)級

分類:?算法?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
  • /************************************************************************?
  • ?*?This?is?the?practice1?of?the?Algorithms?It?solved?the?problem1?below:?
  • ?*??
  • ?*?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).?
  • ?*??
  • ?*?The?idea?of?the?Algorithm?in?the?help?file?idea.txt!!?
  • ?*?
  • ?*?The?Algorithm?is?designed?by:Nanne?
  • ?*???????????
  • ?************************************************************************/??
  • #include?<iostream>??
  • using?std::cin;??
  • using?std::cout;??
  • using?std::endl;??
  • int?FindTheKth(int?a[],int?b[],int?aLeft,?int?aRight,?int?bLeft,?int?bRight,?int?k);??
  • ???
  • int?main(){??
  • ????int?sizeA,sizeB;??
  • ????int?Kth;??
  • ????cout?<<?"A?С";??
  • ????cin?>>?sizeA;??
  • ????int?*arrA?=?new?int[sizeA];??
  • ????cout?<<?""?<<?sizeA?<<?""?<<?endl;??
  • ????for?(int?i?=?0;?i?<?sizeA;?i++)???
  • ????????cin?>>?arrA[i];??
  • ????cout?<<?"B?С";??
  • ????cin?>>?sizeB;??
  • ????int?*arrB?=?new?int[sizeB];??
  • ????cout?<<?""?<<?sizeB?<<?""?<<?endl;??
  • ????for?(int?i?=?0;?i?<?sizeB;?i++)???
  • ????????cin?>>?arrB[i];??
  • ????while(true){??
  • ????????cout?<<?"??λ"?<<?endl??
  • ????????????<<?"λ?"?<<?sizeA?+?sizeB?<<?"(-1?):";??
  • ????????cin?>>?Kth;??
  • ????????if(?Kth?!=?-1){??
  • ????????????int?res?=?FindTheKth(arrA,arrB,0,?sizeA?-?1,?0,?sizeB?-?1,?Kth);??
  • ????????????if(res?!=?-1)??
  • ????????????????cout?<<?""?<<?Kth?<<?"λ?"?<<?res?<<?endl;??
  • ????????}??
  • ????????else??
  • ????????????return?0;??
  • ????}??
  • }??
  • ??
  • int?FindTheKth(int?a[],int?b[],int?aLeft,?int?aRight,?int?bLeft,?int?bRight,?int?k)?{??
  • ????int?aMid?=?(aLeft?+?aRight)?/?2,?bMid?=?(bLeft?+?bRight)?/?2;??
  • ????if?(aLeft?>?aRight)?return?b[bLeft+k-1];??
  • ????if?(bLeft?>?bRight)?return?a[aLeft+k-1];??
  • ????if?(a[aMid]?<=?b[bMid])?{??
  • ????????if?(k?<=?(aMid?-?aLeft)?+?(bMid?-?bLeft)?+?1)?{??
  • ????????????return?FindTheKth(a,b,aLeft,?aRight,?bLeft,?bMid-1,?k);??
  • ????????}?else?{??
  • ????????????return?FindTheKth(a,b,aMid+1,?aRight,?bLeft,?bRight,?k-(aMid-aLeft)-1);??
  • ????????}??
  • ????}?else?{??
  • ????????if?(k?<=?(aMid?-?aLeft)?+?(bMid?-?bLeft)?+?1)?{??
  • ????????????return?FindTheKth(a,b,aLeft,?aMid-1,?bLeft,?bRight,?k);??
  • ????????}?else?{??
  • ????????????return?FindTheKth(a,b,aLeft,?aRight,?bMid+1,?bRight,?k-(bMid-bLeft)-1);??
  • ????????}??
  • ????}??
  • ????return?-1;??
  • }??
  • ?

    總結

    以上是生活随笔為你收集整理的在两个有序的数组中找第N个数,二分查找 O(lgm+lgn)级的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲av无一区二区三区 | 国产亚洲精品成人无码精品网站 | 特级西西444www大精品视频免费看 | 久久久国产精品一区 | 米奇7777狠狠狠狠视频 | 青青视频在线免费观看 | 久国产视频 | 欧美激情电影一区二区 | 伊人久久久久久久久久久 | 亚洲97在线 | 色综合天天综合网天天看片 | 狠狠婷婷 | 午夜插插 | 俺去射| 91午夜精品亚洲一区二区三区 | 在线免费观看h片 | 伊人伊人网 | 草草视频在线 | 青苹果av| 午夜精品少妇 | 日本美女日批视频 | 国产成人精品无码免费看在线 | 亚洲av熟女国产一区二区性色 | 色屁屁ts人妖系列二区 | 天天操夜夜操狠狠操 | 91在线免费视频 | 女警白嫩翘臀呻吟迎合 | 亚洲影视中文字幕 | 日本一区二区三区视频在线观看 | 亚洲成人av一区二区三区 | 欧美性大战久久久久久久 | 亚洲精品久久久久久无码色欲四季 | 国产精品成人一区二区网站软件 | 在线免费观看成年人视频 | 国产精品精品国产 | 欧美在线 | 亚洲 | 乱子伦一区二区三区 | 日本人添下边视频免费 | 欧美国产一区二区在线观看 | 精国产品一区二区三区a片 国产精品第一 | 男男啪啪无遮挡 | 成人精品视频一区二区三区尤物 | 国产午夜无码视频在线观看 | 国产a网| 国产精品视频福利 | 青青草自拍偷拍 | 黑人性视频 | 日产电影一区二区三区 | 毛片av在线 | 男人的天堂狠狠干 | 最近最经典中文mv字幕 | 干美女视频 | 亚洲第一页色 | 亚洲色在线视频 | av免费网 | 日韩av在线免费观看 | 狠狠澡 | 50一60岁老妇女毛片 | 免费观看黄色一级视频 | 99热这里只有精品在线观看 | 操比视频网站 | 国精产品乱码一区一区三区四区 | 日本一二三不卡视频 | 日韩高清在线播放 | 99免费在线观看视频 | 综合色在线视频 | 郑艳丽三级 | 久久久久久久久国产精品 | 综合五月婷 | 成人免费看片在线观看 | 色综合婷婷 | 海量av资源 | 中文资源在线播放 | 欧美一区二区三区免费看 | 北条麻妃一区二区三区在线观看 | www.国产.com | 精品人妻在线播放 | 一区视频在线免费观看 | 影音先锋中文在线 | 尤物视频在线免费观看 | 色呦呦呦呦 | 午夜激情电影院 | 国产成人免费观看 | 韩国三级免费 | 国产大片中文字幕在线观看 | 日本一级免费视频 | 91国偷自产一区二区三区观看 | 国精品人妻无码一区二区三区喝尿 | 最新欧美日韩 | 又黄又爽视频在线观看 | 亚洲无av在线中文字幕 | 两性动态视频 | 爱爱视频在线看 | 黄色av免费 | 精品人妻一区二区免费 | 奇米影视777在线观看 | 国产亚洲一区二区不卡 | 黄色资源网| 调教91|