《我的第一本算法书》学习笔记



数据结构

数据结构的性状大致有两种,线形数据结构和树形数据结构。


链表

链表是线形的数据结构,有三种分类:单链表、双链表、循环链表。

单链表

单链表
单链表有以下特性:

  • 除了最后一个数据之外,其他数据都有一个指针,指向下一个数据的内存地址。

  • 插入、删除数据方便,但是访问数据困难。

  • 分散储存在内存中,如下图所示。

存储形式

数据插入步骤(将 Green 插到 Blue 之后):

  1. 将 Blue 的指针指向 Green 的内存地址。
  2. 将 Green 的指针指向 Yellow 的内存地址。

数据删除步骤(删除 Yellow):

  1. 将 Blue 的指针指向 Red 。

数据访问步骤(访问 Red):

  1. 从链表头部,开始查询,先匹配 Blue 和 Red,发现不是要找的数据,根据 Blue 的指针找到下一个数据 Yellow 。
  2. 匹配 Yellow ,发现不匹配,根据 Yellow 的指针找到下一个数据 Red 。
  3. 匹配 Red,找到数据。

时间复杂度分析:

  • 插入和删除操作只需要改变指针的指向,时间复杂度为 O(1)
  • 访问数据与链表的长度 n 有关,为O(n)

双链表
在这里插入图片描述
  双链表插入、删除、访问步骤和单链表一样,只不过修改指针的指向需要修改两个方向的指针。

  访问数据不同于单链表,只能从前往后遍历数据,双链表可以从后往前遍历数据。

  双链表访问数据可以双向遍历,更加方便,但是双向指针会耗费更多的储存空间,并且插入删除需要改变更多的指针的指向。

循环链表
循环链表
单链表最后一个数据的指针指向链表的头部,就构成了循环链表,循环链表没有头尾的概念。


数组

数组也是线形数据结构,不同于链表,数组访问数据非常方便,但是数据的插入和删除比较繁琐。

数组概念图如下所示:
在这里插入图片描述
并且数组里面的数据是连续存储在内存中,如下图所示:

数组存储形式

[] 中的数字表示该数据在数组中的第几个位置,每个数据有位置标记,访问自然非常简单(随机访问)。

插入数据步骤:

  1. 在数组末尾增加储存空间。
  2. 先将该位置和之后的所有数据往后移动一位,腾出位置。
  3. 将数据插入空位。

删除数据步骤:

  1. 将数据删除。
  2. 把该数据之后的所有数据往前移动一位来填充这个空位。
  3. 删除末尾多出来的储存空间。

时间复杂度分析:

  • 访问由于数组在内存中连续储存,可以计算出每个数据的位置,直接一步访问,时间复杂度为O(1) 。
  • 插入与删除数据的时间复杂度与数据的长度 n 和要插入、删除的位置有关,在头部进行插入、删除操作,需要移动 n 次数据,在尾部进行插入、删除操作,不需要移动数据。因此时间复杂度为O(n)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值