從別人的那裡轉過來,這種題目,其實就是需要使用分治方法
程式設計之美上的尋找n個數中最大的前k數,給出了一種演算法,我認為比較好:
演算法是這樣寫的:
假設n個數儲存在陣列s中,我們從陣列s中隨機選出乙個元素x,把陣列分為兩部分sa和sb.sa中的元素都大於x,sb中的元素都小於x,這時,有兩種可能性:
1.sa中元素的個數小於k,sa中所有的數和sb中最大的k-|sa|個數(|sa|指sa中元素的個數)就是陣列s中最大的k個數。
2.sa中元素的個數大於或等於k,則直接返回sa中最大的k個元素。
平均時間複雜度o(n*log2 k)
偽**如下:
kbig(s,k)
if(k<=0):
return
if(length s<=k):
return s
(sa,sb)=partition(s)
//
partition(s):
sa=;
sb=;
swap(s[1],s[random()%length s])
p=s[1]
for i in [2:length s]:
length sa
return (sa,sb)
本人實現的**:
//#include "stdafx.h"
#include
#include
#include
#include
using namespace std;
pair , vector> partitionfun(vector origin)
vector kbig(vector & s , int k)
}int _tmain(int argc, _tchar* argv)
;vector myvect(a,a+sizeof(a)/sizeof(int));
// vector tmpvect(a+3,a+15);
cout<<"陣列長度是 " myvect.push_back(8); cout<<"陣列長度是 " for(int i=0;i cout // sort(myvect.begin() , myvect.end()); /// /小到大 // reverse(myvect.begin(),myvect.end()); /// 從大道小 //排序後,對元素的修改 for(int i=0;i cout for(int i=0;i cout return 0; } 有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?分兩部分,第一部分是我個人的解答,第二部分是書上的解答 第一部分 1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣... 有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?分兩部分,第一部分是我個人的解答,第二部分是書上的解答 第一部分 1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣... 有很多無序的數,我們姑且假定它們各不相等,怎麼選出其中最大的若干個數呢?idea 1 先用快速排序或者堆排序進行排序,然後取出最大的k個數,時間複雜度為o nlogn o k o nlogn idea 2 進行k趟最大冒泡或者k次大頂堆的輸出,時間複雜度為o n k 根據k與logn的大小比較,選取...程式設計之美 尋找最大的K個數
程式設計之美 尋找最大的K個數
程式設計之美 尋找最大的k個數