本章內容:
演算法(algorithm)為求解乙個問題需要遵循的、被清楚指定的簡單指令的集合。
ps:演算法的幾個特性這裡就不贅述。
為了比較計算演算法的效能,需要一些正式的系統架構來計算演算法的效能,引入一些數學公式,用來比較:
注:第一條定義的意義為t(n)的相對增長率小於等於f(n)的相對增長率。
第二條定義的意義為t(n)的相對增長率大於f(n)的相對增長率。
第三條定義的意義為t(n)的相對增長率等於f(n)的相對增長率。
第四條定義的意義為t(n)的相對增長率小於f(n)的相對增長率。
主要因素是所使用的演算法以及該演算法的輸入。
一般來說,若無相反的指定,則所需要的量是最壞情況下的執行時間。
最大的子串行和問題
ps:恩,沒錯,這本書居然把這道經常考的面試題當做分析演算法的講解例題。
解法一:
1view codeint maxsubsum(int a, intn)2
16return
maxsum;
17 }
執行時間為o(n3),主要執行時間取決於三重迴圈。
解法二:
1view codeint maxsubsum(int a, intn)2
16}17return
maxsum;
18 }
執行時間為o(n2),對第一這種方法進行了改進。
解法三:
1view codeint maxsubsum(int a, int left, int
right)225
26 maxrightbordersum = rightbordersum = 0;27
for (i = center + 1; i <= right; i++)
2833
34return max3(maxleftsum, maxrightsum, maxleftbordersum +maxrightbordersum);
35 }
執行時間為o(n*logn),該方法採用了分治的設計思想,運用遞迴進行實現。除了小輸入外,一定會比前兩個快。
值得一提的是分析該執行時間時運用到了學校上課講的遞推的思想,那我必須說一下了:
該演算法的時間可以用乙個線性時間o(n)加上兩個求解子串行問題的時間。即
ps:不清楚,這裡是加號,n在遞推時可以代替o(n)
令n=2k 且n為偶數,則有
首先t(n/2)=2*t(n/22)+n/2
所以t(n)=2*[2*t(n/22)+n/2]+n=22*t(n/22)+2*n
以此類推,有t(n)=2k*t(n/2k
)+k*n
=2k*t(1)+k*n
=n*1+k*n
又k=log2n,所以,t(n)=n+n*log2n,所以該演算法的執行時間為o(n*logn)
在這裡我們體會了如何分析演算法執行時間,演算法的執行時間還有其他的情況,如:
對數(二分查詢、歐幾里得演算法)
冪 (計算xn)
學會分析乙個演算法的複雜度是很重要的,以後有機會我們會深入拓展。
數值分析與演算法 讀書筆記(三)
線性方程組的直接解法 線性方程組 linear equation system 可寫成如下形式 a11x 1 a12 x2 a1n xn b 1a21x 1 a22 x2 a2n xn b 2 am 1x1 am2x 2 amnx n bm 若m n,這種線性方程組稱為超定方程組 若 m n,線性方...
演算法和資料機構學習筆記之佇列
init 初始化操作 enquene self,item 若佇列存在,插入新元素item到佇列中,並成為隊尾元素 dequene self 刪除佇列中隊頭元素,並返回隊頭元素 思路 陣列實現佇列時,要注意,隨著不斷進隊,出隊,head和tail都會持續往後移動。當tail移動到最右邊,即使陣列中還有...
演算法分析與實踐 作業13 讀書筆記
演算法競賽高階指南 讀書筆記 在學習了演算法設計與分析基礎這門課後,我還翻閱了 演算法競賽高階指南 這本書,這本書根據ccf noi資訊學奧利匹克競賽涉及的知識體系進行編寫,對計算機程式設計的基本技能 資料結構與演算法進行了深入的講解。我覺得通過這本書,我了解到的東西還是比較豐富的。比如字典樹的概念...