一文彻底掌握时间复杂度和大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*log2n2.計算出T(n)的數量級 ( 即找到輔助函數f(n) )
忽略掉T(n)中的常量、低次冪和最高次冪的系數
f(n) = n*log2n3.用大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。
特殊的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表示法的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: CCD、COMS,数字摄像头、模拟摄像头
- 下一篇: 3.SpringBoot整合Mybati
