python数组和链表的区别_算法图解2 - 数组和链表
原标题:算法图解2 - 数组和链表
我们继续上文的脚步,深入了解一下数组和链表。掌握它们之间的区别和联系,以及各自的使用场景,为后续的算法学习打好基础。
一、计算机内存的工作原理
为了更好的理解数组和链表,我们先来简单介绍一下计算机内存的工作原理。
简单来说:计算机就像是很多抽屉的集合体,每个抽屉都有地址。
需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式:数组和链表。
二、数组
我们先不看概念,来个小例子简单认识一下。
假设我们要编写一个管理待办事项的应用程序,为此需要将这些待办事项存储在内存中。我们先将待办事项存储在数组中。使用数组意味着所有待办事项在内存中都是相连的(紧靠在一起的)。
现在假设你要添加第四个待办事项,但后面的那个抽屉放着别人的东西!在这种情况下,你需要请求计算机重新分配一块可容纳 4 个待办事项的内存,再将所有待办事项都移到那里。
那么问题来了,如果我又有了第 5 个待办事项,这时候,又得进行一次大转移。
那么有没有什么解决方案呢?答案是肯定的,但是并不完美。譬如,我们直接申请 10 个内存单元,这样就可以继续6,7,8,9,10。
这是一个不错的权变措施,但是它存在如下两个缺点:
你额外请求的位置可能根本用不上,这将浪费内存。你没有使用,别人也用不了。
待办事项超过 10 个后,你还得转移。
看起来我们的方案并不完美,那么有什么好的办法吗?
三、链表
链表中的元素可存储在内存的任何地方。
我们继续用上面的例子:
链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。
这犹如寻宝游戏。你前往第一个地址,那里有一张纸条写着“下一个元素的地址为123”。因此,你前往地址123,那里又有一张纸条,写着“下一个元素的地址为847”,以此类推。在链表中添加元素很容易:只需将其放入内存,并将其地址存储到前一个元素中。
只要有足够的内存空间,就能为链表分配内存。
链表的优势在插入元素方面,那数组的优势又是什么呢?
四、优缺点对比1.先来看看链表
在链表中,元素并非靠在一起的,你无法迅速计算出第五个元素的内存地址,而必须先访问第一个元素以获取第二个元素的地址,再访问第二个元素以获取第三个元素的地址,以此类推,直到访问第五个元素。
链表有两个特点:
需要同时读取所有元素时,链表的效率很高:你读取第一个元素,根据其中的地址再读取第二个元素,以此类推。
如果你需要跳跃,链表的效率真的很低。
2.数组与此不同
在数组中我们知道其中每个元素的地址。例如,假设有一个数组,它包含五个元素,起始地址为 00,那么元素 #5 的地址 04,这个很容易就能知道。
需要随机地读取元素时,数组的效率很高,因为可迅速找到数组的任何元素。
所以我们可以总结出一些规律:
数组读取运行时间 O ( 1 ),插入运行时间 O ( n );
链表读取运行时间 O ( n ),插入运行时间 O ( 1 );
五、适用场景
有两种访问方式:随机访问和顺序访问。
顺序访问意味着从第一个元素开始逐个地读取元素。链表只能顺序访问:要读取链表的第十个元素,得先读取前九个元素,并沿链接找到第十个元素。随机访问意味着可直接跳到第十个元素。
我们经常说数组的读取速度更快,这是因为它们支持随机访问。当然,数组和链表还被用来实现其他数据结构,后面我们细说。
链表擅长插入和删除,而数组擅长随机访问。
六、选择排序
有了上面的基础,我们来学习一下:选择排序。
/**
* @msg: 选择排序
* @param { Array} arr
* @return: Array
*/
constselectionSort = (arr) => {
letnewArr = [];
letlen= arr.length;
for( leti = 0; i < len; i++) {
letsmallest = arr[ 0];
letsmallest_index = 0;
for( letj = 1; j < len- 1; j++) {
if(arr[j] < smallest) {
smallest = arr[j];
smallest_index = j;
}
}
newArr.push(arr.splice(smallest_index, 1)[ 0]);
}
return newArr;
}
selectionSort([ 5, 3, 6, 2, 10]);
书中用 Python 实现,这里我们采用了 JS 实现,先实现为主,后续进行算法优化。
版权声明:
文章首发于Jartto's blog , 转载文章请务必以超链接形式标明文章出处,作者信息及本版权声明(http://jartto.wang )。返回搜狐,查看更多
责任编辑:
python数组和链表的区别_算法图解2 - 数组和链表相关推荐
- python数组和链表的区别_数组和链表的区别 - toddler的个人空间 - OSCHINA - 中文开源技术交流社区...
数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中.同 ...
- python有序列表无序列表区别_用Python链表实现有序表与无序表
用Python链表实现有序表与无序表 <数据结构与算法>MOOC(北大地空)课堂笔记 2020.4 by dlnb526 啥是链表 链表,顾名思义,顾名思义,链表像锁链一样,由一节节节点连 ...
- python数组和函数的区别_真假美猴王-Numpy数据与Python数组的区别与联系!
Numpy,是python中的一个矩阵计算包,功能类似matlab的矩阵计算.Numpy的诞生弥补了下面提到的两项的不足,numpy提供了两种基本的对象:ndarray(N-dimensional a ...
- java删除有序数组中的重复元素_算法刷刷刷Leetcode第26题删除排序数组中的重复项...
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成.示例 ...
- 《算法图解》——数组和链表
内存中存储多项数据的两种方式: 数组:元素在内存中是相连的,一旦超过预存位置,就要请求计算机重新分配一块内存.(读取容易,插入难) 数组让你能够随机访问,立即获得数组中间的元素.(同一个数组中,元素类 ...
- pta数据结构实验在数组中查找指定元素_如何从一个数组中查找指定的元素,并返回这个元素在数组中的位置...
展开全部 和Vector都是使用Objec的数组形式来存储的.当你向这两种类型中增加元素的时候,如果元素的数目超出e68a84e8a2ad62616964757a686964616f313332646 ...
- 图解python吴灿铭网盘_《图解数据结构-使用C#》吴灿铭,胡昭民著【摘要 书评 在线阅读】-苏宁易购图书...
商品参数 作者: 吴灿铭,胡昭民著 出版社:清华大学出版社 开本:16开 ISBN:9787302528722 版权提供:清华大学出版社 内容介绍 这是一本综合讲述数据结构及其算法的入书,全书采用图文 ...
- 字符数组和字符串的区别,C语言字符数组和字符串区别详解
C 语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串.那么,字符数组就一定是字符串吗? 不一定,字符数组和字符串千万不要混淆.字符串是一种特殊的字符数组,并且C语言提供了大量适用于字符串 ...
- java打印数组的连续非空子集_求一个字符串数组所有非空子集
package com.test; import java.util.Arrays; import java.util.LinkedList; /** * @author LiuYinxing */ ...
最新文章
- Java的Json解析包FastJson使用
- python程序设计报告-Python程序设计实验一报告
- 关于前后端分离我的理解
- java编程一般类抽象类的定义,Java编程基础抽象类
- 保姆级教程 | TensorFlow-YOLOv3 从本地训练到服务器部署全过程
- java中请求转发与重定向_JavaEE进阶 请求转发与请求重定向
- opencv 亮度非线性变化 一
- linux命令kill_什么是Linux中的kill命令?
- 字符串未被识别为有效的布尔值
- PCB走线载流能力-揭秘一
- 使用Aspose.Cells 根据模板生成excel里面的 line chart
- PRINCE2的含金量如何?
- 推送给自学程序员们的一本Python书
- java NBA2010,关于一个NBA球队连续夺冠的SQL查询问题,解法很精妙~
- html表格中如何画单元格中对角线
- WiFi测试规范总结
- No.1 Bomb Game
- ptp4l linux,如何使用PTP4l测试PTPV2协议精度?
- 怎么恢复我在计算机里删掉的文档,如题,如何彻底删除电脑中的文件,使文件不能恢复?(我的方式是直接? 爱问知识人...
- 脑神经外科专家张正贤医生(转)