數據結構學習筆記(一)--時間復雜度
時間復雜度章節簡單,所以並不詳細講述。
時間復雜度的定義
事先預估算法時間開銷 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)
點擊進入下一篇:數據結構學習筆記(二)--空間復雜度