序列合併求前K小項 POJ2442

2022-09-01 05:51:07 字數 991 閱讀 1503

1 #include 2 #include 3 #include 4 #include 5 #include 6

7using

namespace

std;

89 priority_queuepq;

10int an[3100

];11

int bn[3100

];12

13int

main()

1429

for(int t=0;t)

3033

for(int t=1;t)

3442}43

}44for(int t=0;t)

4549

}50 cout<1

];51

for(int i=n-2;i>=0;i--)

52 cout<

"<

53 cout<

55return0;

56 }

view code

解題步驟:

1.將第一序列讀入data1向量中,並按公升序排序。

2.將資料讀入data2向量中,並按公升序排序。

將data2[0] + data1[i] ( 0<=i<=n-1)讀入dataq向量中

用make_heap對dataq建堆。

然後data2[1] + data1[i] (0<=i<=n-1),如果data2[1] + data1[i]比堆dataq的頂點大,則退出,否則刪除

堆的頂點,插入data2[1] + data1[i]。然後是data2[2],...data2[n - 1]

3.將dataq的資料拷貝到data1中,並對data1按公升序排序

4.迴圈2,3步,直到所有資料讀入完畢。

5.列印data1中的資料即為結果。

按此方法,每次只需和當前最小的k項中最大的那項比較就行,而不用比較n^m次

CI20 6 求前K個數

描述乙個演算法,在十億個 n 數中找出前一百萬 k 大的數字。假設記憶體裡可以放下十億個數。思路 1 直接排序,然後輸出前一百萬個數,時間複雜度為o n logn 2 維護乙個大小為一百萬的大頂推,然後遍歷完十億個數,輸出大頂推的數即可,時間複雜度為o n logk 該思路適合大資料,尤其是記憶體放...

前 K 個高頻元素, 求Top N

給定乙個非空的整數陣列,返回其 現頻率前 k 高的元素。示例 1 輸入 nums 1,1,1,2,2,3 k 2 輸出 1,2 示例 2 輸入 nums 1 k 1 輸出 1 說明 你可以假設給定的 k 總是合理的,且 1 k 陣列中不相同的元素的個數。你的演算法的時間複雜度必須優於 o n log...

求序列第K大演算法總結

參考部落格 傳送門 在上面的部落格中介紹了求序列第k大的幾種演算法,感覺收益良多,其中最精巧的還是利用快速排序的思想o n 查詢的演算法。仔細學習以後我將其中的幾個實現了一下。解法 1 將亂序陣列從大到小進行排序然後取出前k大,總的時間複雜度為o nlogn 解法 2 利用選擇排序或互動排序,取出前...