分治法尋找第k小元素演算法的優化
目的和意義
利用分治演算法尋找第k小元素並不是適用於所有情況,在處理一些問題時,按照傳統的分治的演算法似乎並不合理,舉個例子,在尋找一萬個元素中的第十小元素時利用傳統的尋找第k小元素的演算法會產生大量的冗餘,這時候利用每組的中位數並不合算,找中位數代價極大,然而效益極低,利用組內中位數做標準是針對的普適情況,而處理極端情況是不能讓人滿意的,如果能調整尋找標準的方法,則能對原本的演算法進一步優化。由此做為出發點,產生了本次實驗的專案——對尋找第k小元素的演算法的優化。
傳統分治演算法概述與不足
傳統分治法中尋找第k小演算法可以分為三步,第一步是選點,第二步是根據所選點分組,第三步是判斷第k小在哪一組中,並對此組再進行分治處理。本次實驗的研究點主要在第一步,傳統的選點方法是令每五個資料一組,尋找所有分組內中值的中值,這樣的選點方式致使不論尋找第幾小,操作的複雜度是沒有明顯變化的。由於選點趨於中值,所以每次剪枝能力均勻,在處理最大端資料和最小端資料時依舊選擇趨於中值的資料進行分組剪枝則不夠優秀,會有大量的冗餘計算,由此點出發,本文提出了新的選點方式,對演算法進行了優化。
分治演算法優化思想
討論選點讓其擁有較大的剪枝力度是本次研究的關鍵點,不難發現,如上圖所示,對所有元素平均分組,每組中的元素按列排布,各組間按行排布,對每列元素從下到上按遞增排列,選定任一行從左到右按遞增排列,則對選定行內任一元素,其左下的元素皆小於等於此元素,其右上的元素皆大於等於此元素,而左上的元素、右下的元素與所選資料關係未知。根據此種資料分布關係發現,尋找第k小過程中,若對選定的元素,按上述排列,其左下元素加其本身數目大於等於k個,則說明第k小元素定不在其右上的元素之中。由此出發得出結論,只要保證所選元素左下元素加其本身共k個,則右上的全部元素皆可排除,所以在k3時,此種選點方式的排除能力優於傳統選點方式,根據資料排列的對稱性,當
k>n- n/23時,可保證右上角元素為n-k個,從而將左下角元素全部排除。
尋找第k小元素分治優化演算法實現
約定對所有元素平均分組,每組中的元素按列排布,各組間按行排布,每列元素從下到上為列正方向並且按遞增排列,選定的行從左到右為行正方向並且按遞增排列。
1.確定選點mm的行和列
①k3,對行號進行遍歷,選擇行號乘列號大於等於k的最小列號作為待定列號,每個待定列號和對應行號構成乙個組合,對每個組合,判斷右上的元素最多的一組為mm的行和列
②n/23≤k≤n- n/23,選擇每個分組的中值中值為對應點
③k>n- n/23,對所有數字取反,並用convert=1記錄,令k=n-k+1,而後處理同①。
2.對每乙個分組內元素進行排列,而後對選定的行進行排列,根據第一步中選定的行和列提取選定mm的值,此時若convert==1,對所有資料取反。
3.將資料分組a1=,並判斷第k小在哪個組中
4. 對先擇的組重複1、2、3、4步直到找到第k小(第k小出現在a2中)或第k小可能存在的陣列內資料個數達到事先約定的跳出迴圈的閾值。
5.若因第k小存在於a2中跳出,返回mm。
6.若達到閾值跳出,對陣列內資料進行排序,選擇出第k小元素並返回結果。
優化效果分析
中實線為傳統分治演算法,虛線為優化後分治演算法,圖為操作次數對比
分治演算法求第k小元素
1.問題 用分治的演算法求乙個陣列s n 中第k小的元素。2.解析 採取和快速演算法相同的思路,但是結合分治的思想,選取恰當的基準值。找到基準值以後,再按照快速排序的方法進行查詢就好了。3.設計 int r 5int r group ceil high low 1 1.0 r ceil取上限,總共分...
選擇問題(第k小元素)(分治法)
selection algorithm 選擇問題即第k小元素問題。解決該問題的基本思想與快速排序演算法相同,通過選擇基元進行劃分,從而知道第k小元素在 原始資料使用隨機函式生成。採用結構化程式設計,可以很容易改為從標準輸入或檔案讀入資料,只需要修改函式getdata即可。資料個數由巨集定義給出,也可...
分治法求第k小元素(vc )
演算法 求一列數中的第k小元素,利用分治的策略進行遞迴求解。首先隨便指定乙個數,這裡我指定的是第乙個數為第k小元素記為randk,將陣列中其他的數與findk進行比較,比他小的放在左邊,大的放在右邊,如果randk左邊的元素個數為k 1個,說明findk就是你所要找的元素,如果左邊的元素個數 k 1...