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,0<d
c/d = max{x| d*x <=c}
= max{x|d*x<1+c}
算法:反复地从R[0] = 1+c中减去R[1] = d
统计在下溢之前,所做的减法的次数x
(RAM模型只支持+或-)
0 R[3]<-1 //increment
1 R[0]<-R[0]+R[3] //c++
2 R[0]<-R[0]-R[1] //c-=d
3 R[2]<-R[2]+R[3] //x++
4 IF R[0]>0 GOTO 2 //if c>0 goto2
5 R[0]<-R[2]-R[3] //else x--
6 STOP //return R[0]=x=c/d
实例2
S包含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中任取三个元素{x,y,z},如取前三个
S是集合,这三个元素必定互异
确定并排除其中的最小,最大者
输出剩下的元素z
T(n)=O(1)
实例4
冒泡排序
void bubblesort(int A[],int n)
{
for(bool sorted = false;sorted=!sorted;n--)
{
for(int i =1;i<n;i++)
{
if(A[i-1]>A[i])
{
swap(A[i-1],A[i]);
sorted = false;//清除有序标志
}
}
}
}