算法图解第二章笔记与习题(选择排序)

文章目录

  • 算法图解第二章笔记与习题(选择排序)
    • 2.2 数组和链表
      • 2.2.1 链表
      • 2.2.2 数组
      • 2.2.3 数组和链表的读取、插入和删除操作的时间复杂度
    • 2.3 选择排序
    • 2.4 小结
    • 练习
      • 习题2.1
      • 习题2.2
      • 习题2.3
      • 习题2.4
      • 习题2.5

2.2 数组和链表

2.2.1 链表

  • 链表在内存中通过每个元素存储下一个元素的地址,使得一系列随机的内存地址串在一起。

想要在链表中插入新的元素,只需要随机在内存中获取地址即可。

想要在链表中删除一个元素,只需要修改前一个元素指向的地址,使其跳过要删除的元素即可。

因此,链表易于插入删除,而不易于读取。

2.2.2 数组

  • 数组在内存中直接获取一块连续的地址,来存储数据。当数据量超过已有地址时,将无法继续存储,需要搬迁整个数组。

由于数组的内存地址是连续的,所以十分易于读取。但并不容易插入和删除。

2.2.3 数组和链表的读取、插入和删除操作的时间复杂度

- 数组 链表
读取 O(1)O(1)O(1) O(n)O(n)O(n)
插入 O(n)O(n)O(n) O(1)O(1)O(1)
删除 O(n)O(n)O(n) O(1)O(1)O(1)

2.3 选择排序

# 找出数组中的最小元素
def findSmallest(arr):# 存储最小的值smallest = arr[0]# 存储最小元素的索引smallest_index = 0for i in range(1, len(arr)):if arr[i] < smallest:smallest_index = ismallest = arr[i]      return smallest_index# 排序算法
def selectionSort(arr):newArr = []for i in range(len(arr)):# 找出数组中最小的元素,并将其加入到新的数组中smallest = findSmallest(arr)newArr.append(arr.pop(smallest))return newArr

2.4 小结

  • 需要存储多个元素时,可使用数组或链表。
  • 数组的元素都是连在一起的,就像一节节车厢。
  • 链表的元素是分散开的,其中每个元素都存储了下一个元素的地址。
  • 数组的读取速度很快。
  • 链表的插入和删除的速度很快。
  • 在同一个数组中,所有元素的类型都必须相同(都为int、double等)。

练习

习题2.1

  • 假设你要编写一个记账的应用程序。你每天都将所有支出记录下来,并在月底统计支出,算算当月花了多少钱。因此,你执行的插入操作很多,但读取操作很少。该使用数组还是链表呢?

插入操作很多,但读取操作很少。因此更适合用链表。

习题2.2

  • 假设你要为饭店创建一个接受顾客点菜单的应用程序。这个应用程序存储一系列点菜单。服务员添加点菜单,而厨师去除点菜单并制作菜肴。这是一个点菜单队列:服务员在队尾添加点菜单,厨师取出队列开头的点菜单并制作菜肴。

  • 你使用数组还是链表来实现这个队列呢?(提示:链表擅长插入和删除,而数组擅长随机访问。在这个应用程序中,你要执行的是哪些操作呢?)

链表,在这个应用程序中,使用的更多是插入和删除,因此选择链表。

习题2.3

  • 我们来做一个思考实验。假设Facebook记录一系列用户名,每当有用户试图登录Facebook时,都查找其用户名,如果找到就允许用户登录。由于经常有用户登录Facebook,因此需要执行大量的用户名查找操作。假设Facebook使用二分查找算法,而这种算法要求能随机访问——立即获取中间的用户名。考虑到这一点,应使用数组还是链表来存储用户名呢?

数组,在这个思考实验中,需求是能够随机访问。而数组相比起链表来说,更易于查询。

习题2.4

  • 经常有用户在Facebook注册。假设你已决定使用数组来存储用户名,在插入方面数组有何缺点呢?具体地说,在数组中添加新用户将出现什么情况?

在插入方面,数组容易内存不足,需要的操作也比较复杂,时间复杂度为O(n)O(n)O(n)。

具体地说,在数组中添加新用户时,首先需要判断剩余的内存空间是否富足,如果不足,则需要整体搬迁数组在内存中的地址,其次需要查找元素在数组中的位置,并将在它后面的所有元素后移一位,最多需要移动 nnn 位,这也是为什么在数组中添加新用户时其时间复杂度位O(n)O(n)O(n)的原因。

习题2.5

  • 实际上,Facebook存储用户信息使用的既不是数组也不是链表。假设Facebook使用的是一种混合数据:链表数组。这个数组包含有26个元素,每个元素都指向一个链表。例如,该数组的第一个元素指向的链表包含所有以A打头的用户名,第二个元素指向的链表包含所有以B打头的用户名,以此类推。

  • 假设Adit B在Facebook注册,而你需要将其加入前述的数据结构中。因此,你访问数组的第一个元素,在访问该元素指向的链表,并将Adit B添加到这个链表的结尾。现在你要查找Zakhir H。因此你访问第26个元素,再在它指向的链表(该链表包含所有以z打头的用户名)中查找Zahkir H。
  • 请问,相比于数组和链表,这种混合数据结构的查找和插入速度更慢还是更快?你不必给出大OOO运行时间,只需指出这种新数据结构的查找和插入速度更快还是更慢。

插入为常数时间O(1)O(1)O(1),实际为O(2)O(2)O(2)(在两个链表中插入)。因此比数组​O(n)O(n)O(n)快,比链表$O(1) $稍慢,但区别不大。

查询为O(n)O(n)O(n),但实际上是O(126n)O(\frac1{26}n)O(261​n) ,因此比数组O(1)O(1)O(1)慢,但比链表O(n)O(n)O(n)快。

算法图解第二章笔记与习题(选择排序)相关推荐

  1. 算法图解第十章笔记与习题(KNN算法)

    算法图解第十章笔记与习题(KNN算法) 文章目录 算法图解第十章笔记与习题(KNN算法) 10.1 KNN算法 10.2特征提取 10.3 回归 10.4 小结 练习 习题10.1: 习题10.2: ...

  2. 算法图解第六章笔记与习题(广度优先搜索)

    算法图解第六章笔记与习题(广度优先搜索) 文章目录 算法图解第六章笔记与习题(广度优先搜索) 6.1 图(graph) 6.2 广度优先搜索 6.3.1 查找最短路径 6.3.2 队列 6.4 实现图 ...

  3. 小吴的《机器学习 周志华》学习笔记 第二章 模型评估与选择

    小吴的<机器学习 周志华>学习笔记 第二章 模型评估与选择 上一周我们介绍了第一章的基础概念,这一次将带来第二章的前三节.后面的2.4 比较检验与2.5 偏差与方差,涉及概率论与数理统计概 ...

  4. 【读书笔记】周志华 机器学习 第二章 模型评估和选择

    第二章 模型评估和选择 1 欠拟合和过拟合 偏差和方差 1.1 欠拟合和过拟合 1.2 偏差和方差 2 评估方法 性能度量 2.1 评估方法 2.1.1 留出法 2.2.2 交叉验证法 2.2.3 自 ...

  5. 《机器学习》周志华 第二章——模型评估与选择笔记

    <机器学习>周志华 第二章--模型评估与选择 过拟合和欠拟合 过拟合:对训练数据拟合过当的情况,训练集表现很好,测试集表现差. 欠拟合:模型在训练和预测时都表现不好. 降低过拟合的方法: ...

  6. 《算法图解》学习笔记(七):狄克斯特拉算法(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  7. 《算法图解》学习笔记(八):贪婪算法和NP完全问题(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  8. 《算法图解》学习笔记(四):分而治之和快速排序(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  9. 《算法图解》学习笔记(十一):十种经典的算法与数据结构

    python学习之路 - 从入门到精通到大师 文章目录 [python学习之路 - 从入门到精通到大师](https://blog.csdn.net/TeFuirnever/article/detai ...

最新文章

  1. 如何入门论文阅读综述小解答
  2. mysql注释符号按键,Shell 注释
  3. 外网访问FTP出错200 Type set to A
  4. 未來用工新趨勢_数字化商业浪潮来袭 未来用工新趋势成焦点
  5. LeetCode 13 罗马数字转整数
  6. apache+php安装配置
  7. 拾牙的2021年秋招总结(大概会有帮助?)
  8. 计算机总是无法响应怎么办,电脑无响应是怎么回事 电脑无响应解决方法
  9. ElasticSearch-6.3.2 linux 安装
  10. 假如Python有C/C++ 的性能,会不会称霸IT界?
  11. 视频抠图在线工具有哪些?推荐这3款AI智能抠图工具
  12. Msm8960(APQ8064)平台的MSM-AOSP-kitkat编译适配(2):开发环境及相关的使用技巧
  13. android 毫秒 计时器,Android 计时器: CountDownTimer和JobService
  14. 论文复现_芯片定位和引脚缺陷检测
  15. html页面怎么适配拼接的大屏,大屏上的全屏页面的自适应适配方案
  16. 彻底关闭Win10自动更新(Win10企业版或专业版)
  17. VBA---查单元格,行/列,区域边界情况,用end(xlup) .row , end(xldown) .row 等
  18. 阿里巴巴二重身ABBC Coin虚涨逾100%
  19. 千克转换为磅并显示(小练习)
  20. 成都北大青鸟怎么样?

热门文章

  1. html+js翻页时钟
  2. 图像处理之空域内的滤波复原[均值滤波、顺序统计滤波和自适应滤波复原]
  3. 基于virtualBox虚拟机构建IOS混合应用打包环境
  4. 计算机文字录入培训大纲,《计算机文字录入》课程教学大纲.pdf
  5. symbian 模拟器 相关
  6. 查询NBiot模块下发的指令,提取有效部分的数据进行判断
  7. led数码显示控制plc实验_实验三LED数码显示控制PLC实验报告.doc
  8. 樱花FRP内网穿透登录群晖相册ds photo
  9. 怎么样计算机械功率,油温机功率如何计算?记住「欧能机械」这个公式你就会了...
  10. Jmeter+InfluxDB+Grafana+Prometheus搭建遇过的问题