![ace60e1d6d42a041ed40876c700d1b30.png](https://img-blog.csdnimg.cn/img_convert/ace60e1d6d42a041ed40876c700d1b30.png)
1.1什么是数据结构
1.1.1
如果把数据结构比作是摆放书的话,问题大概就是
1.新书怎么插入
2.怎么找到指定的书
3.空间如何分配
4.类别应该分多细
总结:解决问题方法的效率,与数据的组织方式有关。
1.1.2
问题:打印1000000个数字在电脑屏幕上(1到1000000)。
方法1:循环实现。
方法2:递归实现。
结果方法2罢工了,方法1正常,因为方法2空间不够,所以不行。
总结:解决问题方法的效率,跟空间的利用效率有关。
1.1.3
工具知识:
clock()工具
clock():捕捉从程序开始运行到clock()被调用时所耗费的时间。这个 时间单位是clock tick,即“时钟打点”。
常数CLK_TCK(或CLOCKS_PER_SEC):机器时钟每秒所走的时钟打点数。
具体操作
![47e3d18ba8ed3ff47f710fb6960e066f.png](https://img-blog.csdnimg.cn/img_convert/47e3d18ba8ed3ff47f710fb6960e066f.png)
1.先调用time库
2.clock_t是clock()函数返回的变量类型,就跟啥double一样。我们定义两个节点。
3.start那行开始,我们具体得去操作,计时。
(有时候跑一次太快,那么我们就跑很多次求平均呗)
![2d87732638c9321d939751092d04dcf6.png](https://img-blog.csdnimg.cn/img_convert/2d87732638c9321d939751092d04dcf6.png)
本节的例子是关于代码运行的快慢,根据姥姥所言(验证过了)方法一比较慢,会被专业程序员鄙视,而方法二比较快。
总结:解决问题方法的效率,有时候跟算法的巧妙程度有关。
1.1.4
什么是数据结构?数据结构就是数据对象在计算机中的组织方式。这些数据对象不是孤立的,而是与很多操作相关联,完成这些操作所使用的方法就叫做算法。
而数据对象要关乎到其逻辑结构(比如什么线性结构,树啊之类的)+物理存储结构。
![fbb1aff3fbcec28fb2c6b05527d61292.png](https://img-blog.csdnimg.cn/img_convert/fbb1aff3fbcec28fb2c6b05527d61292.png)
1.2算法
1.2.1什么是算法
算法的相关特点:
1.一个有限指令集
2.可以有输入,也可以没有。
3.一定会有输出(要不然要这个算法干嘛呢)。
4.在有限步骤后会停止。
5.每一条指令都必须
(1)目标明确,没有歧义。
(2)计算机要能处理
(3)不依赖于具体某个语言
1.2.2 什么是好的算法
鉴定标准有两个:空间复杂度S(n)和时间复杂度T(n)
![b93f5c2604a58e56e5a788586826f279.png](https://img-blog.csdnimg.cn/img_convert/b93f5c2604a58e56e5a788586826f279.png)
就比如1.1里面输出一个非常大的数,循环的话不存在程序调用,所以不存在空间不够用的问题,而递归则调用了好多好多,空间爆掉了。
又比如求多项式值的那个问题,因为机器处理加减法速度特别快,而处理乘除法要慢很多
就比如这个算法1:
![894403f8c041f782f7ea821525cd177f.png](https://img-blog.csdnimg.cn/img_convert/894403f8c041f782f7ea821525cd177f.png)
里面涉及到了pow(x,i),这是乘方,也就是要×很多遍,我们就可以看到,i等于1,×一次,i=n,×n次,这样我们就可以看见最后一共进行了
而我们对比一下,算法2的时间复杂度是这样的
![a937ff667744c1550fd26b0552069f07.png](https://img-blog.csdnimg.cn/img_convert/a937ff667744c1550fd26b0552069f07.png)
我们可以看到,这里面没有复杂的乘方,所以乘法比较少,每一次只要乘一下就好了,我们就可以看见,时间复杂度是这样的
C1,C2,C每台机器都不同,平方都很浪费时间,所以算法2时间比较好。
而我们这面对效率问题时,往往用用到下面这两个指标,
![ce042d2c0b30d07f3794678ed3e5084c.png](https://img-blog.csdnimg.cn/img_convert/ce042d2c0b30d07f3794678ed3e5084c.png)
一般都是考虑最坏复杂度(因为平均难算)。
1.2.3复杂度的渐进表示法
![4120eab62d3c2bb1f306a9357f89fb46.png](https://img-blog.csdnimg.cn/img_convert/4120eab62d3c2bb1f306a9357f89fb46.png)
一个函数总是有多个上界,多个下界,但是因为我们要尽量真实,所以我们一般都是选择较大的下界和较小的上界。
下面我们用两张图来感性认识一下:log的底数是2,我们可以发现,阶乘很麻烦,所以设计算法要尽量避免阶乘。
![8cf935190f57908fc52c39a5fff62649.png](https://img-blog.csdnimg.cn/img_convert/8cf935190f57908fc52c39a5fff62649.png)
![918b55a0edae70dfc352af27c3bc8af9.png](https://img-blog.csdnimg.cn/img_convert/918b55a0edae70dfc352af27c3bc8af9.png)
因为
下面是一些复杂度分析的小窍门:
![f13bb414c1b86747fd014946ee8558b7.png](https://img-blog.csdnimg.cn/img_convert/f13bb414c1b86747fd014946ee8558b7.png)
![2d0a88e663f02e139481e9f59dbe8e7b.png](https://img-blog.csdnimg.cn/img_convert/2d0a88e663f02e139481e9f59dbe8e7b.png)
1.3应用实例:最大子列和问题
![fe493771d7378b17f394af93ff6bf440.png](https://img-blog.csdnimg.cn/img_convert/fe493771d7378b17f394af93ff6bf440.png)
比如我们比较下面这两个算法:算法1三次循环
![e04c19e8944875a7ed7e2f2d4657df93.png](https://img-blog.csdnimg.cn/img_convert/e04c19e8944875a7ed7e2f2d4657df93.png)
算法2两次循环,这样就可以提高效率。但是作为一个专业的程序员,我们应该接着把平方朝着
![e5407f93ce8d0d0d93cfe37502fb374e.png](https://img-blog.csdnimg.cn/img_convert/e5407f93ce8d0d0d93cfe37502fb374e.png)
算法3:分而治之,就是把大问题分成小块,解决,汇总。根据姥姥所言,我们可以看见,大致思想就是下面这一串数,就先把他分成两段,然后每段再分,但是段与段之间连接的时候,又不是单纯的拼凑一下就好了,而应该再多几步算法。
我们要控制最后的最后T(XXX)转化为最简单的O(1),XXX转化成1,比如我们这一题里面我们看见
![c9f257061bdb38e24eb179f455f9ec1c.png](https://img-blog.csdnimg.cn/img_convert/c9f257061bdb38e24eb179f455f9ec1c.png)
算法4::在线处理,算法效率极高,O(N)。大概意思就是你要是是负数,那就抛弃之前的一切,如果是正数,那还行。
“ 在线”的意思是指每输入一个数据就进行 的意思是指每输入一个数据就进行 即时处理,在任何一个地方中止输入,算法都能正确给出当前的解。
![3e0a238670faa057bd5424c86535d5de.png](https://img-blog.csdnimg.cn/img_convert/3e0a238670faa057bd5424c86535d5de.png)