知識點
2.1 數學基礎
法則1:
如果t1(n)=o(f(n))且t2(n)=o(g(n)),那麼
(a) t1(n)+ t2(n)= o(f(n)+ g(n))或者t1(n)+ t2(n)= o(max(f(n), g(n)))
(b) t1(n)* t2(n)= o(f(n)* g(n))
法則2:
如果t(n)是乙個k次多項式,則t(n)=θ(n^k)
法則3:
對於任意常數k,(logn)^k=o(n)。它告訴我們對數增長得非常緩慢
2.2 模型
略2.3 要分析的問題
最大子串行和問題
2.4 執行時間計算
法則1-for迴圈
乙個for迴圈的執行時間至多是該for迴圈內部那些語句的執行時間乘以迭代的次數
法則2-巢狀的for迴圈
從裡向外分析這些迴圈。在一組巢狀迴圈內部的一條語句總的執行時間為該語句的執行時間乘以該組所有的for迴圈的大小的乘積
法則3-順序語句
將各個語句的執行時間求和即可,這意味著最大值就是所得的執行時間
法則4-if/else語句
乙個if/else語句的執行時間從不超過判斷的執行時間再加上s1和s2中執行時間長者的總的執行時間
最大子串行和問題的求解
演算法一:
三個巢狀for迴圈,其o(n^3);
演算法二:
兩個巢狀for迴圈,其o(n^2),主要是演算法一第三個迴圈計算時加和時重複計算,浪費資源
演算法三:
利用分治法,遞迴計算,其o(nlogn),主要是其將其中乙個迴圈的n變成以一半的進度縮減,不同於逐一縮減
演算法四:
屬於靈感演算法,其主要是依據數學規律及題目條件,其o(n)
執行時間中的對數
如果乙個演算法用常數時間將問題的大小削減為其一部分,一般為一半,那麼該演算法就是o(logn)。另一方面,如果使用常數時間只是把問題減少乙個常數的數量,如將問題減少1,那麼這種演算法是o(n)
折半查詢
要求序列排序,其只有o(logn)
歐幾里得演算法
求最大公因數演算法,遞迴出口為除數為0,此時被除數為最大公因數
假設被除數m,除數n。
如果m>n,則mmodn冪運算
通過將冪次減半,使其從o(n)變為o(logn)
對知識點的理解
1.f(n)和 g(n)之間的大o關係,可以通過洛必達法則進行處理。
若極限為常數,不為零,則兩者增長率相同,若0,則分子小於分母,而且是小o,同理,若無窮,分母小o分子
其實大o關係,就是看增長率,可以將兩邊不斷求導,直至一方為0,觀察另一方狀態可比較以得兩者關係
2.大o關係中一般不把常數因子寫進,因為對於大量的次數而言,其所起影響可以忽略不計
3.設計演算法要考慮不要浪費計算資源,前面已經算過的應該儲存起來,不要重新計算
另外,可以通過數學方法設計數學公式以改進遞迴方式,優化演算法時間
4.要注意演算法出口條件和演算法過程的設計,以保證演算法在周全計算的狀態下可被終止
疑惑與難點
1.研究求最小 的正子串行和是否存在o(n)的演算法
2.習題第26
第2章 演算法分析
最大子串行和問題的求解 演算法1 時間複雜度為o n 3 1 public static int maxsubsum1 int a 21617 return maxsum 18 演算法2 時間複雜度為o n 2 1 public static int maxsubsum2 int a 216 171...
第 2 章 演算法
演算法 是解決待定問題求解步驟的描述,在計算機中表現為指令的有限序列,並且每條指令表示乙個或多個操作。指演算法在執行有限的步驟後,自動結束而不會出現無限迴圈,並且每乙個步驟在可接受的時間內完成。演算法的每一步驟都具有確定的含義,不會出現二義性。演算法的每一步都必須是可行的,也就是說,每一步都能夠通過...
演算法導論第2章 演算法基礎
2.1 插入排序 includeusing namespace std void insertion sort int a,int n 宣告 void print int a,int n void insertion sort int a,int n a i 1 key void print int...