桶排序及一些其應用

2021-09-29 06:31:15 字數 1993 閱讀 2738

一年的全國高考考生人數為500 萬,分數使用標準分,最低100 ,最高900 ,沒有小數,要求對這500 萬元素的

陣列進行排序。

分析:對500w

資料排序,如果基於比較的先進排序,平均比較次數為o(5000000*log5000000)≈1.112億。但是我們發現,這些資料都有特殊的條件: 100=方法:建立801(900-100)個桶。將每個考生的分數丟進f(score)=score-100的桶中。這個過程從頭到尾遍歷一遍資料只需要500w次。然後根據桶號大小依次將桶中數值輸出,即可以得到乙個有序的序列。而且可以很容易的得到100分有***人,501分有***人。

實際上,桶排序對資料的條件有特殊要求,如果上面的分數不是從100-900,而是從0-2億,那麼分配2億個桶顯然是不可能的。所以桶排序有其侷限性,適合元素值集合並不大的情況。

這個演算法的精妙之處在於第三步中,似乎和分治法的思想有些像,通過不斷縮小判斷方法來不斷降低目標數的位置的模糊度

在乙個檔案中有10g個整數,亂序排列,要求找出中位數。記憶體限制為2g。只寫出思路即可(記憶體限制為2g意思是可以使用2g空間來執行程式,而不考慮本機上其他軟體記憶體占用情況。) 關於中位數:資料排序後,位置在最中間的數值。即將資料分成兩部分,一部分大於該數值,一部分小於該數值。中位數的位置:當樣本數為奇數時,中位數=(n+1)/2 ; 當樣本數為偶數時,中位數為n/2與1+n/2的均值(那麼10g個數的中位數,就第5g大的數與第5g+1大的數的均值了)。

分析:既然要找中位數,很簡單就是排序的想法。那麼基於

位元組的桶排序是乙個可行的方法。

思想:將整型的每1byte作為乙個關鍵字,也就是說乙個整形可以拆成4個keys,而且最高位的keys越大,整數越大。如果高位keys相同,則比較次高位的keys。整個比較過程類似於字串的

字典序。

第一步:把10g整數每2g讀入一次記憶體,然後一次遍歷這536,870,912即(1024*1024*1024)*2 /4個資料。每個資料用位運算">>"取出最高8位(31-24)。這8bits(0-255)最多表示256個桶,那麼可以根據8bit的值來確定丟入第幾個桶。最後把每個桶寫入乙個磁碟檔案中,同時在記憶體中統計每個桶內資料的數量num[256]。

代價:(1) 10g資料依次讀入記憶體的io代價(這個是無法避免的,cpu不能直接在

磁碟上運算)。(2)在記憶體中遍歷536,870,912個資料,這是乙個o(n)的線性

時間複雜度。(3)把256個桶寫回到256個磁碟檔案空間中,這個代價是額外的,也就是多付出一倍的10g資料轉移的時間。

第二步:根據記憶體中256個桶內的數量num[256],計算中位數在第幾個桶中。很顯然,2,684,354,560個數中位數是第1,342,177,280個。假設前127個桶的資料量相加,發現少於1,342,177,280,把第128個桶資料量加上,大於1,342,177,280。說明,中位數必在

磁碟的第128個桶中。而且在這個桶的第1,342,177,280-n(0-127)個數字上。n(0-127)表示前127個桶的資料量之和。然後把第128個檔案中的整數讀入記憶體。(若資料大致是均勻分布的,每個檔案的大小估計在10g/256=40m左右,當然也不一定,但是超過2g的可能性很小)。注意,**的情況下,這個需要讀入的第128號檔案仍然大於2g,那麼整個讀入仍然可以按照第一步分批來進行讀取。

代價:(1)迴圈計算255個桶中的資料量累加,需要o(m)的代價,其中m<255。(2)讀入乙個大概80m左右檔案大小的io代價。

第三步:繼續以記憶體中的某個桶內整數的次高8bit(他們的最高8bit是一樣的)進行桶排序(23-16)。過程和第一步相同,也是256個桶。

第四步:一直下去,直到最低位元組(7-0bit)的桶排序結束。我相信這個時候完全可以在記憶體中使用一次快排就可以了。

整個過程的

時間複雜度在o(n)的線性級別上(沒有任何

迴圈巢狀)。但主要時間消耗在第一步的第二次記憶體-磁碟資料交換上,即10g資料分255個檔案寫回磁碟上。一般而言,如果第二步過後,記憶體可以容納下存在中位數的某乙個檔案的話,直接快排就可以了(修改者注:我想,繼續桶排序但不寫回磁碟,效率會更高?)。

[2]

Access一些應用

1,access資料庫字段型別說明以及與sql之間的對照關係 access允許九種資料型別 文字 備註 數值 日期 時間 貨幣 自動編號 是 否 ole物件 超級鏈結 查詢嚮導。文字 nvarchar n 備註 ntext 數字 長整型 int 數字 整型 smallint 數字 單精度 real ...

一些排序方法

從網上找了一些排序方法,可能以後用的著,自己先編寫一下,然後存下來 1.冒泡法 思想 1.從a 0 到a n 相鄰的兩個數進行比較,如果滿足條件則交換,如此反覆。2.這種演算法要經過n 1輪的大迴圈。以下是維基百科思想 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工...

排序 一些排序的總結

假定在待排序的記錄序列中,存在多個具有相同的關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變,即在原序列中,ri rj,且ri在rj之前,而在排序後的序列中,ri仍在rj之前,則稱這種排序演算法是穩定的 否則稱為不穩定的。排序演算法如果是穩定的,那麼從乙個鍵上排序,然後再從另乙個鍵上排序,第乙個...