《大话数据结构》第二章知识点

这一章的内容非常的简单,主要介绍了什么是算法,以及数据结构与算法的关系,算法的特性,算法效率的度量方法,常见的时间的复杂度,都是一些理论知识。

算法

算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令不是一个或者多个操作。

数据结构与算法的关系

数据结构与算法是相辅相成的,一个适合的数据结构是一个好算法的基石。在后面链表,队列,字符串,二叉树,图等数据结构会有一个明显的体验,我们先了解就行了。

两种算法的比较

书上介绍了例子就是大家见到最多,讲的也最多的例子,就是1到100求和的算法。

//循环求和,时间复杂度为O(n)
#include <iostream>
using namespace std;

int main()
{
   for(int i=1;i<=100;i++)
   {
	   int sum=0;
	   sum+=i;
   }
   cout<<sum<<endl;
   return 0;
}
//高斯求和,时间复杂度O(1)
#include <iostream>
using namespace std;

int main()
{
   int n=100,sum;
	sum=n*(n+1)/2;
	cout<<sum;
   return 0;
}

虽然程序很简单,但是我可以明显感受到不同算法带来的效率是明显的,特别对于非常大的数据集来说。

算法的特性

1、输入输出
算法具有零个或者输入多个输入,但是至少有一个或者多个输出。
这里可能对于零个输入有疑惑,举个例子

//这个程序就不用你输入参数,就是零输入
#include <iostream>
using namespace std;

int main()
{
   cout<<"hello world"<<endl;
   return 0;
}
#include <iostream>
using namespace std;

int main()
{
	int n;
	cin>>n;//这里就需要你输入一个n参数
   for(int i=0;i<n;i++)
   {
	   cout<<i<<endl;
   }
   return 0;
}

2、有穷性
有穷性:指算法在执行有限的步骤之后,自动结束而不会出现无限循环,并且每一个步骤在可接受的时间内完成。提一句,操作系统就不是算法,它不会结束,除非关机。

3、确定性
确定性:算法每一步步骤都有具体确定的含义,不会出现二义性。在执行过程中,如果出现歧义性,那么程序可能就会崩溃。

4、可行性
可行性:算法的每一步都必须是可行的,也就是说每一步都能通过执行有限次数完成。可行性意味着算法可以转换为程序上级运行,并得到正确的结果。

算法的设计要求

1、正确性
正确性:
算法的正确性是指算法至少应该具有输入,输出和加工处理无歧义、能正确反映问题的需求、能够得到问题的正确答案。

算法的“正确”通常在用法上有很大的差别,大体分为以下四个层次。
①算法程序没有语法错误。
②算法程序对于合法的输入数据能够产生满足要求的输出结果。
③算法程序对于非法的输入数据能够得出满足规格说明的结果。
④算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的结果。
以上者四点在刷题的时候,深有体会,都是泪。

2、可读性
可读性:算法设计的另一目的是为了阅读、理解和交流。写出方便自己阅读,方便别人阅读的代码是一个非常好的习惯,代码只有自己能看懂,有时候不是一件好事。

3、健壮性
健壮性:当输入的数据不合法时,算法也能做出相关处理,产生异常或莫名其妙的结果。

4、时间效率高和存储量低
设计算法应该尽量满足时间效率高和存储量低的需求。

算法效率的度量方法

1、事后统计方法:这种方法主要是通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

这种方法存在问题的
①和机器性能有关:如超级计算机 vs 单片机
②和编程语言有关,越高级执行效率越低
③和编译程序产生的机器指令有关
④有些算法是不能事后再统计的,如导弹控制算法
这种方法缺陷太多,一般知道就行,基本不考虑

2、事前分析估算方法
事前分析估算方法:在计算机编制前,依据统计方法进行估算。

事先预估算法时间开销T(n)与问题规模n的关系(T表示time)。就是利用大O记法去提前估计算法的时间复杂度。

函数的渐近增长

这个地方直接上图,高数学过的,直接就明白了

在这里插入图片描述

时间复杂度

当问题规模n足够大时,可以只考虑阶数高的部分,大0表示“同阶”,同等数量级,即,当n->无穷,二者之比为常数。

加法规则:多项相加,只保留最高阶的项,且系数变为1
T(n)=T1(n)+T2(n)=O(f(n))+O(g(n))=O(max(f(n),g(n)))

乘法规则:多项相乘,都保留
T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n))

常见的时间复杂度
O(1)<O(log2n)<O(n)<O(nlong2n)<O(n2)<O(n3)<O(2n)<O(n!)<O(nn)

结论1:顺序执行的代码只会影响常数项,可以忽略
结论2:只需挑循环中的一个基本操作分析它的执行次数与n的关系即可。
结论3:如果有多层嵌套循环,只需要关注最深处循环了几次

最坏时间复杂度:最坏情况下算法的时间复杂度
平均复杂度:所有输入示例等概率出现的情况下,算法的期待运行时间

算法的性能问题只有在n很大时才会暴露出来

空间复杂度

程序运行时的内存需求,无论问题规模怎么变,算法运行所需的内存空间都是固定的常量,算法空间复杂度为S(n)=O(1) S表示space,只需关注存储空间大小与问题规模相关的变量,递归调用的空间复杂度:搜索函数调用栈。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值