C 資料結構學習筆記 二

2021-08-14 06:37:54 字數 1752 閱讀 9661

ram模型

ram:random access machine

暫存器順序編號,總數沒有限制

r[0],r[1],r[2]...

每一項操作僅需要常數時間

r[i]<-c                               r[i]<-r[r[j]]                 r[i]<-r[j]+r[k]

r[i]<-r[j]                           r[r[i]]<-r[j]                 r[i] <- r[j]-r[k]

if r[i] = 0 goto 1          if r[i]>0 goto 1          stop

與tm模型一樣,ram模型也是一般計算工具的簡化與抽象

t(n) = 演算法為求解規模為n的問題,所需要執行的基本操作次數

例項1用ram完成向下取整的除法,0<=c,0c/d = max

= max

演算法:反覆地從r[0] = 1+c中減去r[1] = d

統計在下溢之前,所做的減法的次數x

(ram模型只支援+或-)

0r[3]<-1 //increment

1r[0]<-r[0]+r[3]//c++

2r[0]<-r[0]-r[1]//c-=d

3r[2]<-r[2]+r[3]//x++

4if r[0]>0 goto 2//if c>0 goto2

5r[0]<-r[2]-r[3]//else x--

6stop //return r[0]=x=c/d

例項2s包含n個正整數,∑s = 2m

s是否有子集t,滿足∑t = m?

直覺:列舉s的每乙個子集,並統計元素的總和

集合子集的個數 = 2的s次方

這是乙個np-c問題,不存在可以在多項式時間內回答此問題的演算法,上述演算法是最優演算法。

演算法分析

主要任務 = 正確性 + 複雜度

複雜度分析的主要方法

迭代:級數求和

遞迴:遞推跟蹤+遞推方程

猜測+驗證

級數算術級數:與末項平方同階

t(n) = 1+2+3+...+n = n(n+1)/2 = o(n2)

冪方級數:比冪次高一階

t(n) = pow(1,2)+pow(2,2)+... = n(n+1)(2n+1)/6 = o(n3)

幾何級數:與末項同階

t(n) = pow(a,0)+pow(a,1)+pow(a,2)+...+pow(a,n) = (pow(a,n+1)-1)/(a-1)=o(pow(a,n))

收斂級數:o(1)

1/1/2+1/2/3+1/3/4+...+1/(n-1)/n=1-1/n=o(1)

調和級數:o(logn)

1+1/2+1/3+1/4+..+1/n = o(logn)

對數級數:o(nlogn)

log1+log2+log3+...+logn = log(n!)=o(nlogn)

例項3給定整數子集s,|s|=n>=3

找出元素a∈s,a!=max(s),且a!=min(s)

演算法:從s中任取三個元素,如取前三個

s是集合,這三個元素必定互異

確定並排除其中的最小,最大者

輸出剩下的元素z

t(n)=o(1)

例項4氣泡排序

void bubblesort(int a,int n)

} }}

資料結構學習筆記(二)

分類 順序儲存結構 順序表 鏈式儲存結構 鍊錶 比較 順序表 可以隨機訪問 占用連續空間,儲存分配只能預先進行,即靜態分配。一旦分配好了,在對其操作過程中不變 插入操作需要移動多個元素 鍊錶 不可以隨機訪問 不需要占用連續空間,動態分配。即在要建立新結點的時候再進行空間劃分。插入操作不需要移動多個元...

c 資料結構學習筆記

c 資料結構學習筆記 1 關於類的建構函式 在建構函式前加上explict關鍵字 就可以使建構函式只可以顯式呼叫,而不可以隱式呼叫。下面的例子說明的很清楚 classtest1 普通建構函式 private int num classtest2 explicit 顯式 建構函式 private in...

大話資料結構學習筆記(二)

測定執行時間最可靠的方法就是計算對執行時間有消耗的基本操作的執行次數。在評定演算法的優劣時,與最高次項相乘的常數並不重要,而與最高端項的階數有關。演算法時間複雜度 大o記法。o 1 常數階,o n 線性階,o n 2 平方階。推導大o階 1.用常數1取代執行時間中的所有加法常數 2.在修改後的執行次...