数据结构和算法分析:第二章 算法分析
算法是為求解一個問題所要遵循的,被清楚指定的簡單指令的集合。
2.1 數學基礎
相對增長率
大O標記法
2.2 模型
為了正式的架構中分析算法,我們需要一個計算模型。我們的模型基本上是一臺標準的計算機,在機器中指令被順序的執行。
2.3 要分析的問題
通常,要分析的最重要的資源就是運行時間。有幾個因數影響著程序的運行時間。
因此只要有可能,使得算法足夠有效而不成為問題的瓶頸是十分重要的。
2.4 運行時間計算
大O是一個上界
2.4.2 一般法則
2.4.3 最大子序列求和問題的求解
時間復雜度O(N^3)
public static int maxSubSum1(int nums[]){int maxSum=0;for(int i=0; i< nums.length; i++){for(int j=i; j<nums.length;j++){int thisSum=0;for(int tmp=i;tmp<=j;tmp++){thisSum+=nums[tmp];}maxSum = maxSum > thisSum ? maxSum:thisSum;}}return maxSum;}時間復雜度O(N^2)
// 時間復雜度O(N^2)public static int maxSubSum2(int nums[]) {int maxSum = 0;for (int i = 0; i < nums.length; i++) {int thisSum = 0;for (int j = i; j < nums.length; j++) {thisSum += nums[j];maxSum = maxSum > thisSum ? maxSum : thisSum;}}return maxSum;}2.4.4 運行時間的對數
分析算法最混亂的方面大概是集中在對數方面。此外對數最常出現的規律可概括為以下法則:如果一個算法用常數時間(O(1))將問題的大小削減為其中一部分(通常為1/2),那么該算法就是O(㏒N)。另一方面,如果使用常數時間只是把問題減少為一個常數的數量(如將問題減少為1),那么這種算法就是O(N)。
- 折半查找
總結
時間復雜度
一個算法花費的時間與算法中語句的執行次數成正比例,哪個算法中語句執行次數多,它花費時間就多。一個算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)
在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。但有時我們想知道它變化時呈現什么規律。為此,我們引入時間復雜度概念。
一般情況下,算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近于無窮大時,T(n)/f(n)的極限值為不等于零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為算法的漸進時間復雜度,簡稱時間復雜度。
有時候,算法中基本操作重復執行的次數還隨問題的輸入數據集不同而不同,如在冒泡排序中,輸入數據有序而無序,其結果是不一樣的。此時,我們計算平均值。
常見的算法的時間 復雜度之間的關系為:
O(1)<O(logn)<O(n)<O(nlog n)<O(n2)<O(2n)<O(n!)<O(nn)
實例1
sum=0; //(1)for(i=1;i<=n;i++) //(2)for(j=1;j<=n;j++) //(3)sum++; //(4)語句(1)執行1次,
語句(2)執行n次
語句(3)執行n2次
語句(4)執行n2次
T(n) = 1+n+2n2= O(n2)
實例2
a=0; b=1; //(1)for (i=1;i<=n;i++) //(2){ s=a+b; //(3)b=a; //(4) a=s; //(5)}語句(1)執行1次,語句(2)執行n次語句(3)、(4)、(5)執行n次T(n) = 1+4n =O(n)**實例3** ```javai=1; //(1)while (i<=n)i=i*2; //(2)語句(1)的頻度是1,
設語句2的頻度是f(n),則:2f(n)<=n;f(n)<=log2n
取最大值f(n)= log2n,
T(n)=O(log2n )
空間復雜度
空間復雜度:算法所需存儲空間的度量,記作:
S(n)=O( f(n) )其中 n 為問題的規模。
一個算法在計算機存儲器上所占用的存儲空間,包括存儲算法本身所占用的存儲空間,算法的輸入輸出數據所占用的存儲空間和算法在運行過程中臨時占用的存儲空間這三個方面。如果額外空間相對于輸入數據量來說是個常數,則稱此算法是原地工作。
算法的輸入輸出數據所占用的存儲空間是由要解決的問題決定的,是通過參數表由調用函數傳遞而來的,它不隨本算法的不同而改變。存儲算法本身所占用的存儲空間與算法書寫的長短成正比,要壓縮這方面的存儲空間,就必須編寫出較短的算法。
總結
以上是生活随笔為你收集整理的数据结构和算法分析:第二章 算法分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark详解(十三):Spark St
- 下一篇: NIO详解(七):进程间通信(Mappe