資料結構學習筆記(一)--時間複雜度
阿新 • • 發佈:2021-09-15
資料結構學習筆記(一)--時間複雜度
時間複雜度章節簡單,所以並不詳細講述。
時間複雜度的定義
事先預估演算法時間開銷 T(n) 與問題規模 n 的關係(T表示"Time")。
時間複雜度的具體計算
用c語言程式碼舉例:
//演算法1—— 逐步遞增型愛你 void loveYou(int n){ //n為問題規模 //語句1 int i = 1; //愛你的程度 //語句2 while(i<=n){ //語句3 i++; //語句4 printf("I Love You %d\n",i); } //語句5 printf("I Love You More Than %d\n",n); }
語句頻度:
- 一次
- 3001次
- 3000次
- 3000次
- 1次
時間開銷與問題規模n的關係為:
T(n) = 3n+3
即每行程式碼執行一次便加1
時間複雜度通用計算
一個演算法的時間開銷表示式可以只需考慮階數高的部分(高階部分的係數也化為1),只需考慮迴圈內的一個基本操作分析他的執行次數和問題規模n的關係。
例如:
T(n) = 3n+3; T(n) = O(n)
T(n) = n²+3n+10000; T(n) = O(n²)
加法規則
乘法規則
時間複雜度的大小排序
從小到大排序
口訣:常對冪指階
圖形顯示
巢狀迴圈的時間複雜度
利用加法規則與乘法規則,用c語言程式碼舉例:
//演算法2—— 巢狀迴圈型愛你 void loveYou(int n){ //n為問題規模 int i = 1; //愛你的程度 //外層迴圈執行n次 while(i<=n){ i++; //每次+1 printf("I Love You %d\n",i); //巢狀兩層迴圈 for(int j=1;j<=n;j++){ //內層迴圈共執行n²次 printf("I am Iron Man\n"); } } //語句5 printf("I Love You More Than %d\n",n); }
時間開銷與問題規模n的關係:
T(n) = O(n) + O(n²) = O(n²)
結論: 如有多層巢狀迴圈,只需考慮最深層迴圈的迴圈次數與n的關係
分情況討論時間複雜度
討論最好情況,最壞情況與平均情況的時間複雜度,一般只考慮最壞時間複雜度與平均時間複雜度。
用c語言程式碼舉例:
//演算法4—— 搜尋數字型愛你 void loveYou(int flag[],int n){ //flag陣列中亂序存放了1~n這些數字,n為問題規模 printf("I Am Iron Man\n"); for(int i=0;i<n;i++){//從第一個元素開始查詢 if(flag[i]==n){//找到元素n printf("I Love You %d\n",n); break;//找到後立即跳出迴圈 } } }
計算上述演算法的時間複雜度T(n)
- 最好情況:元素n在第一個位置 ---最好時間複雜度 T(n) = O(1)
- 最壞情況:元素n在最後一個位置 ---最壞時間複雜度 T(n) = O(n)
- 平均情況:假設元素n在任意一個位置的概率相同為1/n ---平均時間複雜度T(n) = (1+2+3+...+n)(1/n) = (1+n)/2 =O(n)