前一陣子做作業,看到了這個,要求在 o(n) 時間內查詢前 k 小的 k 個數,
給出的提示是,先在 o(n) 時間內查詢到第 k 小的數.由此想到,此前一直用
的 sort 函式,排完序後找下標為 k-1 的那個數,卻從來沒有考慮過具體的
實現.結合前一陣子學習的快速排序演算法,大致對此有了新的認識.
首先給出乙個函式,可以求出軸值在(排完序的)陣列中的位置.
這裡是假設區間的第乙個數為軸值.
int partition(int array,int left,int right)//二分查詢區間
array[i] = pivot;
return i;//返回軸值的位置
}
下面再進行二分查詢,查詢第 k 小的數.
int find(int array,int left,int right,int k)
這裡,find函式的返回值就是第k小的數val。
接下來,將這個數val作為軸值,呼叫partition函式,即可得到分成兩
塊的區間,左邊區間的數全部不大於val。左邊的區間裡的數即為所
求。整個演算法的時間複雜度為o(n).
在O n 時間內找出最小的k個元素
思想 1.用大頭堆實現 2.類似快速排序實現 1.用大頭堆實現 程式設計師面試一百題 解法 2.類似快速排序實現 程式猴 include stdafx.h include include include include include using namespace std 每次將陣列劃分為兩部分,...
選擇問題 線性時間內找到序列的第k小的元素
選擇問題 在序列中按順序找到某個元素。這可以用排序方法做到,即先排個序,在找到指定元素,但是這樣就按最快的堆排序 合併排序啥的都得是o nlgn 數量級的,這裡採取的方法可以在期望為o n 的時間內完成。具體的實現方式如下 int select int a,int begin,int end,int...
MongoDB查詢某段時間內的資料
在mysql裡面可以用between.and.或者 來查詢指定的時間範圍資料,但是mongodb有自己的語法。mongodb裡比較,用 gt gte lt lte 分別對應 組合起來可以進行範圍的查詢。比如查昨天的,就可以用 db.collectionaaa.find count 注意,開始的時候日...