C++数据结构学习笔记(二)

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;//清除有序标志
			}
		}
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值