計算機的本質是計算,計算是尋找物件的規律,並從中找到技巧。計算的目標是高效,低耗。
演算法就是借助一定的工具,在一定的規則下,以明確而機械的形式來進行的計算。
演算法的主要特性:
乙個好的程式不僅要考慮資料結構與演算法,還要考慮效率,即:(資料結構+演算法)*效率 = 程式 => 應用。
演算法分析的兩個重要指標
定義:t(n) 為乙個演算法在最壞的情況下所需要操作的步驟。不同演算法之間的好壞主要看t(n)的大小,t(n)是遮蔽了計算機硬體差異,語言差異,編譯差異等差異之後的理想平台下的執行指標,如大o,大
ω ,大
θ 等。
一般的計算模型有圖靈模型與ram模型,它們均將演算法的運算時間轉換成演算法執行的基本操作次數。
圖靈機的三個組成要件
圖靈機狀態轉換過程 transform(q,c;f,l/r,p)
與圖靈機類似,均假設有無限空間
由一系列順序編號暫存器組成,但總數無限
演算法所執行的時間轉換成演算法運算時的次數
資料結構示意圖
資料結構的邏輯結構
資料結構的物理結構
演算法的效率主要看時間消耗與儲存空間消耗,這裡我們遮蔽儲存空間的消耗,僅僅考慮時間的消耗。
大o的定義:t(
n)=o
(f(n
)),f(
n)為乙個函式。當
c>
0 ,t(
n)f(n)
,即大o記號表示t(
n)的乙個上界,其性質為: 大ω
的定義:t(
n)=ω
(f(n
)),f(
n)為乙個函式。當
c>
0 ,t(
n)>c∗
f(n)
,即大o記號表示t(
n)的乙個下界。大θ
的定義:t(
n)=θ
(f(n
)),f(
n)為乙個函式。當c1
>c2
>
0 ,c1
∗f(n
)>t(
n)>c2
∗f(n
) ,即大o記號表示t(
n)的乙個區間。
大o記號的分類:
演算法分析主要有兩個任務:
複雜度的分析方法有三種:
算數級數:與末項的平方同階 t(
n)=1
+2+.
....
.+n=
n(n+
1)2=
o(n2
) 冪方級數:比冪次高出一階 t(
n)=1
4+24
+...
...+
n4=n
(n+1
)(2n
+1)(
3n2+
3n+1
)30=o
(n5)
幾何級數(a
>1)
:與末項同階 t(
n)=a
0+a1
+...
...+
an=a
n+1−
1a−1
=o(a
n)收斂級數:o(
1)可能未必收斂,但長度有限 t(
n)=1
+12+
....
..+1
n=o(
logn
) t(
n)=log2+
log3+.
....
.+logn
=log(n
!)=o
(nlogn
) 迴圈:一般隨著層數的增加指數式增長
遞迴跟蹤分析:檢查每個遞迴例項,累計所需時間(調入語句本身,計入對應的子例項),總和即為演算法執行時間。
演算法的兩種思想方法:分而治之,減而治之。
分而治之:將乙個問題分兩個規模大小差不多的子問題。
減而治之:將乙個問題分為乙個子問題和乙個規模縮減的問題。
動態規劃的目的:
遞迴對於資源的消耗大而且o(
n)比較大,然而迭代可以降低對儲存空間的使用,有時亦可以降低o(
n)子串行:由原序列中若干個元素,按原來相對次序排列而成的新的序列。
最長公共子串行(longest common subsequence, lcs)是兩個序列中,在其相同的子串行中長度最長的那個子串行,可能含有多個。
[1] 鄧俊輝《資料結構》
資料結構與演算法(緒論)
作為乙個準程式設計師,在讀本科的時候,就一直被老師不停的灌輸資料機構與演算法的重要性,但是好像我們從來就沒遇到過真正棘手的需要通過資料結構去解決的問題,可能唯一再聽到它的時候就是找工作實習的時候會被面試官提問,因此我們似乎覺得資料結構沒那麼重要,而且又因為各種程式語言,尤其是python,各種內建的...
資料結構與演算法 緒論
一般法則 法則1 for迴圈 乙個for迴圈的執行時間至多是該for迴圈內部那些語句的執行時間乘以迭代的次數。法則2 巢狀的for迴圈 從裡向外分析這些迴圈。在一組巢狀迴圈內部的一些語句總的執行時間為該語句的執行時間乘以該組所有的for迴圈的大小的乘積 例如,下列程式片斷為o n2 for i 0 ...
資料結構與演算法 緒論
重要性 使用者資訊表usersid name 001 bigsai man002 smallsai man003 菜虛鯤woman users的pojo物件 class users list和woman是資料 listlist 資料物件list listwoman 資料物件woman list.ad...