今天在看演算法時,遇見了一些問題,想了很久,現總結如下,關於for迴圈的時間複雜度。我們知道當一重for迴圈時
packagesuanfa;
public
class
fortest
}}}
這是最簡單的for迴圈,count執行n次,時間複雜度是n;
如果是for的二重迴圈呢
packagesuanfa;
public
class
fortest
system.out.println("k值為:"+k);
system.out.println("count值為 :"+count);
}}
可以看見count輸出4950;一般剛接觸時,就會覺得這事件複雜度是n的平方,當然一般這樣說也沒錯,但是你有沒想過,為什麼k輸入是100時,count輸出是4950,如果k是其他值呢,
count又會是什麼,兩者之間有什麼關係?如果for是三重迴圈又會是怎樣呢?
三重迴圈的情況如下:
packagesuanfa;
public
class
test
system.out.println("k值為:"+k);
system.out.println("count值為 :"+count);
}}
可以看見count輸出為161700,當然你也可以試著把k改小一點,當然你要試著**k和count的關係,在二重for迴圈、三重for迴圈、甚至
i 0 1 2 3 ...... n-2 n-1
j 1 2 3 4 ...... n-1.
當i為0時,j可取1到n-1,使得if語句能夠有效執行;同理i=1時,j可取2到n-1;
i=0; j = 1,2,3,4.....n-1;(if語句執行 (n-1)-1+1 次 即 n-1次)
i =1 ,j =2,3,4....n-1; (if語句執行 (n-1)-2+1 次 即n-2次)
i=2 , j =3,4,5...n-1;
i=n-2,j =n-1 (if語句執行一次)
可得if語句執行的總次數為: (n-1+1)(n-1-1+1)/2 = (n-1)*n/2,你也可以理解為c(2 n)(姑且這樣表示吧),這個東東不知道怎麼表示,就是和二項式係數有關的那個,2是上角標,n是下角標;
c(2 n)=n*(n-1)/(2*1);
三重迴圈時:假定k值為n;那麼要使if語句能夠執行;需滿足:
i 0 1 2 3 ...... n-3
j 1 2 3 4 ...... n-2.
x 2 3 4 5 ........ n-1
經過如上推算,可得 if語句執行總次數為 c(3 n) = n*(n-1)*(n-2)/(3*2*1)=n*(n-1)*(n-2)/6;
四重for迴圈 , 可得 if語句執行總次數為 c(3 n) = n*(n-1)*(n-2)*(n-4)/(4*3*2*1)=n*(n-1)*(n-2)/24;
關於時間複雜度
1.演算法複雜度分為 時間複雜度和空間複雜度。作用 時間複雜度是度量演算法執行的時間長短 而空間複雜度是度量演算法所需儲存空間的大小。2.一般情況下,演算法的基本操作重複執行的次數是模組n的某乙個函式f n 因此,演算法的時間複雜度記做 t n o f n 分析 隨著模組n的增大,演算法執行的時間的...
關於時間複雜度
關於時間複雜度 o 的定義 若f n 是正整數n的乙個函式,則o f n 表示 m 0 使得當n n0時,f n m f n0 表示時間複雜度的階有 o 1 常量時間階 o n 線性時間階 o n 對數時間階 o n n 線性對數時間階 o n k k 2,k次方時間階 例 兩個n階方陣的乘法 fo...
關於時間複雜度和空間複雜度
如何判別乙個演算法的好壞 首先,這個演算法必須是正確的 其次,好的演算法應具有幸福感,便於人們理解和交流,並且是機器可執行的。這個演算法還需要足夠健壯,即當輸入的資料非法或不合理時,也能適當的做出正確的反應或進行相應的處理 最後它還必須擁有高效率和低儲存量要求。也就是時間複雜度和空間複雜度佔的地方越...