由于第一章比较简单,就不会写的很详细了...

02. 浙大《数据结构与算法》——基本概念 之 算法

02. 浙大《数据结构与算法》——基本概念 之 算法

02. 浙大《数据结构与算法》——基本概念 之 算法

02. 浙大《数据结构与算法》——基本概念 之 算法

02. 浙大《数据结构与算法》——基本概念 之 算法

02. 浙大《数据结构与算法》——基本概念 之 算法

空间复杂度太大,可能程序直接爆掉,时间复杂度太大,可能等了很长时间都等不出结果。

02. 浙大《数据结构与算法》——基本概念 之 算法

这个例子是我们前面看过的一个打印N个整数的,递归写出来的程序,我们说递归的程序在N=100000的时候,在机器上就非正常跳出了,到底发生了什么事情呢?我们这来仔细的看一下,假设在内存里面有这么一块空间,这个程序可以用的,我们开始调用PrintN,然后把100000作为参数传给它,这个时候程序做了一件什么事情呢?这个N传进来判断了一下N不等于0,于是递归调用PrintN,调用这个函数之前,你的系统需要把当前的函数所有现有的状态都存到系统内存的某一个地方,

02. 浙大《数据结构与算法》——基本概念 之 算法

那我在这写100000,并不是说占了100000个格子,而是说这块空间是为了PrintN(100000)这个程序而存储的,把它当前的状态先存下来,然后我们再去执行PrintN(N-1)这个函数,执行完了以后,系统会把这些存储的状态再恢复回来,接着执行这个函数的下一句,因为它是一个递归调用的,于是下一步就是调用PrintN(99999),然后进去以后发现,我们先得调用PrintN(99998),于是这个程序所有的变量要被存一下,然后调用PrintN(99998),然后继续存,继续存,一直到最后什么时候可以返回了呢?当我们调用PrintN(0)的时候可以返回,那么在调用PrintN(0)之前,我们必定调用了PrintN(1),所以最后存在系统里的一块内容应该是PrintN(1)这个函数所有的当前的状态,于是我们就发现它在内存里面占用的空间的数量,实际上跟我N原始的大小成正比的,也就是空间复杂度作为一个N的函数的话,是一个常数乘以N,也就是随着N来做线性增长的,当这个N非常非常大的时候,你的程序可以用的空间是有限的,它把它有限的空间用爆掉了,所以它就非正常退出了。

02. 浙大《数据结构与算法》——基本概念 之 算法

那我们再去回想一下那个循环实现的那个程序它有没有那样的问题呢?在那个程序里它只用了临时变量和for循环,它没有涉及到任何程序调用的问题,所以不管N有多大,它占用的空间始终都是一个固定的,它占用空间的量不会随着N的增长而增长,所以它的空间占用始终是一个常量,所以它永远是没问题的,而这个递归函数就会是有问题的。

02. 浙大《数据结构与算法》——基本概念 之 算法

接下来的例子回顾一下求多项式的值,有一个函数特别傻,有一个函数很聪明,而事实上我们也发现第二个函数比第一个函数快很多,具体为什么会这样呢?我们在分析一个函数运行效率的时候,在一个这么简单的函数里面,它只有加减乘除,机器运算加减法的速度比乘除要快很多,所以我们基本上就是在数函数到底做了多少次乘除法,加减法可以忽略不计,那我们现在就来具体的数一下,它到底做了多少次乘法,上面一种笨的算法,这个for循环一共执行了n次,pow函数算的是x的i次方,简单的计算累乘的方法,x的i次方就是做了i-1次乘法,然后再加上跟前面的系数相乘(a[i] * pow(x, i)),每一次循环里面执行的是i次乘法,于是乘法的总次数就是从1一直加到n,第二个程序真的是每一个循环里面就只有一次乘法,一共执行了n次循环,所以非常简单,一共就只做了n次乘法

02. 浙大《数据结构与算法》——基本概念 之 算法

所以当我们用时间复杂度这个概念去描述它的时候,

02. 浙大《数据结构与算法》——基本概念 之 算法

02. 浙大《数据结构与算法》——基本概念 之 算法

我们关心的就是最坏情况的复杂度,平均时间复杂度并不好计算和分析

当我们在分析算法的时间复杂度的时候,我们真的很有必要一步一步的去数它把哪个操作做了多少次吗?有这个必要吗?其实是没有这个必要的,其实我们关心的只是说随着要处理的数据增大,然后它这个复杂度增长的性质会怎么样?比如说当我们在比较前面两个算法的时候,我们只要知道第一个算法它的时间复杂度,当n很大的时候,基本上就是 02. 浙大《数据结构与算法》——基本概念 之 算法 在起主要作用了,第二个算法呢,当n很大的时候呢,是n在起主要作用,所以我们比较一下, 02. 浙大《数据结构与算法》——基本概念 之 算法 和 02. 浙大《数据结构与算法》——基本概念 之 算法 ,当n充分大的时候,第一个算法肯定是比第二个算法要慢的,知道这点就可以了,所以我们从来不对算法做非常精细的分析,我们只初略的知道它的一个增长趋势就可以,于是就有了复杂度的渐进表示法

02. 浙大《数据结构与算法》——基本概念 之 算法

当我们在讨论 02. 浙大《数据结构与算法》——基本概念 之 算法 的时候,即上界和下界的时候,我们要注意到一个函数的上界和下界其实不是唯一的,它可以有无穷多个,比如说我们一个算法的复杂度,是n的常数倍,那我可以把它写成是 02. 浙大《数据结构与算法》——基本概念 之 算法 的,也可以写成 02. 浙大《数据结构与算法》——基本概念 之 算法 , 还可以写成 02. 浙大《数据结构与算法》——基本概念 之 算法 ,我可以有无穷多种写法,下界也是一样,但是太大的上界和太小的下界对我们分析一个算法的效率而言是没有什么帮助的,我们分析算法效率的时候,总归是希望不管是上界还是下界都尽可能跟它的真实情况贴的越近越好,所以我们在写 02. 浙大《数据结构与算法》——基本概念 之 算法什么什么的时候,我们一般取的是我们能找到的最小的上界,当我们在写 02. 浙大《数据结构与算法》——基本概念 之 算法 的时候,通常写的是我们能力范围内找到的最大的下界。

02. 浙大《数据结构与算法》——基本概念 之 算法

这张图就是不同的函数随着n的增长,它的增长的速度,第一行给出的输入规模n, 第一列给的是函数,这里的logn到底是以2为底,以10为底,以e为底,并不重要,

02. 浙大《数据结构与算法》——基本概念 之 算法

02. 浙大《数据结构与算法》——基本概念 之 算法

02. 浙大《数据结构与算法》——基本概念 之 算法

相关文章:

  • 2021-06-19
  • 2021-12-19
  • 2021-12-19
  • 2021-12-15
  • 2022-01-11
  • 2022-02-11
  • 2022-12-23
猜你喜欢
  • 2021-08-20
  • 2021-12-02
  • 2021-03-31
  • 2021-04-13
  • 2021-06-23
  • 2021-12-15
  • 2021-03-29
相关资源
相似解决方案