排序算法的时间复杂度_算法的时间复杂度
一、 算法的時間復雜度
1、如何評估算法的性能
數據結構和算法,本質上是解決現實存在的問題,即如何讓解決指定問題的代碼運行得更快?一個算法如果能在所要求的資源限制(resource constraint)內將問題解決好,則稱這個算法是有效率的(effient)。限制可分為空間限制和時間限制。
如何衡量算法的執行時間? 可以使用如下的代碼測試:
void calcDuration(){ long begin = System.currentTimeMillis(); function(n); // 測試function的執行時間long end = System.currentTimeMillis(); }我們可以通過end-begin來計算出function()的執行時間。這類“事后統計”的方法用來評估算法執行效率是正確的,但是它也有它的局限性:
能不能事先“算”出算法的執行效率呢?這就引出了以下兩個概念:時間復雜度,空間復雜度。
2、 大O表示法
看下面的簡單代碼:
void foo(){for(int i =0;i<n;i++){//執行了n次System.out.println("Hello world");//執行了n次}System.out.println("function over");//執行了1次 }在上述例子中,第1行的代碼總共執行了n次,第2行的代碼總共執行n次,第4行代碼會執行1次。(這里假設計算機處理語句代價都為c)
假設算法總執行時間為T(n),其中n為問題的規模, 那么上述代碼的總執行時間就是: T(n)=(2n+1)*c
可以看出,T(n)與代碼的總執行次數總是成正比的,即與(2n+1)成正比. 我們將代碼執行次數用f(n)來表示,即: f(n)=2n+1
有了執行次數后, 用大0 (英語:Big O notation)來表示算法的復雜度, 即:
T(n) =0(f(n))
針對上述代碼的時間復雜度: T(n) =0(2n + 1) = 0(n)
在表示時間復雜度的時候, 大0并不是表示代碼真正的執行時間, 而是表示代碼執行時間隨著數據規模增長的變化趨勢. 一般具有以下特點:
可以把大O符號想象成一個過濾性的漏斗,過濾那些系數以及低階的項。
時間復雜度又分: 最優時間復雜度, 平均時間復雜度, 最壞時間復雜度. 一般平均復雜度更有指導意義.
二、排序算法的復雜度
1、冒泡算法時間復雜度計算
以冒泡算法為例, 我們算下冒泡算法的復雜度:
def bubbleSort(arr: Array[Int]): Unit = {for (i <- 0 until arr.length - 1) { // for (j <- 0 until arr.length - 1 - i) // if (arr(j) > arr(j + 1)) { swap(arr, j, j + 1)}}} }最優(最初有序)情況: 每次都不需要交換, 則只需次數
排序算法的復雜度三、其他排序算法時間復雜度
其他排序算法時間復雜度總結
以上是生活随笔為你收集整理的排序算法的时间复杂度_算法的时间复杂度的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pmbook 知识领域 第六版_PMP项
- 下一篇: 山西省军区士官学校地址在哪里?