美文网首页
算法之内存、数组、链表

算法之内存、数组、链表

作者: 非问 | 来源:发表于2018-07-16 15:25 被阅读0次

两种最基本的数据结构——数组和链表,它们无处不在。

很多算法仅在数据经过排序后才管用。


内存的工作原理

假设你需要将东西寄存。寄存处有一个柜子,柜子有很多抽屉。每个抽屉可放一样东西,你有两样东西要寄存,因此要了两个抽屉。
需要将数据存储到内存时,你请求计算机提供存储空间,计算机给你一个存储地址。需要存储多项数据时,有两种基本方式——数组和链表。


数组

使用数组意味着所有待办事项在内存中都是相连的(紧靠在一起的)。

在数组中添加新元素也可能很麻烦。如果没有了空间,就得移到内存的其他地方,因此添加新元素的速度会很慢。

一种解决之道是“预留座位”:即便当前只有3个待办事项,也请计算机提供10个位置,以防需要添加待办事项。这样,只要待办事项不超过10个,就无需转移。

你额外请求的位置可能根本用不上,这将浪费内存。你没有使用,别人也用不了。待办事项超过10个后,你还得转移。

元素的位置称为索引。

链表

链表的每个元素都存储了下一个元素的地址,从而使一系列随机的内存地址串在一起。

链表相当于说“我们分开来坐”,因此,只要有足够的内存空间,就能为链表分配内存。链表的优势在插入元素方面。

在需要读取链表的最后一个元素时,你不能直接读取,因为你不知道它所处的地址,必须先访问元素#1,从中获取元素#2的地址,再访问元素#2并从中获取元素#3的地址,以此类推,直到访问最后一个元素。

读取时链表的效率真的很低。

如果你要删除元素呢?链表也是更好的选择,因为只需修改前一个元素指向的地址即可。而使用数组时,删除元素后,必须将后面的元素都向前移。

思考

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

假设你要让待办事项按日期排列。之前,你在清单末尾添加了待办事项。但现在你要根据新增待办事项的日期将其插入到正确的位置。

访问方式

有两种访问方式:随机访问 和顺序访问 。

顺序访问意味着从第一个元素开始逐个地读取元素。链表只能顺序访问:要读取链表的第十个元素,得先读取前九个元素,并沿链接找到第十个元素。随机访问意味着可直接跳到第十个元素。

说数组的读取速度更快,这是因为它们支持随机访问。很多情况都要求能够随机访问,因此数组用得很多。数组和链表还被用来实现其他数据结构.

思考

假设你要为饭店创建一个接受顾客点菜单的应用程序。这个应用程序存储一系列点菜单。服务员添加点菜单,而厨师取出点菜单并制作菜肴。这是一个点菜单队列:服务员在队尾添加点菜单,厨师取出队列开头的点菜单并制作菜肴。你使用数组还是链表来实现这个队列呢?(提示:链表擅长插入和删除,而数组擅长随机访问。在这个应用程序中,你要执行的是哪些操作呢?)

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

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

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

假设Adit B在Facebook注册,而你需要将其加入前述数据结构中。因此,你访问数组的第一个元素,再访问该元素指向的链表,并将Adit B添加到这个链表末尾。现在假设你要查找Zakhir H。因此你访问第26个元素,再在它指向的链表(该链表包含所有以z打头的用户名)中查找Zakhir H。


相关文章

  • 【算法图解】Week1 选择排序

    0. 摘要 数据结构之数组和链表 排序算法 1.0 内存的工作原理 每个抽屉可以看作是一个内存单元。 内存可以看作...

  • iOS知识复习笔记(19)---数据结构和算法1

    数组和链表的区别 数组静态分配内存,链表动态分配内存 数组内存中连续,链表不连续 数组元素在栈区,链表在堆区 数组...

  • 数据结构与算法 链表

    链表:零散的内存空间数组:连续的内存空间链表类型:单链表、双向链表、循环链表 链表和数组的比较: 数组:查询:按索...

  • 链表跟数组的区别,单链表与双链表的区别

    数组静态分配内存,链表动态分配内存;数组在内存中连续,链表不连续;数组利用下标定位,时间复杂度为O(1),链表定位...

  • 链表(上)实现 LRU 缓存淘汰算法

    经典的链表应用场景就是 LRU 缓存淘汰算法。 1. 链表结构 数组需要一块连续的内存空间来存储,对内存的要求比较...

  • 链表(上)—— LRU 缓存淘汰算法的实现

    经典的链表应用场景就是 LRU 缓存淘汰算法。 1. 链表结构 数组需要一块连续的内存空间来存储,对内存的要求比较...

  • 算法之内存、数组、链表

    两种最基本的数据结构——数组和链表,它们无处不在。 很多算法仅在数据经过排序后才管用。 内存的工作原理 假设你需要...

  • 鱼人学习小计(五)

    算法题:1)数组与链表区别数组在内存中是连续存放的,每个元素都有相同的内存空间,可以通过下标迅速的找到数组中的元素...

  • 算法、数据结构

    算法、数据结构 1.数组和链表什么区别? •数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅...

  • 数据结构之链表

    (上)如何实现LRU缓存淘汰算法? 一、什么是链表? 1.和数组一样,链表也是一种线性表。2.从内存结构来看,链表...

网友评论

      本文标题:算法之内存、数组、链表

      本文链接:https://www.haomeiwen.com/subject/lbcbpftx.html