我們通常用大o符號表示法表示時間複雜度,因為每行**的執行次數之和在同一臺計算機上與執行時間成正比,我們先來舉個例子
int ans =
0;for
(int i =
1; i <= n; i++
)
假設每行**執行時間相同,該**的執行次數 1+1+3n+1 = 3(n+1),這個演算法的耗時是隨著n的變化而變化,因此,我們可以簡化的將這個演算法的時間複雜度表示為:o(n),為什麼可以這樣簡化呢,因為大o符號表示法並不是用於來真實代表演算法的執行時間的,它是用來表示**執行時間的增長變化趨勢的。所以上面的例子中,如果n無限大的時候常數以及倍數意義不大。
常見的時間複雜度有:
時間複雜度不斷增大,演算法的執行效率越低
求時間複雜度
⑴ 找出演算法中的基本語句;
演算法中執行次數最多的那條語句就是基本語句,通常是最內層迴圈的迴圈體。
⑵ 計算基本語句的執行次數的數量級;
只需計算基本語句執行次數的數量級,這就意味著只要保證基本語句執行次數的函式中的最高次冪正確即可,可以忽略所有低次冪和最高次冪的係數。這樣能夠簡化演算法分析,並且使注意力集中在最重要的一點上:增長率。
⑶ 用大ο記號表示演算法的時間效能。
將基本語句執行次數的數量級放入大ο記號中。
常數階o(1)
無論**執行了多少行,只要沒有迴圈等複雜結構,**執行行數時確定的數字,那這個**的時間複雜度就都是o(1),如:
int i =1;
int j =2;
++i;
j++;
int m = i + j;
m++;
線性階o(n)
一層迴圈中的**都為線性階如上面的例子
int ans =
0;for
(int i =
1; i <= n; i++
)
他們的時間複雜度為o(n);
對數階o(logn)
先看**
int i =1;
while
(i
每次迴圈i都翻倍,i就離n就越來越近,假設x次後i大於等於n,2x >= n 於是 x = log以2為底n的對數
時間複雜度可簡寫為o(logn);
線性對數階o(n*logn)
將時間複雜度為o(logn)的**迴圈n遍的話,那麼它的時間複雜度就是 n * o(logn),也就是了o(nlogn)。
for
(m=1
; m)}
o(n2) 及 o(n3)
巢狀2層或3層迴圈
常用演算法的時間複雜度
應注意
空間複雜度定義為演算法臨時占用的記憶體空間,題目中通常為128mb
當乙個演算法的空間複雜度為乙個常量,即不隨被處理資料量n的大小而改變時,可表示為o(1)。
當乙個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為0(10g2n);
當乙個演算法的空間複雜度與n成線性比例關係時,可表示為0(n).若形參為陣列,則只需要為它分配乙個儲存由實參傳送來的乙個位址指標的空間,即乙個機器字長空間;
若形參為引用方式,則也只需要為其分配儲存乙個位址的空間,用它來儲存對應實參變數的位址,以便由系統自動引用實參變數。
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...