計算任意n個整數之和。
使用不同的演算法求和,比較優劣。
典型演算法
int sum_array_claassical(int a,int n)
該演算法複雜度:t(
n)=o
(n)
線性遞迴
遞迴:減而治之,將大問題分解成乙個小的子問題和另乙個稍大的問題,一步一步自頂向下分解稍大問題,最終解決問題。
int sum_array_recursion(int a,int n)
複雜度分析:
1)遞迴跟蹤分析:檢查每個例項,累計時間。
sum(a,n)->sum(a,n-1)->sum(a,n-2)->…->sum(a,1)->sum(a,0)
因此 t(n
)=o(
n)
2)遞推方程分析:由遞迴關係求複雜度遞推方程。
遞迴基:sum(a,0) =>t(0)=o(1)
遞推方程: t(
n)=t
(n−1
)+o(
1)=t
(n−2
)+o(
1)+o
(1)=
t(n−
3)+o
(1)+
o(1)
+o(1
)=..
....
=o(1
)+..
.+o(
1)+o
(1)+
o(1)
=n∗o
(1)=
o(n)
由以上可知:t(n)=o(n)
尾遞迴(拓展)
尾遞迴實際就是線性迭代。參考csdn上的一篇部落格:**線性遞迴和尾遞迴
二分遞迴
實質就是將陣列逐級分解到單個元素,再將單個元素返回求和累加,注意最後的return
語句的右半部分的起始序號必須加1,否則會進入死迴圈。
int sum_array_dichotomy(int a,int lo,in hi)
t(
n)=o
(n)
比較不同版本的陣列倒置演算法,統一介面void reverse(int *a,int lo,int hi).
遞迴版
//核心部分
if(lo
迭代版//迭代原始版
next;
if(lo--;
goto next;
}
//迭代精簡版
while(loa[lo++],a[hi++]);
資料結構學習筆記(1) 緒論
好了進入正題吧!資料結構是一門 研究非數值計算的程式設計問題中 的操作物件,以及它們之間的關係和操作等相關問題的學科。程式設計 資料結構 演算法 資料 是描述客觀事物的符號,是計算機中可以操作的物件,是能被計算機識別,並輸入給計算機處理的符號集合。資料元素 是組成資料的 有一定意義的基本單位 不是最...
資料結構學習筆記 資料結構緒論
資料 是描述客觀事物的符號,是計算機中可以操作的物件,是能夠被計算機識別,並輸入給計算機處理的符號集合。資料元素 是組成資料的 具有一定意義的基本單位,在計算機中通常作為整體處理。也被稱為記錄。資料項 乙個資料元素可以由若干資料項組成。資料項是資料不可分割的最小單位。資料物件 是性質相同的資料元素的...
資料結構學習筆記 1 資料結構緒論
1.1 資料結構起源 現實中,我們利用計算機更多的不是解決數值計算的問題,而是需要一些更科學有效的手段 比如表 樹和圖等資料結構 的幫助,才能更好地處理問題。資料結構是一門研究非數值計算的程式設計問題中的操作物件,以及它們之間的關係和操作等相關問題的學科。1.2 基本概念和術語 資料元素 是組成資料...