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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

一文彻底掌握时间复杂度和大O表示法

發布時間:2023/12/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一文彻底掌握时间复杂度和大O表示法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

預備知識:

  • 計算機基礎知識
  • 高中數學知識

時間復雜度用來干嘛

時間復雜度是衡量算法好壞的一個重要指標,另一個重要指標是空間復雜度。

算法

我們先來了解一下算法,對于一個計算機程序,其算法就是其內部執行的各種邏輯的執行步驟。

算法既然是計算機上的程序的邏輯執行步驟,那他運行的過程中,必須是需要占用計算機的cpu和存儲空間。其中使用cpu計算的總次數的數量級,就以時間復雜度來標識(因為往往運算的次數和時間是成正比的,次數多,使用的時間就多),符號為大寫O。

時間復雜度的定義

一般情況下,算法中基本操作重復執行的次數是問題規模n的某個函數(算法中操作執行次數函數),用T(n)表示。

若有某個輔助函數f(n),使得當n趨近于無窮大時,T(n)/f(n)的極限值為不等于零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n))為算法的漸進時間復雜度(O是數量級的符號 ),簡稱時間復雜度。

上面這一句我用大白話翻譯一下:因為操作執行次數函數,往往含有較多的項,為了讓時間復雜度更清晰明了的標識算法好壞,需要找到一個很簡單的同數量級函數來替代。例如:

假設一個算法的執行次數計算公式如下

T(n) = 2 + 4n + 3n*log2n

可以找到一個函數

f(n) = n*log2n

得到

lim(T(n)/f(n)) = (2+4n+3n*log2n) / (n*log2n)= 2*(1/n)*(1/log2n) + 4*(1/log2n) + 3

當n趨向于無窮大,1/n趨向于0,1/log2n趨向于0,所以極限等于3。上面的lim就是極限的意思

基本的計算步驟
  • 計算出基本操作的執行次數T(n)

    基本操作即算法中的每條語句,語句的執行次數也叫做語句的頻度。

  • 計算出T(n)的數量級 ( 即找到輔助函數f(n) )

    求T(n)的數量級,只要將T(n)進行如下一些操作:

    • 忽略常量(常量可以看做0次冪,但是如果只有常量情況就變成了特殊的O(1),后面有講)
    • 忽略低次冪
    • 忽略最高次冪的系數(如果最高次存在)

    令f(n)=T(n)的數量級。

  • 用大O來表示時間復雜度

    當n趨近于無窮大時,如果lim(T(n)/f(n))的值為不等于0的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n))。

  • 實例說明

    int n; int num1, num2; for(int i=0; i<n; i++){ num1 += 1;for(int j=1; j<=n; j*=2){ num2 += num1;} }

    按照上面的步驟分析:

    1.計算出基本操作的執行次數T(n)

    語句int n;的頻度為1;

    語句int num1, num2;的頻度為1;

    語句i=0;的頻度為1;

    語句i<n; i++; num1+=1; j=1; 的頻度為n;

    語句j<=n; j*=2; num2+=num1;的頻度為n*log2n;

    T(n) = 3 + 4n + 3n*log2n
    2.計算出T(n)的數量級 ( 即找到輔助函數f(n) )

    忽略掉T(n)中的常量、低次冪和最高次冪的系數

    f(n) = n*log2n
    3.用大O來表示
    lim(T(n)/f(n)) = (3+4n+3n*log2n) / (n*log2n)= 3*(1/n)*(1/log2n) + 4*(1/log2n) + 3

    當n趨向于無窮大,1/n趨向于0,1/log2n趨向于0
    所以極限等于3。

    T(n) = O(n*log2n)

    特殊的O(1)

    在大O表示法里面有一個特例,如果T(n) = c, c是一個與n無關的任意非零常數,時間復雜度記為O(1)。推導過程我們就不講了。

    題外話:

    頻度和時間的不絕對關聯

    這期間需要一些數學知識來進行公式變換和函數計算,并且,這里的頻度,代表的是一種次數,而不是計算時間。

    這是因為一個語句的執行,實際會被翻譯成多條計算機指令,在不同的編輯器和不同的機器上都可能有不同的表現(比如乘法指令可能被翻譯為計算機的加法,除法指令可能被翻譯為位移操作等)。所以一般來說時間復雜度都是概略的估計,而不是一種精確地表示。

    n需要無窮大

    算法的優異在n比較小的時候可能沒有太大差異,甚至優秀的算法,有可能在n比較小的時候,計算次數會更多。這個時候算法的優劣帶來的問題并不明顯,一般沒有太大討論的意義。

    一個數量級大小判斷經驗

    復雜度與時間效率的關系:

    c < log2n < n < n*log2n < n^2 < n^3 < 2^n < 3^n < n! (c是一個常量) |--------------------------|--------------------------|-------------|較好 一般 較差其中c是一個常量,如果一個算法的復雜度為c 、 log2n 、n 、 n*log2n,那么這個算法時間效率比較高 如果是 2^n , 3^n ,n!,算法效率就比較低(當然也會有一些沒有辦法優化的代碼) 中間的幾個效率尚可。

    總結

    以上是生活随笔為你收集整理的一文彻底掌握时间复杂度和大O表示法的全部內容,希望文章能夠幫你解決所遇到的問題。

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