原标题:算法图解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 - 数组和链表相关推荐

  1. python数组和链表的区别_数组和链表的区别 - toddler的个人空间 - OSCHINA - 中文开源技术交流社区...

    数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素.但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中.同 ...

  2. python有序列表无序列表区别_用Python链表实现有序表与无序表

    用Python链表实现有序表与无序表 <数据结构与算法>MOOC(北大地空)课堂笔记 2020.4 by dlnb526 啥是链表 链表,顾名思义,顾名思义,链表像锁链一样,由一节节节点连 ...

  3. python数组和函数的区别_真假美猴王-Numpy数据与Python数组的区别与联系!

    Numpy,是python中的一个矩阵计算包,功能类似matlab的矩阵计算.Numpy的诞生弥补了下面提到的两项的不足,numpy提供了两种基本的对象:ndarray(N-dimensional a ...

  4. java删除有序数组中的重复元素_算法刷刷刷Leetcode第26题删除排序数组中的重复项...

    给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成.示例 ...

  5. 《算法图解》——数组和链表

    内存中存储多项数据的两种方式: 数组:元素在内存中是相连的,一旦超过预存位置,就要请求计算机重新分配一块内存.(读取容易,插入难) 数组让你能够随机访问,立即获得数组中间的元素.(同一个数组中,元素类 ...

  6. pta数据结构实验在数组中查找指定元素_如何从一个数组中查找指定的元素,并返回这个元素在数组中的位置...

    展开全部 和Vector都是使用Objec的数组形式来存储的.当你向这两种类型中增加元素的时候,如果元素的数目超出e68a84e8a2ad62616964757a686964616f313332646 ...

  7. 图解python吴灿铭网盘_《图解数据结构-使用C#》吴灿铭,胡昭民著【摘要 书评 在线阅读】-苏宁易购图书...

    商品参数 作者: 吴灿铭,胡昭民著 出版社:清华大学出版社 开本:16开 ISBN:9787302528722 版权提供:清华大学出版社 内容介绍 这是一本综合讲述数据结构及其算法的入书,全书采用图文 ...

  8. 字符数组和字符串的区别,C语言字符数组和字符串区别详解

    C 语言中并不存在字符串这个数据类型,而是使用字符数组来保存字符串.那么,字符数组就一定是字符串吗? 不一定,字符数组和字符串千万不要混淆.字符串是一种特殊的字符数组,并且C语言提供了大量适用于字符串 ...

  9. java打印数组的连续非空子集_求一个字符串数组所有非空子集

    package com.test; import java.util.Arrays; import java.util.LinkedList; /** * @author LiuYinxing */ ...

最新文章

  1. Java的Json解析包FastJson使用
  2. python程序设计报告-Python程序设计实验一报告
  3. 关于前后端分离我的理解
  4. java编程一般类抽象类的定义,Java编程基础抽象类
  5. 保姆级教程 | TensorFlow-YOLOv3 从本地训练到服务器部署全过程
  6. java中请求转发与重定向_JavaEE进阶 请求转发与请求重定向
  7. opencv 亮度非线性变化 一
  8. linux命令kill_什么是Linux中的kill命令?
  9. 字符串未被识别为有效的布尔值
  10. PCB走线载流能力-揭秘一
  11. 使用Aspose.Cells 根据模板生成excel里面的 line chart
  12. PRINCE2的含金量如何?
  13. 推送给自学程序员们的一本Python书
  14. java NBA2010,关于一个NBA球队连续夺冠的SQL查询问题,解法很精妙~
  15. html表格中如何画单元格中对角线
  16. WiFi测试规范总结
  17. No.1 Bomb Game
  18. ptp4l linux,如何使用PTP4l测试PTPV2协议精度?
  19. 怎么恢复我在计算机里删掉的文档,如题,如何彻底删除电脑中的文件,使文件不能恢复?(我的方式是直接? 爱问知识人...
  20. 脑神经外科专家张正贤医生(转)

热门文章

  1. 顺利上市的金辉控股,能否顺利活下去?
  2. iOS 作为Central蓝牙连接外围(上)
  3. XY51S03B蓝牙5.1芯片OBU方案
  4. Java项目源代码基于S2SH实现的客运站网上售票系统
  5. Zookeeper入门看这篇就够了
  6. [LOJ#522]「LibreOJ β Round #3」绯色 IOI(危机)
  7. [附源码]计算机毕业设计JAVA网上购物商城系统
  8. 流媒体分析之srt 之libsrt 分析:
  9. AHURATUS智能家居语音助手
  10. 抖音短视频APP——运营策略梳理