算法

算法定义

算法是一系列解决问题的清晰指令

算法代表着用系统的方法描述解决问题的策略机制

也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出

如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题

不同的算法可能用不同的时间、空间或效率来完成同样的任务

算法的优劣可以用空间复杂度时间复杂度来衡量

分类

  • 有限的,确定性算法: 这类算法在有限的一段时间内终止。他们可能要花很长时间来执行指定的任务,但仍将在一定的时间内终止,这类算法得出的结果常取决于输入值

  • 有限的,非确定算法: 这类算法在有限的时间内终止。然而,对于一个(或一些)给定的数值,算法的结果并不是唯一的或确定的

  • 无限的算法: 是那些由于没有定义终止定义条件,或定义的条件无法由输入的数据满足而不终止运行的算法

    通常,无限算法的产生是由于未能确定的定义终止条件

算法复杂度

定义

算法复杂度,即算法在编写写成可执行程序后,运行时所需要的资源,资源包括时间资源内存资源

复杂度表示

我们记一个算法的复杂度为O(n),表示数据规模为n的情况下,算法使用的时间和空间资源

也可以用O(n)描述,代码执行花费的时间和空间随着n增大变化的趋势

算法复杂度从时间上考虑是时间复杂度(快不快),从空间上考虑是空间复杂度(占的内存多不多)

时间复杂度

时间复杂度的四种类型

  1. 最好时间复杂度

    指的是在理想情况(最好情况)下,执行这段代码的时间复杂度

  2. 最坏时间复杂度

    指的是在最坏情况下,执行这段代码的时间复杂度

  3. 平均时间复杂度

    指的是概率论中的加权平均值,也叫作期望值,所以平均时间复杂度的全称应该叫加权平均时间复杂度或者期望时间复杂度

    其中$A(n)$表示平均时间复杂度,$S$是规模为$n$的实例集,实例$ I \in S$的概率为$P_I$,算法对实例$I$执行的基本运算次数是$t_I$

  4. 均摊时间复杂度

    均摊时间复杂度(amortized time complexity),它对应的分析方法为摊还分析或者平摊分析

    听起来与平均时间复杂度有点类似,比较容易弄混,平均复杂度只在某些特殊情况下才会用到

    而均摊时间复杂度应用的场景比它更加特殊、更加有限

    对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上

在能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情况时间复杂度

空间复杂度

时间复杂度的全称是渐进时间复杂度,表示算法的执行时间与数据规模之间的增长关系

类比一下,空间复杂度全称就是渐进空间复杂度,表示算法的存储空间与数据规模之间的增长关系

它的分析规则与时间复杂度一样,也是只要高阶项,不要低阶项

算法种类

🌿暂时留坑,后续总结算法时再慢慢补

基本算法

  1. 枚举
  2. 贪心
  3. 递归和分治
  4. 递推
  5. 排序算法

图算法

哈夫曼编码,树的遍历,最短路径算法,最小生成树算法

数据结构

代数算法