日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

排序算法的时间复杂度_算法的时间复杂度

發布時間:2024/9/27 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 排序算法的时间复杂度_算法的时间复杂度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、 算法的時間復雜度

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并不是表示代碼真正的執行時間, 而是表示代碼執行時間隨著數據規模增長的變化趨勢. 一般具有以下特點:

  • 不保留系數
  • 只保留最高階的項(隨著數據規模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)}}} }

    最優(最初有序)情況: 每次都不需要交換, 則只需次數

    排序算法的復雜度

    三、其他排序算法時間復雜度

    其他排序算法時間復雜度

    總結

    以上是生活随笔為你收集整理的排序算法的时间复杂度_算法的时间复杂度的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。