之前面試的時候硬是想不起來,面試官提醒之後才想起來自己也接觸到過這樣的題目。
一般都是用的堆排序,建立大小為k的大頂堆,使用前k個數直接建堆,則對頂是最大數,再使用第k+i(i=1,2,3...)個數去和堆頂做比較,小於則替換堆頂,再進行沉降,大於則跳過。這樣就可以始終保持此k大小的堆為前k個數。
複雜度應該是nlogk。
今天看到演算法筆記中提到使用快排也可以。
思想是選中合適基準將資料分為兩段,兩段大小分別為x,y,x>k時,直接拋棄第二段,否則再將第二段y大小的資料選基準分割,分割分別為y1,y2,再將y1和k-x進行比較,y1>k-x時拋棄後半段,否則在進行上面的操作...
遞迴的思想不斷分割出k大小的資料段(累計為k),平均複雜度應該也是nlogk。取決於隨機選中的基準大小了...
只是一點思想,想起來了便寫下來。
如何從前N個資料中找到前K個大 小的資料並列印?
要解決這個問題,那麼我們可以從前十個資料入手,先拿到前十個資料,接下來我們以求前2000個資料中前十個小的資料為例 取出前十個資料,我們把它放入小跟堆裡 從十乙個資料vec i 開始,我們與第一小minheap.top 資料作比較。如果vec i minheap.top 則將vec i 的值賦給mi...
在海量資料中找到最大的前K個數(top K問題)
問題分析 資料是海量的,可能達到10億或者100億以上,只需要找最大的前100個數。所以將資料一次性排序然後取前100個是不太可取的操作。做了很多無用功,並且記憶體一次性也載入不了海量資料。解決方案 方案一 堆。一般說在很多資料中取前多少個資料,我們都會想到堆,這裡我們使用堆來解決問題。首先取k個數...
取一表前N條記錄,各個資料庫的SQL寫法
取一表前n條記錄,各個資料庫的sql寫法 花了點時間整理了一下 取一表前n條記錄,各個資料庫的sql寫法 1.oracle select from table1 where rownum n 2.informix select first n from table1 3.db2 select row...