下载好向圈APP可以快速联系圈友

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

Python 算法 03-- 数组和链表(下)-1.jpg (93.27 KB, 下载次数: 0)

2020-9-12 12:24 上传

Python 算法 03-- 数组和链表(下)-2.jpg (56.14 KB, 下载次数: 0)

2020-9-12 12:24 上传

Python 算法 03-- 数组和链表(下)-3.jpg (10.81 KB, 下载次数: 0)

2020-9-12 12:24 上传

曾经有个秃顶的面试官问了我一个问题:

数组相对于链表,为什么我们都说数组查找效率快?

Python 大星:数组占用的内存空间是连续的

面试官:还有其他的吗?

Python 大星:......

以 int 类型为例,data_type_size 占 4 个字节 ,length 为 10,计算机分配连续的内存空间 1000 - 1039,其中,内存块的首地址为 base_address = 1000。

Python 算法 03-- 数组和链表(下)-4.jpg (43.08 KB, 下载次数: 0)

2020-9-12 12:24 上传

当我们随机访问数组中的一个元素,

它会首先通过下面的寻址公式,计算出该元素存储的内存地址:

Python 算法 03-- 数组和链表(下)-5.jpg (21.27 KB, 下载次数: 0)

2020-9-12 12:24 上传

我们从这个公式可以看出,如果数组下角标从 1 开始,那么公式将多做一步减法,这也是为什么数组下角标一般从 0 开始的原因之一。

Python 算法 03-- 数组和链表(下)-6.jpg (22.1 KB, 下载次数: 0)

2020-9-12 12:24 上传

回到最开始的面试题,为什么我们都说数组查找效率快?

● 数组占用的内存空间是连续的

● 数组中都为同一类型的元素

● CPU 缓存会读入一片连续的内存空间

因为数组结构是连续的内存地址, 所以数组全部或者部分元素被连续存在 CPU 缓存里面

Python 算法 03-- 数组和链表(下)-7.jpg (38.05 KB, 下载次数: 0)

2020-9-12 12:24 上传

数组低效的 “插入” 和 “删除”?

● 插入

Python 算法 03-- 数组和链表(下)-8.jpg (58.73 KB, 下载次数: 0)

2020-9-12 12:24 上传

插入

如果在数组末尾插入元素 x,不需要移动数组中的其他元素,时间复杂度为 O(1)。如果在数组首位插入元素 x,数组中的其他元素都需要往后移动一位,最坏时间复杂度是 O (n)。因为我们在每个位置插入元素的概率是一样的,所以平均情况时间复杂度为 (1+2+…n)/n=O (n)。

● 删除

Python 算法 03-- 数组和链表(下)-9.jpg (47.5 KB, 下载次数: 0)

2020-9-12 12:24 上传

删除

跟插入数据类似,如果删除数组末尾的数据,则最好情况时间复杂度为 O (1);如果删除开头的数据,则最坏情况时间复杂度为 O (n);平均情况时间复杂度也为 O (n)。

Python 算法 03-- 数组和链表(下)-10.jpg (10.65 KB, 下载次数: 0)

2020-9-12 12:24 上传

以单向链表为例

Python 算法 03-- 数组和链表(下)-11.jpg (33.07 KB, 下载次数: 0)

2020-9-12 12:24 上传

单向链表

● 链表低效的“查找”?

我们把链表的第一个节点叫头节点,头结点记录链表的基地址,最后一个节点叫尾节点(尾节点最后指向 NULL)。

因为链表的空间是分散的,所以不具有随机访问性,如要需要访问某个位置的数据,需要从第一个数据开始找起,依次往后遍历,直到找到待查询的位置,故查找最后一个元素时,则最坏的情况时间复杂度为 O (N)。

● 链表高效的“插入” 和 “删除”

Python 算法 03-- 数组和链表(下)-12.jpg (56.55 KB, 下载次数: 1)

2020-9-12 12:24 上传

图 1 - 插入

Python 算法 03-- 数组和链表(下)-13.jpg (56.92 KB, 下载次数: 0)

2020-9-12 12:24 上传

图2 - 删除

由于链表的存储空间本身不是连续,在链表中插入或者删除元素,不需要为了内存的连续性而移动其他元素。由图 1 和 图 2中,我们可以看出只需要改变相邻节点的指针即可,故链表在插入或者删除的时间复杂度为 O (1)。

数组和链表对比图

Python 算法 03-- 数组和链表(下)-14.jpg (26.72 KB, 下载次数: 0)

2020-9-12 12:24 上传

>>>Python 算法 02--数组和链表(上)

python中链表和数组_Python相关推荐

  1. python中如何定义数组_python如何定义数组

    展开全部 Python数组还有一个变态的使用2113方法,就是调用时可以不按参5261数顺序,对于我们掌握怎样正4102确创建1653Python数组是很有帮助的,而且也可从中学到不少编程技巧,例如委 ...

  2. python中多维数组_python学习笔记-多维数组

    Python中初始化一个5 x 3每项为0的数组,最好方法是: multilist = [[0 for col in range(5)] for row in range(3)] 我们知道,为了初始化 ...

  3. python中如何定义数组_python中数组是如何使用的?

    今天马哥教育要跟大家分享的文章是Python数组是如何使用的?熟悉Python的小伙伴们都知道在学习Python过程中数组是个逃不过去的一个关,既然逃不过去咱就勇敢面对它,Python入门新手和正在 ...

  4. python中链表是什么_python 单链表的实现

    常见的数据结构有链表,队列,栈,二叉树,哈希表,图等.其中最简单的是单链表. 单链表实质是在内存上存在的一些不连续的数据,不同数据之间通过节点存储的位置信息来连接.对比数组,他们是在内存上连续存在的一 ...

  5. python中链表和数组_数据结构笔记(一):数组、链表|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ (一)数组 数组(Array)是一种线性表数据结构.它用一组连续的内存空间,来存储一组具有相同类型的数据. ...

  6. python中字符串转数组_python字符串转数组

    Python中有split()和os.path.split()两个函数,具体作用如下: split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list) os.path ...

  7. python中如何定义数组_python如何创建数组?

    python如何创建数组? 更新时间:2019年02月15日18时03分 来源:python培训 浏览次数: python如何创建数组?今天传智播客的老师就来给大家说说关于python如何创建数组? ...

  8. python中split拆分数组_Python 数组分割

    展开全部 arr = [1,2,3,6,1,6,8,1,9,7,5,1] coor, res= [], [] i = j = count = 0 for idx, num in enumerate(a ...

  9. python怎么定义整数数组_python中输入整数数组长度python基础语法

    变量 数字类型 运算符 流程控制 while循环 dead loop continue vs break while else 变量(Varibles) W WW.002pc .COM认为此文章对&l ...

最新文章

  1. MySQL 常见操作指令
  2. Ubuntu11.04软件源--增强版
  3. 【以太坊】深入理解智能合约(合约调合约)
  4. Python中的内存管理机制
  5. python根据文件名获取文件路径_python 查看文件名和文件路径
  6. iOS开发 - Swift实现清除缓存功能
  7. Android 使用SeekBar调节系统音量
  8. 1.UNIX网络编程卷1:源码配置
  9. MySQL两阶段加锁
  10. 台式计算机时间不能同步,电脑时间同步不了怎么办
  11. 拨号时显示无法连接服务器失败,拨号网络常见的错误提示解释及解决方法大全...
  12. ffmpeg C语言视频解码
  13. python 显示表格数据_python显示excel表格数据-怎么用python读取excel表格的数据
  14. 任鸟飞FPS类型游戏绘制和游戏安全,反外挂研究(二)
  15. 阿里云AI平台NLP使用
  16. 计算机二级python综合应用题_计算机二级python真题:第5套综合应用题
  17. mac忘记管理员密码
  18. Linux新手训练营--命令大全(持续更新中)
  19. 宝付支付如何使用Cookie技术
  20. 第79届中国教育装备展完美收官,厦门再见!

热门文章

  1. 值得一读的《框架设计(第2版):CLR Via C#》
  2. C++leetcode找出两个有序数组的中位数(2)
  3. 两个年月日怎么相减_会议记录应该怎么记?看这里
  4. [云炬python3玩转机器学习]5-4向量化高效运算
  5. 科大星云诗社动态20210407
  6. 专栏 | 基于 Jupyter 的特征工程手册:数据预处理(一)
  7. php万年历月份处理_php实现万年历的完整代码
  8. javascript中清空数组的两种方式
  9. Ubuntu12上安装Oracle11gR2
  10. Updatepanel与Jquery合用时的问题解决