六、Analysis of quicksort
1 引言
如題目所示,本節的精華在于用數學解決一個直覺上看似紛亂復雜的問題,里面有一些一般性的分析方法,如引入Indicator變量,從而把不確定問題引入到概率框架進行分析,一步一步把直覺上混亂的問題理清楚,數學之美也就是如此吧!
如果有個算法在某些情況下表現的很差,在某些情況下又表現的不錯,那么你還會放心的使用該算法嗎?通過下面的分析后你會很放心使用快速排序算法。
2 Quicksort
2.1 算法描述
2.2 手工演示
- 指針iii指示的是≤pivot\leq pivot≤pivot的最后一個,作用是是用來標記≤pivot\leq pivot≤pivot和≥pivot\geq pivot≥pivot的分割狀態,指針jjj用來遍歷所有元素,每遍歷一個元素都會和pivotpivotpivot比較,不斷更新iii的指示狀態。
2.3 實現
# -*- coding: utf-8 -*-def PARTITION(A, p, r):x = A[r]i = p - 1for j in range(p, r):if A[j] <= x:i = i + 1A[i], A[j] = A[j], A[i]A[i + 1], A[r] = A[r], A[i + 1]return i + 1def QUICK_SORT(A, p, r):if p < r:q = PARTITION(A, p, r)QUICK_SORT(A, p, q - 1)QUICK_SORT(A, q + 1, r)if __name__ == '__main__':A = ['x', 2, 8, 7, 1, 3, 5, 6, 4]print('before sort:', A[1:])QUICK_SORT(A, 1, len(A) - 1)print('after sort:', A[1:])運行結果:
before sort: [2, 8, 7, 1, 3, 5, 6, 4] after sort: [1, 2, 3, 4, 5, 6, 7, 8]3 Analysis of quicksort
3.1 worst case
用遞歸樹分析如下:
3.2 best case
應用主定理容易得到T(n)=Θ(nlogn)T(n)=\Theta(nlogn)T(n)=Θ(nlogn)。
3.3 110,910\frac{1}{10}, \frac{9}{10}101?,109?case
下面看一種感覺直覺上很差,其實效果很好的情況。
使用遞歸樹分析:
- 注意log109n/log2n=log1092log_{\frac{10}{9}}n/log_{2}n = log_{\frac{10}{9}}2log910??n/log2?n=log910??2,這是一個常數。
3.4 worst best交替情況
- 好壞交替的情況下,最后仍然是好的!
3.5 random case
上面從矛盾的特殊性上讓直覺有一個直觀的感受,只要不是特別極端(如一個初始狀態是逆序的數列),貌似大部分情況下都是ok的,下面用概率框架確認這種直觀的感覺是正確的。
-
對于離散不確定問題,要引入概率框架進行討論,首先要引入一個合適的隨機變量,這里引入指示器(Indicator)隨機變量,這個變量在機器學習算法中使用更為廣泛,看似簡單的一個定義,卻可以化繁為簡的用一個表達式表示所有情況。
-
至此,已經進入到概率框架,可以暫時忘記之前的算法問題背景:
-
概率世界都是是不確定的,研究概率大目的是找出不確定問題的平均特性,如期望、方差等,這里只關注期望。
-
下面的推到中用到了期望的線性可加性和獨立可乘性。
分割的獨立性:第一次分割后,數組分為第a部分和第b部分,a部分具體在哪個位置分割已經和第一次分割沒有關系。
-
猜想E[T(n)]≤anlgnE[T(n)] ≤ an lg nE[T(n)]≤anlgn,a足夠大,接下來數學歸納法要登場了!,首先有一個數學事實要知道,這個結論也是用數學歸納法容易證明:
-
使用數學歸納法證明E[T(n)]≤anlgnE[T(n)] ≤ an lg nE[T(n)]≤anlgn
4 總結
- 從上面的分析中可以看到,快速排序大概率是Θ(nlogn)\Theta(nlogn)Θ(nlogn)的,在實際應用中快速排序往往是歸并排序速度的2倍以上,如果在細節上對算法微調,則可以表現出更好的性能.
總結
以上是生活随笔為你收集整理的六、Analysis of quicksort的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pygame的安装与使用
- 下一篇: ISO9000简介