算法分析ch1概论

1.设计算法的目标
(1)正确性
(2)可使用性
(3)可读性
(4)健壮性:可容错
(5)高效率与低储存量需求
2.算法的特征
(1)有限性
(2)确定性
(3)可行性
(4)输入性:一个算法有0个或多个输入。
(5)输出性:一个算法有1个或多个输出。
3.分析算法是否有问题
eg1:void exam1() { int n; n=2; while(n%2==0) n=n+2; printf("%d\n",n); } 死循环,违反了有限性; eg2: void exam2() { int x,y; y=0; x=5/y; printf("%d,%d\n",x,y); }0错误,违反可行性;
eg3: 在带头节点的单链表h中查找第一个值为x的结点,找到后返回其逻辑序号(从1记起),否则返会0
int findx(LNode *h,int x)
{
LNode *p=h->next;
int i=0;
while (p->date!=x)
{ i++;
p=p>next;
}
return i;
}
当单链表首结点值为x时,该算法返回0,此时应该返回逻辑序号1.
当单链表中不存在值为x的结点时,该算法出错,因为p为Null时仍执行p=p>next
所以该算法不满足正确性和健壮性
4.算法和数据结构
算法和数据结构即有联系又有区别。
联系:数据结构是算法设计的基础。算法的操作对象是数据结构,在设计算法时通常要构建适合这种算法的数据结构。数据结构设计主要是选择数据的存储方式,算法设计就是在选定的存储结构上设计一个满足要求的好算法。
区别:数据结构关注的时数据的逻辑结构,存储结构以及基本操作,而算法关注如何在数据结构的基础上解决实际问题。算法是编程思想,数据结构则时这些思想的逻辑基础。
5.时间复杂度和空间复杂度
渐进符号(O"<="、 Ω大欧米噶">="、Θ西塔“=”)
g(n)为f(n)渐进的上界,记作f ( n ) = O ( g ( n ) )
这个上界的阶越低,评估越精确,越有价值。
g(n)为f(n)渐进的下界,记作f ( n ) = Ω ( g ( n ) )
 这个下界的阶越高,评估越精确,越有价值。
g(n)与f(n)同阶 ,记作 f ( n ) = Θ ( g ( n ) )
(1) 为什么用O?
因为它简化了增长数量级上界的描述,甚至也适合一些无法进行精确分析的复杂算法。
(2)分析时间复杂度
先找出算法的基本语句(执行次数最多的那条语句,通常是内层循环体);计算基本语句的执行次数的数量级,只需保留f(n)中的最高次幂。
eg1: void fun(int n)
{ int s=0,i,j,k;
for(i=0;i<=n;i++)
for(j=0;j<=i;j++)
for(k=0;k<=j;k++)
s++;
}
O(n3)
(3)算法最好最坏和平均情况
eg1 设计一个尽可能高效的算法,在长度为n的一维整型数组a[0…n-1]中查找值最大的元素max和值最小的元素min,并分析算法的最好最坏平均时间复杂度。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值