数据结构(二)之算法基础
一.為什么要學習算法?
先來個簡單的算法比較:求sum=1+2+3+...+(n-1)+n的結果. 輸入整數n,輸出 sum
解法一:for循環
} return s; //執行1次
}
解法二:
function sum(n){return n*(n-1)/2; //執行1次}很明顯,解法二要優于解法一。因為解法二需要運算的次數少。我們去衡量一個算法的好壞主要是從時間復雜度和空間復雜度來看的,其次才到可讀性,可維護性。那么接下來講講怎么來計算時間復雜度與空間復雜度。
二.時間復雜度的計算:
推導大O階來計時間復雜度
規則:1.用常數1取代運行時間中的所有加法常數(即常數階都計為O(1) );
2.在修改后的運行次數函數中,只保留最高階項;
3.如果最高階項存在且不是1,則去除與這個項相乘的常數
? 解法一的運行次數: f1(n) = 1+n+1+1=n+3 次 時間復雜度記作 T(n) = O( f1(n) ) //n+3直接舍掉常數,變為n ,名為“線性階”
解法二的運行次數: f2(n) = 1次 時間復雜度記作 T(n) = O( f1(1) ) //名為“常數階”
由此可知解法一隨n的增加,運行次數也增加,而解法二始終只需運行一次
對數階:
function count(n){var c=1; //執行1次while(c<n){c=c*2; //執行log2n次 } return c; }?
也就是說2的多少次冪大于n,就運行了多少次。時間復雜度計做O(logn),名為對數階。平方階: function num(n){var count=0;for(var i=0;i<n;i++){ //執行 n 次for(var j=i;j<n;j++){count++; //執行 n-i 次}}return count; }
?
? 以上代碼執行總次數為n+(n-1)+(n-2)+...+1 = n2/2+n/2 次,用大O推導法去掉相加常數n/2,去掉相乘常數1/2,所以時間復雜度為O(n2)總結:
時間復雜度有多種,這里是討論常見的階。常用的時間復雜雜耗時的時間從小到大依次為:
O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) <O(nn)
擴展:最壞時間復雜度
例:給出一個數組arr,里面有n個隨機數,找出arr中的指定數字。那么這個數字有可能出現在數組中的第一個位置,時間復雜度為O(1);也可能出現在數組最后一個位置,時間復雜度為O(n) ,從概率來說,平均查找時間應該是n/2次。
最壞時間復雜度從字面上就能理解,時間最長的情況,時間不會更長,情況不會更壞了。通常沒有特殊說明,我們計算的時間復雜度都為最壞時間復雜度?! ?/p>
三.算法空間復雜度
算法的空間復雜度并不是計算實際占用的空間,而是計算整個算法的輔助空間單元的個數,與問題的規模沒有關系。算法的空間復雜度S(n)定義為該算法所耗費空間的數量級。S(n)=O(f(n)) 若算法執行時所需要的輔助空間相對于輸入數據量n而言是一個常數,則稱這個算法的輔助空間為O(1)。通常,我們用時間復雜度來衡量算法的優略。
轉載于:https://www.cnblogs.com/zhoulin-circle/p/7413229.html
總結
以上是生活随笔為你收集整理的数据结构(二)之算法基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UEFI 文件类型.efi
- 下一篇: halcon边缘检测的方法及各种方法的适