直擊資訊的本質 計數排序

2021-10-06 16:55:08 字數 1821 閱讀 3869

前言:計數排序,顧名思義它是統計每個元素出現的次數。實際上是通過限定了資訊的範圍,在只適用於整數情況下達到了線性時間效能。(整數集合在已知範圍的情況下,整數的個數是有限的,實際上限定資料為整數,是把問題從無限多種情況,變成了有限種情況)

演算法原理:

1. 先計算資料中的最大值max最小值min。(找出資料範圍)

2.開闢乙個大小為m(max-min+1)儲存空間陣列 sortarr。(開闢儲存空間)

3.遍歷每乙個元素arr[i],對其執行 sortarr[hashkey(arr[i],min)]++。(開始計數)

設:資料數需要處理的資料為arr, 長度為len,countingsort為排序入口函式,hashkey為對映函式

偽碼:

getmaxmin(arr,len)

else if(arr[i]演算法圖:

獲取最大最小值:

統計元素數量:

演算法效能:

1.計算最大值max和最小指min需要遍歷整個陣列,效能消耗為len。

2.開闢乙個大小為m的儲存空間,效能消耗為m。

3.遍歷每乙個資料進行計數,效能消耗為len。

4.那麼效能為2*len+m,所以時間複雜度為o(n+m)。(計算效能時,我們不計算係數項,n為len,m為m)

結語:1.在計數排序中,資料一定為整數,事實上是對資訊進行了分類,對問題進行了降維操作,在一般排序問題中處理的資料為浮點資料,本質是對連續型資料進行處理,而只處理整數後,問題變成了在離散型資料上的處理。(在連續資料向離散資料進行轉換時會簡化問題,同時會帶來資訊上的丟失,丟失的資訊其實就是被簡化的部分。在數學上微積分、線性代數、擬合等其實就是解決這些問題的方式,在這不過多的討論這個問題。 在日常生活中,離散資料是我們常用且重要解決問題的手段,在計算機中非常常見,乙個典型的代表就是繪製一根斜線,計算機在繪製乙個線段的時候是乙個個的畫素點進行繪製的)

2.實際上計數排序還有乙個隱性的要求,也就是max-min不能太大,不然會造成大量空間浪費,甚至會讓演算法變得不可行,因為實際應用中我們的可使用空間實際上是有限制的,不可能無限大。

3. 在計數排序中對映函式hashkey是乙個非常簡單的雜湊函式,在max-min的大小能接受的情況下,可以直接使用以上**處理,但實際上如果max-min大小不能接受的情況下,可以使用字典的雜湊函式設計解決這個問題。(在字典這種資料結構中,key的定址所使用的雜湊函式,是解決這個問題的方式之一。這裡不做過多的深入,這裡只單純給出解決方案,當然這個方案會降低演算法的效能)

4.在排序元素不多,但元素值相差巨大的時,會導致效能低於傳統比較排序。(當m>nlog2(n)的時候,計數排序的效能是差於快速排序等比較排序演算法的)

5.對於有"最小單位"的浮點資料實際上也是可以使用計數排序的,例如在統計學生成績的時候,我們能碰到的最小單位為0.5,實際上我們對所有的元素資料進行*2的操作後可以繼續使用計數排序,但是這裡的實質是把浮點資料對映到整數中去(對問題進行降維操作,把連續型問題轉換成離散型問題),但在絕大部分情況下,是無法這麼做的。

6.在計數排序中我們使用了空間換時間的思想,但是空間換時間的前提是讓資料「降維」,只有這樣我們才能達到目的,實際上這就是對資訊的一種假設(不會出現浮點資料)。

ps:資料為整數時看到乙個線性時間的演算法,相較於比較排序(快速排序)演算法進行了指數級別的優化,同時也有疑問是不是存在乙個演算法,在一般浮點數下,也可以達到線性時間,答案是肯定的,此演算法就是:桶排序。

直擊資訊的本質 桶排序

前言 桶排序在某種意義上來講它並不是乙個排序演算法,它更像乙個策略方案,事實上的排序還是由別的排序演算法完成,它的步驟分為兩部分 1 資料裝 桶 2 每個 桶 使用其餘的排序演算法進行排序。計數排序實際上是桶排序的特例情況,桶排序代表的是一般情況,資料結構字典的實現思想和桶排序的實現思想一致。演算法...

直擊資訊的本質 陣列

後語傳送門 陣列指多個連續的最小儲存單元所構成的集合,且每個單元只可被乙個陣列使用。陣列會記錄起始最小儲存單元的下標 start 與陣列長度 len 在計算機系統中,可以把記憶體看做乙個超大的陣列 實際上陣列是由,最小儲存單元這個概念規定自然產生的一種資料結構,即多個連續的最小儲存單元稱之為陣列。實...

直擊資訊的本質 鍊錶

資料基本操作 後語傳送門 鍊錶指多個不連續的最小儲存單元所構成的集合。鍊錶會記錄起始最小儲存單元的下標 start 與結束最小儲存單元的下標 end 鍊錶解決了陣列的增刪缺陷,同時能提高總空間利用率,但同時也帶來了查詢開銷的增大的問題。下圖中w,q,e為陣列 e為鍊錶。鍊錶實際上是通過記錄元素之間的...