什么是链接列表的一个实际的,真实世界的例子?
我理解链接列表的定义,但是它又如何expression和与一个共同的概念或项目相关?
例如,OOP中的组合(EDIT:原来说的“inheritance”)可能与汽车有关。 现实生活中的所有(大多数)汽车都是基本相同的东西; 一辆汽车有一台发动机,你可以开始()它,你可以让汽车去(),停止()等等。 汽车通常具有最大的乘客容量,但在汽车和公共汽车之间会有所不同。
是否有一些现实生活,直觉的例子,就像我们inheritance的一样? 典型的教科书“链接列表”示例显示了一个带有整数和指向下一个的指针的节点,它看起来不是很有用。
您的意见是赞赏。
链表就像康加系列一样 。 每个人都拥有在他们面前的人的臀部,他们的臀部轮stream在后方,除了在前面和后面的人。 将人员添加到线路的唯一方法是find正确的位置并将该连接分开,然后插入新的人员或人员。
我假设你想要一个比书本定义更隐喻的解释,而不是如何使用链表的例子。
链表就像一个寻找清道夫。 你有一个线索,这个线索有一个指针来寻找下一个线索。 所以你去下一个地方,并获得另一个数据,另一个指针。 要想在中间或者最后得到一些东西,唯一的办法就是从一开始就遵循这个列表(或者去欺骗)
什么是链接列表的一个实际的,真实世界的例子?
最简单最直接的就是一列火车。
火车车厢按特定的顺序连接起来,以便可以以最有效的方式装载,卸载,转移,丢弃和拾取火车。
例如,Jiffy Mix工厂需要糖,面粉,玉米面等。弯曲处可能需要一个需要氯气,硫酸和氢气的造纸厂。
现在,我们可以停下火车,把每辆车的内容物卸下,然后让火车继续行驶,但是火车上的其他东西都要坐下来,面粉被吸出沉箱,然后是糖等等。
取而代之的是,汽车被装上火车,以便其中的一大块可以分开,剩下的火车继续前进。
火车的尾端比中间的部分更容易拆卸,而且比在一个地方拆卸几辆汽车,在另一个地方拆卸几辆汽车要容易得多。
但是,如果需要,您可以在列车中的任意位置插入和移除物品。
很像链接列表。
-亚当
在出纳员/收银员等候线…
一系列必须按顺序执行的命令。
任何FIFO结构都可以实现为链表。
首先要理解的是,链表在概念上与数组相同。
唯一的区别在于各种操作的效率 。 最重要的是:
- 中间插入:O(1)为列表,O(n)为数组。
- 直接访问中间的元素:O(n)用于列表,O(1)用于数组。
因此,任何可以用于数组的类比(飞机的所有引擎,购物清单上的所有项目…)也适用于链表,但效率的考虑可以使其适用于另一个类比:
一个数组可以放在书架上 。 当你从第n行取出盒子时,从n + 1起的所有盒子都需要移动一个盒子(所以你没有麻烦的空架子)。
一个链表,反过来说,将是一个项链 。 当你发现你不再喜欢那个蓝色的gem时,把它从序列中拿出来,把结果两端连在一起。 没有必要循环通过每颗珍珠,并取代它,所以你可以修理你的项链。
我记得,多年前,在我的第一个大学课程之一,想知道我会永远使用一个链表。 今天,我不认为有一个项目在我没有使用过的地方,而且在很多地方。 这是一个令人难以置信的基础数据结构,相信我,它在现实世界中被大量使用。
例如:
- 在医疗成像应用程序中需要刻录到CD的图像列表
- 一个网站的用户列表,需要通过电子邮件发送一些通知
- 3D游戏中需要渲染到屏幕上的对象列表
现在对你来说可能看起来有些无用,但几年之后,问自己同样的问题,你会发现自己惊讶于你想知道它将被用在哪里。
编辑:我注意到你的意见之一,你问为什么指针很重要。 有人正确地回答说,指针对链表的用户无关紧要。 用户只需要一个列表,其中包含一个事物列表。 该列表如何“包含”该列表对用户而言并不重要。 指针是“如何”的一部分。 想象一下,在地板上划出一条通往出纳员的线路。 人们需要站在这条线上才能到达出纳员。 该行是一个(我承认,这是一个有点拉伸)类比的链接列表使用的指针。 第一个在出纳员上线的人就是名单的负责人。 直接在他们后面的人是列表中的下一个人。 最后,行中的最后一个人就是列表的尾部。
链条:
特别是滚子链:
链条的每个元素都连接到它的后继者和前辈。
你的DNA分子是双链表。
如果你仔细想想,“链接”只是一种识别数据实例之间的“下一个”,“上一个”,“子”或“父”关系的方法。 因此,在真实世界的应用程序中,您可以find各种各样的应用程序。 想一个简单的列表(例如购物清单)的基本链接列表。 但也要考虑我们可以放置图的用途(绘制地图上城市之间的距离,生物学中物种之间的相互作用)或树(组织中的层次结构或数据库索引中的数据,用于两个非常不同的示例)。
Blame在一个项目的不同模块上工作的一群软件工程师,
首先,graphics用户界面的人被指责为产品无法正常工作。 他检查他的代码,发现这不是他的错:API正在搞砸。 API人员检查他的代码:不是他的错,这是logging器模块的问题。 logging器模块的家伙现在责怪数据库的家伙,谁指责安装人员,谁指责…
在一般情况下,链表是你会遇到的最恶劣有用的事情之一。
现实世界的例子:
-
一群排队排队的人 – 一种特殊的LL叫做“排队”。
-
中国橱柜里的一大堆菜 – 一种特殊的LL叫“堆”。
-
“取一个号码”这一行(数字必须在某个时刻从“1”开始) – 一种称为“循环队列”的特殊types的LL。
一般来说,我喜欢用于几乎所有链接数据结构的隐喻都是一副扑克牌 。 几乎任何你可以用链表进行的事情,你都可以使用一副牌来形象化。 这对于显示一些更深奥的sortingalgorithm中发生的事情特别方便。
我个人最喜欢的: Bogosort =玩52卡取代,直到你的牌组sorting。 🙂
真实生活的例子:
** 1)单链表**
- 一个孩子的人脑(为了记住一些东西,例如诗,他必须把它连起来,如果你问他最后一行,他必须从第一行读到)
- 在networking上发送消息(消息被分解成数据包,每个数据包都有一个下一个密钥,这样在接收端就可以很容易地把它们分开)
2)双向链表
- DNA分子
- 允许使用BACKbutton的浏览器caching。
- 火车教练与下一个和前一个连接。
- 自行车滚子链(双环链表)
3)循环链表
- 自动楼梯
- 调度程序在调度操作系统中的进程时使用的时间共享问题。
- 多玩家棋盘游戏
人脑可以是单链表的一个很好的例子。 在心中学习的初始阶段,自然的过程是把一个项目与下一个项目联系起来。 这是一个潜意识的行为。 我们举个例子来说明八个华兹华斯的孤独收割者 :
Behold her, single in the field, Yon solitary Highland Lass! Reaping and singing by herself; Stop here, or gently pass! Alone she cuts and binds the grain, And sings a melancholy strain; O listen! for the Vale profound Is overflowing with the sound.
我们的头脑不像一个有利于随机访问的数组。 如果你问那个家伙最后的线路是什么 ,他会很难说。 他将不得不从第一线去那里。 如果问他第五行是什么更难。
同时,如果你给他一个指针,他会前进。 好吧,从Reaping and singing by herself;
开始Reaping and singing by herself;
?。 现在变得更容易了。 如果你能给他两条路线,那就更容易了, Alone she cuts and binds the grain, And sings a melancholy strain;
因为他更好地获得stream量。 同样的,如果你什么都不给他,他将不得不从一开始就拿到线 。 这是经典的链表。
类比中应该很less出现exception,这可能不太合适,但是这有点解释了链表是如何工作的。 一旦你变得精通一点,或者知道这首诗从内到外,链接列表会滚动(大脑)到一个散列表或数组中,这有助于O(1)查找,在这里你可以从任何地方select线条。
我对这个问题的第一反应是“环顾四周!这东西无处不在!” 但是经过一番思考,我想不出有什么不可思议的例子。
链表的概念是一个复合的概念,一个双重的。 你有一个列表的概念,这是没有问题的。 一个购物清单,例如。 然后你到达链接部分。 一个杂货店不知道下一个杂货店,所以模型崩溃了。
我认为你find真实世界的麻烦的原因是链接部分是一个编程工件,一个实现细节。 有很多方法来实现列表编程方式,一个好办法是让每个列表项知道它的邻居。 另一种方法是有一个List对象来跟踪项目及其顺序。 这是大多数列表在现实生活中的工作方式。 在上面的例子中,购物清单的List对象就是写在纸上的文件(或其他)。
一般考虑列表可能更有用,查看链表只是列表的具体实现。
一个链表可以用来实现一个队列 。 典型的现实生活中的例子将是一个收银员的线。
链表也可以用来实现一个堆栈 。 具有真正意义的真实例子是在自助餐厅的那些盘子分配器之一,在盘子顶部拉顶板。
提供旅游方向:指导中的每一步都是一个节点,每个节点之间的旅行指示都是您的链接。
例:
节点1:在家开始
链接:向南走3个街区到Bob's House
节点2:鲍勃的房子
链接:向北走2个街区到爱丽丝之家。
节点3:爱丽丝的房子
如果你想从一个地方到另一个地方,你必须遵循来自每个中间地点(节点)的链接(指示),你不能只是从家里跳到爱丽丝的地方。
看一个链表:
[A] => [B] => [C] => [D] =>
这是…火车! 每辆铁路车厢都装有一些东西,并且连接到另一辆铁路车厢(或者是最后一辆)。 你只能在最后加一辆铁路车,如果你想摆脱一辆车,你必须将前一辆车与下一辆车相连。
电话链直接作为链表实现。 这是如何工作的:
-
小组组织者收集所有成员的电话号码。
-
组织者为每个成员分配另一个成员的号码。 (有时他们会分配自己的号码,以便他们知道消息已经通过,但这是可选的。)
-
当需要发送消息时,组织者调用列表头并传递消息。
-
头部呼叫他们分配的号码并传递消息。
-
重复步骤4,直到每个人都听到了该消息。
显然必须注意在步骤2中设置列表,以便每个人都链接。 此外,清单通常是公开的,所以如果有人收到应答机或忙音,他们可以拨打下一个电话号码,并保持链条移动。
链表与一摞文件非常相似,每个文件上都有一个项目。 (而不是数组,就像pegboards。)它通常用于解决这些特点的问题:
- 有一个未知的或可变的项目数量
- 这些项目是按顺序排列的,就像列表一样
- 项目可能会重新排列,添加到列表中,列表中删除等。
重新排列一个简单的数组是一个痛苦,在确保数组有足够的内存的同时,在中间的某个地方添加一个元素是一个痛苦。 通过链表,这些操作很简单。 假设您想将项目#10移动到项目#2和项目#3之间。 随着文件,你可以捡起来,移动它。 有了一个数组,你必须将项目3到9移动到一个插槽中,然后将其放入。使用链接列表,你可以这样做:告诉9它后面的那个是11,告诉2它是10之后的那个,告诉10它是3之后。
我现在正在使用其中的几个,因为添加项目是多么容易,并以编程方式说“对列表中的每个项目执行此操作”。 其中之一是条目列表,就像电子表格一样。 另一方面,我通过查看第一个列表并添加对每个具有特定值的项目的引用,以便我可以对它们执行批处理操作。 能够从中间抽取物品,或将其添加到中间,而不必担心数组长度。 这些是我的经验的主要优势。
好,如果一个老师带他的学生去看一个卡通片,但是她不能坐在一起,她会让学生记住下一个学生的地址(座位号),等等……这样她就不会有面临麻烦,而回头!
他确实要求一个实际的例子。 所以我会给它一个镜头:
比方说你正在写一个防火墙; 在这个防火墙中你有一个IP白名单和一个IP黑名单。
你知道你的IP,你的工作IP和一些testingIP需要被列入白名单。 所以,你把所有的IP添加到白名单。
现在,你也有一个应该被阻止的已知IP列表。 所以,你将这些IP添加到黑名单。
为什么可以使用LinkedList呢?
- 该操作是快速添加/删除列表中的项目。
- 您不知道有多lessIP将被阻止/列入白名单。 因此,揭示了LinkedList的一个主要优点(可resize)。
双链表的最好和直接的例子是火车!
这里每个教练都连接到它的上一个和下一个教练(除了第一个和最后一个)
在编程方面考虑主体为数据(值)节点和连接器为参考节点。
我喜欢想象一个像珍珠项链的圆形链表,每颗珍珠都含有一些数据。 你只要按照string的下一个数据珍珠,最终你最终在一开始。
在.NET BCL中, System.Exception
类具有一个名为InnerException
的属性,该属性指向另一个exception,否则为null
。 这形成一个链表。
在System.Type
, BaseType
属性以相同的方式指向另一个types。
在make
程序里面,你会经常发现需要构build的特定文件的依赖项列表被定义为指向其他文件的链接列表,这些文件也需要被构build,并且依次在链接列表中。
查看链接列表作为数据结构。 这是在OOD中表示自我聚合的机制。 你可以把它看作是真实的世界对象(对某些人来说是现实)
在操作系统中…可以使用链表来跟踪哪些进程正在运行,哪些进程正在hibernate…进程正在运行并想要hibernate…从跟踪运行的LinkedList中被移除进程,一旦睡眠时间结束,将其添加回活动进程LinkedList
也许更新的操作系统正在使用一些时髦的数据结构…链表可以在那里使用
链表的一个很好的例子就是你的文本信息,其中一个信息包可以被分成几个信息包。 每个数据包都有一个连接到下一个密钥和第n个密钥的密钥,使得包含密钥和数据的整个文本消息成为可能。
考虑2个或更多箱子有2个或更多的车厢。 (在这个例子中每个箱子将有2个隔间)第一个隔间将包含一些信息。 一个数字或一个字。 第二个隔间将保持一个指向下一个方框的箭头,依此类推。
注意每个盒子可以包含含有箭头(指针)和信息(数据)的多重隔间。
我不认为有一个很好的比喻可以突出两个重要的特征,而不是一个数组:1.有效的插入在当前项目之后,2.低效地通过索引find特定的项目。
没有这样的事情,因为通常人们不会处理大量需要插入或定位特定项目的项目。 例如,如果你有一袋沙子,那将会是数以亿计的谷物,但是你不需要定位一个特定的谷物,而谷物的顺序并不重要。
当你处理较小的藏品时,你可以直观地find需要的物品,或者在图书馆藏书的情况下,你会有一个类似学术的组织。
最接近的比喻是有一个盲人穿过链条,项链上的珠子,火车车厢等链接项目。他可能正在寻找特定物品或需要插入一个项目之后。 可以很好地补充一下,盲人可以很快地经过它们,例如每秒钟一百万个珠子,但是一次只能感觉到一个环节,看不到整个环节或其中的一部分环节。
请注意,这个比喻类似于一个双链表,我不能想象类似于单链接的类比,因为有一个物理连接意味着能够回溯。