選擇問題 線性時間內找到序列的第k小的元素

2021-09-06 08:26:11 字數 876 閱讀 3570

選擇問題——在序列中按順序找到某個元素。這可以用排序方法做到,即先排個序,在找到指定元素,但是這樣就按最快的堆排序、合併排序啥的都得是o(nlgn)數量級的,這裡採取的方法可以在期望為o(n)的時間內完成。

具體的實現方式如下

int select(int *a, int begin, int end, int

i)

int token =randomizedpartition(a, begin, end), dis;

dis = token -begin;

if(dis ==i)

else

if(dis >i)

else

}

這裡randomizedpartition()函式返回劃分的位置,但是,並不是想隨機快速排序一樣劃分的兩個部分都遞迴呼叫自身,而是根據具體情況呼叫一部分。先把randomizedpartition()寫到下面:

1

int random(int begin, int

end)28

int randomizedpartition(int *a, int begin, int

end)926

}27 tmp = a[i+1

];28 a[i+1] =a[end];

29 a[end] =tmp;

30return i+1

;31 }

為了便於理解,下面舉個具體的例子,看看程式怎麼執行。

測試需要最短時間內找到最值錢的寶物

李和恆個人的理解是,軟體測試就像沙灘上的尋寶人,你不可能知道沙里埋了些什麼 有多少 在 尋寶人要在盡量短的時間裡面挖出盡量值錢的寶物。但極為諷刺的是,你不可能挖出所有的寶物,而且所有的寶物日後都會浮現出來,比如 海嘯地質運動什麼的。在這裡,測試工程師就是尋寶人,寶物就是bug。至於用什麼辦法尋寶,那...

在O n 時間內查詢陣列內第k小的數

前一陣子做作業,看到了這個,要求在 o n 時間內查詢前 k 小的 k 個數,給出的提示是,先在 o n 時間內查詢到第 k 小的數.由此想到,此前一直用 的 sort 函式,排完序後找下標為 k 1 的那個數,卻從來沒有考慮過具體的 實現.結合前一陣子學習的快速排序演算法,大致對此有了新的認識.首...

socket短時間內重連需注意的問題

socket短時間內重連需注意的問題 設定好監聽socket後,將socket的屬性設定為可重複使用位址,如 建立監聽socket socketlisten new socket addressfamily.internetwork,sockettype.stream,protocoltype.tc...