正在玩命加载中 . . .

数据结构和算法


算法绪论

定义

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

特性

  • 有穷性
  • 确定性
  • 可行性
  • 输入
  • 输出

设计的要求

  • 正确性
  • 可读性
  • 健壮性
  • 高效率
  • 低存储量

算法时间复杂度

算法时间复杂度一般用大O记法表示。一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。

推导大O阶

大O阶推导

得到的结果就是大O阶

常数阶

常数阶例子

该算法的时间复杂度为 **O(1)**。

注意

  • 不管常数(即执行次数)是多少,我们都记做 **O(1)**。
  • 对于分支结构,无论是真,是假,执行的次数都是恒定的。所以,单纯的分支结构(不包含在循环结构),其时间复杂度都是 **O(1)**)

线性阶

线性阶例子01

线性阶例子02

该段代码的循环的时间复杂度为 **O(n)**。因为循环体中的代码需要执行n次。

对数阶

对数阶例子

对数阶的大O

平方阶

平方阶例子01

以上例子,是一个循环嵌套,时间复杂度为 *O(n^2)**。如果外循环次数改为m次,时间复杂度为 **O(mn)**。

因此,总结出:循环的时间复杂度等于循环体的复杂度乘以该循环运行的次数。

平方阶例子02

方法调用时的时间复杂度

方法调用01

上面代码调用了函数 function:

方法调用02

function 函数的时间复杂度是 O(1),所以整体的时间复杂度是 O(n)。

假如 function 变为下面这样的:

方法调用03

上述的最终的时间复杂度为 O(n^2)。

下面的代码稍微复杂一点:

方法调用04

对于以上复杂代码,它的分析如下:

方法调用05

常见的时间复杂度

时间复杂度表

常用的时间复杂度所耗的时间从小到大依次是:

时间复杂度顺序

算法空间复杂度

线性表

单链表

链表是有序的列表,但是它在内存中是存储如下:

单链表示意图

小结:

  • 链表是以节点的方式来存储,是链式存储
  • 每个节点包含 data 域, next 域:指向下一个节点
  • 如图:发现链表的各个节点不一定是连续存储
  • 链表分带头节点的链表没有头节点的链表,根据实际的需求来确定

单链表(带头结点)逻辑结构示意图如下:

单链表示意图


文章作者: LogicVan
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 LogicVan !
评论
  目录