成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

為什么排序的復雜度為O(N log N)

開發 后端
基本上所有正而八經的算法教材都會解釋像快速排序和堆排序這樣的排序算法有多快,但并不需要復雜的數學就能證明你可以逐漸趨近的速度有多快。

[[341282]]

基本上所有正而八經的算法教材都會解釋像快速排序quicksort堆排序heapsort這樣的排序算法有多快,但并不需要復雜的數學就能證明你可以逐漸趨近的速度有多快。

關于標記的一個嚴肅說明:

大多數計算機專業的科學家使用大寫字母 O 標記來指代“趨近,直到到達一個常數比例因子”,這與數學專業所指代的意義是有所區別的。這里我使用的大 O 標記的含義與計算機教材所指相同,但至少不會和其他數學符號混用。

基于比較的排序

先來看個特例,即每次比較兩個值大小的算法(快速排序、堆排序,及其它通用排序算法)。這種思想后續可以擴展至所有排序算法。

一個簡單的最差情況下的計數角度

假設有 4 個互不相等的數,且順序隨機,那么,可以通過只比較一對數字完成排序嗎?顯然不能,證明如下:根據定義,要對該數組排序,需要按照某種順序重新排列數字。換句話說,你需要知道用哪種排列方式?有多少種可能的排列?第一個數字可以放在四個位置中的任意一個,第二個數字可以放在剩下三個位置中的任意一個,第三個數字可以放在剩下兩個位置中的任意一個,最后一個數字只有剩下的一個位置可選。這樣,共有  4×3×2×1=4!=24 種排列可供選擇。通過一次比較大小,只能產生兩種可能的結果。如果列出所有的排列,那么“從小到大”排序對應的可能是第 8 種排列,按“從大到小”排序對應的可能是第 24 種排列,但無法知道什么時候需要的是其它 22 種排列。

通過 2 次比較,可以得到 2×2=4 種可能的結果,這仍然不夠。只要比較的次數少于 5(對應 25 = 32  種輸出),就無法完成 4 個隨機次序的數字的排序。如果 W(N) 是最差情況下對 N 個不同元素進行排序所需要的比較次數,那么,

 

兩邊取以 2 為底的對數,得:

 

N! 的增長近似于 NN (參閱 Stirling 公式),那么,

 

這就是最差情況下從輸出計數的角度得出的 O(N log N) 上限。

從信息論角度的平均狀態的例子

使用一些信息論知識,就可以從上面的討論中得到一個更有力的結論。下面,使用排序算法作為信息傳輸的編碼器:

  1. 任取一個數,比如 15
  2. 從 4 個數字的排列列表中查找第 15 種排列
  3. 對這種排列運行排序算法,記錄所有的“大”、“小”比較結果
  4. 用二進制編碼發送比較結果
  5. 接收端重新逐步執行發送端的排序算法,需要的話可以引用發送端的比較結果
  6. 現在接收端就可以知道發送端如何重新排列數字以按照需要排序,接收端可以對排列進行逆算,得到 4 個數字的初始順序
  7. 接收端在排列表中檢索發送端的原始排列,指出發送端發送的是 15

確實,這有點奇怪,但確實可以。這意味著排序算法遵循著與編碼方案相同的定律,包括理論所證明的不存在通用的數據壓縮算法。算法中每次比較發送 1 比特的比較結果編碼數據,根據信息論,比較的次數至少是能表示所有數據的二進制位數。更技術語言點,平均所需的最小比較次數是輸入數據的香農熵,以比特為單位。熵是衡量信息等不可預測量的數學度量。

包含 N 個元素的數組,元素次序隨機且無偏時的熵最大,其值為 log2​ N! 個比特。這證明 O(N log N) 是一個基于比較的對任意輸入排序的最優平均值。

以上都是理論說法,那么實際的排序算法如何做比較的呢?下面是一個數組排序所需比較次數均值的圖。我比較的是理論值與快速排序及 Ford-Johnson 合并插入排序 的表現。后者設計目的就是最小化比較次數(整體上沒比快速排序快多少,因為生活中相對于最大限度減少比較次數,還有更重要的事情)。又因為合并插入排序merge-insertion sort是在 1959 年提出的,它一直在調整,以減少了一些比較次數,但圖示說明,它基本上達到了最優狀態。

 

一點點理論導出這么實用的結論,這感覺真棒!

小結

證明了:

  1. 如果數組可以是任意順序,在最壞情況下至少需要  次比較。
  2. 數組的平均比較次數最少是數組的熵,對隨機輸入而言,其值是 O(N log N) 。

注意,第 2 個結論允許基于比較的算法優于 O(N log N),前提是輸入是低熵的(換言之,是部分可預測的)。如果輸入包含很多有序的子序列,那么合并排序的性能接近 O(N)。如果在確定一個位之前,其輸入是有序的,插入排序性能接近 O(N)。在最差情況下,以上算法的性能表現都不超出 O(N log N)

一般排序算法

基于比較的排序在實踐中是個有趣的特例,但從理論上講,計算機的 CMP 指令與其它指令相比,并沒有什么特別之處。在下面兩條的基礎上,前面兩種情形都可以擴展至任意排序算法:

  1. 大多數計算機指令有多于兩個的輸出,但輸出的數量仍然是有限的。
  2. 一條指令有限的輸出意味著一條指令只能處理有限的熵。

這給出了 O(N log N) 對應的指令下限。任何物理上可實現的計算機都只能在給定時間內執行有限數量的指令,所以算法的執行時間也有對應 O(N log N) 的下限。

什么是更快的算法?

一般意義上的 O(N log N) 下限,放在實踐中來看,如果聽人說到任何更快的算法,你要知道,它肯定以某種方式“作弊”了,其中肯定有圈套,即它不是一個可以處理任意大數組的通用排序算法。可能它是一個有用的算法,但最好看明白它字里行間隱含的東西。

一個廣為人知的例子是基數排序radix sort算法,它經常被稱為 O(N) 排序算法,但它只能處理所有數字都能放入 k 比特的情況,所以實際上它的性能是 O(kN)

什么意思呢?假如你用的 8 位計算機,那么 8 個二進制位可以表示 28=256 個不同的數字,如果數組有上千個數字,那么其中必有重復。對有些應用而言這是可以的,但對有些應用就必須用 16 個二進制位來表示,16 個二進制位可以表示 216=65,536 個不同的數字。32 個二進制位可以表示 232=4,294,967,296 不同的數字。隨著數組長度的增長,所需要的二進制位數也在增長。要表示 N 個不同的數字,需要 k ≥ log2​ N 個二進制位。所以,只有允許數組中存在重復的數字時, O(kN) 才優于 O(N log N)

一般意義上輸入數據的 O(N log N) 的性能已經說明了全部問題。這個討論不那么有趣因為很少需要在 32 位計算機上對幾十億整數進行排序,如果有誰的需求超出了 64 位計算機的極限,他一定沒有告訴別人。 

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2021-11-09 06:00:01

快速排序時間復雜度排序

2018-07-31 09:52:38

機器學習排序算法圖像處理

2021-10-15 09:43:12

希爾排序復雜度

2022-02-13 20:04:04

鏈表節點代碼

2020-11-30 06:26:31

算法時間表示法

2022-02-22 10:11:01

系統軟件架構

2024-04-25 08:33:25

算法時間復雜度空間復雜度

2018-10-28 22:37:00

計數排序排序面試

2021-10-13 09:00:19

排序數據集開發

2015-10-13 09:43:43

復雜度核心

2020-12-30 09:20:27

代碼

2011-04-20 13:56:08

選擇排序

2021-01-05 10:41:42

算法時間空間

2021-10-09 10:25:41

排序應用場景

2024-09-04 16:27:25

2009-11-17 11:06:37

PHP排序

2022-05-07 08:55:11

Go語言排序算法

2023-07-27 07:28:04

存儲鏈表HashSet

2018-11-01 13:49:23

桶排序排序面試

2009-07-09 10:45:16

C#基本概念復雜度遞歸與接口
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国内av在线 | 91精品国产一区二区 | 亚洲欧美成人影院 | 色婷婷狠狠 | 日韩一级黄色毛片 | 91在线视频免费观看 | 日本视频在线播放 | 一区二区三区av夏目彩春 | 国产在线一区二区三区 | 国产剧情一区 | 久久久久久久久一区 | 久久久久久亚洲精品 | 国产aⅴ精品 | 久久久精彩视频 | 中文字幕一区在线 | 久久精品色欧美aⅴ一区二区 | 亚洲欧美一区在线 | 精品视频一区二区三区 | 国产精品1| www.青青草| 国产精品日韩 | 久久国产日韩欧美 | 亚洲欧洲中文 | 手机av在线 | 国产精品一区二区在线免费观看 | 三级视频在线观看 | 波多野结衣电影一区 | 久久机热 | 伊伊综合网 | 欧美精品一区二区三区蜜桃视频 | 成年男女免费视频网站 | 99精品国产一区二区青青牛奶 | 欧美片网站免费 | 天天操天天射天天 | 亚洲午夜av久久乱码 | 五月天天丁香婷婷在线中 | 国产精品久久久久久久久久久免费看 | 91电影在线 | 国产精品a久久久久 | 久久久久久国模大尺度人体 | 丝袜 亚洲 另类 欧美 综合 |