首页 > 数据库 >链表只有面试有用?Redis 之父说:我不同意

链表只有面试有用?Redis 之父说:我不同意

时间:2023-07-26 12:31:37浏览次数:62  
标签:一个 Redis 链表 面试 添加 数据结构 节点


几天前,Redis 之父 Salvatore Sanfilippo(又名 antirez)在 Twitter 上用 Rust 实现了一个糟糕的链表,引发了大家的讨论。

在评论中,不少人觉得链表这种数据结构一无是处,于是几天后,antirez 发了一篇博客。

链表只有面试有用?Redis 之父说:我不同意_算法

原文见:http://antirez.com/news/138

antirez 说:“从某些评论的语气中,我感觉到很多人认为链表就像一个笑话,‘一种微不足道的数据结构’‘也就面试的时候用一下,否则,一无是处’……,一言以蔽之,请用链表实现冒泡排序。”

“我不赞成!所以用一篇博客表达,和大家分享我眼中的链表。”

(小伙伴们,准备好阅读一篇关于链表的“情诗”吧!感谢张同学和岳老师对翻译工作的贡献与指导)

链表具有教育意义

当从老师、教材等资料那里第一次接触到链表的时候,带有箭头的圆圈通过箭头指向另一个圆圈,你的脑海中自然会建立对应的构图。就像你第一次对递归有所理解时候的体悟。你会感受到由链接而成数据结构的真正要义:不起眼的单个节点,一旦它指向另一个节点,就会被赋予更强的能力和更高的复杂度。链表为新手程序员很好地引入了计算中关于空间和时间的基本知识:你会思考如何高效添加元素,思考顺序存储所带来的代价。因为如果想在特定位置插入一个元素,那么必须从一个节点到另一个节点按顺序遍历,由此你会马上转而思考加快执行的方法(为接下来的任务做好准备),同时也能够深入地理解了 (1) 和 (N) 的真正含义。

链表是可扩展的

可以添加指向前一个元素的指针,也可以添加指向后一个元素是指针,链表支持双向访问。再添加“远”指针,可以在链表内部跳跃访问。除此之外,还可以对每个节点进行更改,容纳多个属性和操作,进而拓充功能,拥有不同的存储策略。链表同时也支持嵌入。例如,Linux 内核具有宏,能够将字段添加到任何结构体,进而组成链表。这是链表的一个 bold 属性:可以在 (1) 复杂度内将一个链表拆分为两个,也可以在 (1)复杂度内将两个链表融合在一起。如果巧妙利用这个属性,可以完成很多有意思的任务。例如,在 Redis 模块中进行线程操作,处理慢速请求的线程处理了一个伪造的客户端结构体(没有锁,没有争用),当线程指令最终结束执行时,伪造客户端的输出缓冲区可以链接到真实客户端的缓冲区中。因为输出缓冲区是用链表表示的,使得这种操作简单易行。

链表很有用

Redis 可能会出错,但 Redis 和 Linux 内核不会。它们就这样自然而然地发生了:按照它们到达的顺序,或者相反的顺序依次添加。以增量方式拉动项目也很有用,因为它会将这些项目从头到尾移动,或者将它们移动到当前项目之后的位置。

链表很简单

它是稀有的,遇见“她”花费了我不少运气。与二叉树、哈希表等结构一起,可以仅从内存中实现,且不会出现什么大问题。

链表是概念性的

指向自身的节点是我能想象到的计算中最以自我为中心的东西:更粗俗的无限循环的理想表示。指向 NULL 的节点是孤独的隐喻。首尾相连的链表,是闭环的有力象征。

所以,我深爱着链表,多么希望你也能喜欢“她”,至少,从今天开始,可以给“她”一个微笑!

大家学习链表的时候,是怎样去理解它的呢?

“一般都和数组一起!”

没错,我们来对比看看数组和链表的区别~

假设我们要存储一份有 3 个项目的待办清单:

链表只有面试有用?Redis 之父说:我不同意_算法_02

如果使用数组,占用连续的存储空间,那么它存在内存里是这样的:

链表只有面试有用?Redis 之父说:我不同意_算法_03

如果使用链表,每个项目可以存在内存的任何地方,就是这样的:

链表只有面试有用?Redis 之父说:我不同意_数据结构_04

链表只有面试有用?Redis 之父说:我不同意_数据结构_05

显然,数组看起来更好理解。

但是假设你现在要加入第 4 个待办项目,放在哪里呢?这时就需要重新找到一个可以连续放 4 个项目的位置,添加第 5 个项目时呢?还需要重新找。太麻烦了,虽然我们可以通过提前预留位置来减少移动这份清单的次数,但还是避免不了浪费位置的情况。

链表就不同了,它更像一个寻宝游戏,每个格子里写着下一个格子位置的“线索”,只要内存里还有位置,就可以无限添加,不用移动已经存好的数据。

链表完美了吗?当然不是!

排行榜网站总是使用“卑鄙”的手段来增加页面浏览量。比如“十大电视反派”排行,它不在一个页面中显示整个排行榜,而是 TOP10 在第 1 页,剩下 9 个都单独放在一个页面中,让你不停地单击“Next”才能看到第一大反派,好让这 10 个页面中的广告都增加展示次数,真是烦!

链表只有面试有用?Redis 之父说:我不同意_java_06

链表就存在类似的问题。如何解决呢?聪明的你快来评论区聊聊吧!

数据结构魅力无限,仅仅是数组和链表就有这么多精彩的细节,想要了解更多有趣的数据结构和算法故事?下面两本书推荐给大家!

第 1 本

链表只有面试有用?Redis 之父说:我不同意_java_07

第 2 本

链表只有面试有用?Redis 之父说:我不同意_java_08

链表只有面试有用?Redis 之父说:我不同意_java_09

链表只有面试有用?Redis 之父说:我不同意_算法_10


标签:一个,Redis,链表,面试,添加,数据结构,节点
From: https://blog.51cto.com/u_15767091/6855292

相关文章

  • 面试-集合
    hashMap扩容大于当前容量0.75,扩容成2倍。创建一个新空数组,重新hash初始容量16链表大于8转换为红黑树,小于6退化为链表indexindex=HashCode(Key)&(Length-1)index的结果等同于HashCode后⼏位的值。只要输⼊的HashCode本身分布均匀,Hash算法的结果就是均匀的hashTable在很......
  • redis学习二十:redis哨兵监控
    是啥:吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务。作用:1.监控redis运行状态,包括master和slave2.当master宕机,能自动将slave切换成新master能干啥:主从监控:监控主从redis库运行是否正常消息通知:哨兵可以将故障转移的......
  • Redis的有序集合Zset为啥用跳表不用二叉树
    跳表和红黑树查找的时间复杂度都是logN,插入删除也是logN。范围查找貌似也都是O(k+logn),其中n是树中节点的数量,k是满足范围条件的节点数量。但是实现起来跳表要简单很多。1.zset有个很核心的操作叫范围查找,我们要查找某个范围区间的元素。跳表可以做到logN时间复杂度内的快......
  • Java面试题 P5:简述final作用
    1、简述final作用?final含义是最终的。(1)修饰类:表示类不可被继承,不可以有子类;(2)修饰方法:表示方法不可以被子类覆盖,但是可以重载;(3)修饰变量:表示变量一旦被赋值就不可以更改它的值。(4)修饰成员变量如果final修饰的是类变量,只能在静态初始化块中指定初始值或者声明该类变量时指定初......
  • cookie+session(这里使用redistemplate代替)实现单点登录流程
     user发起资源请求(带上回调的路径方便回调),通过判断是否浏览器的cookie中是否存在登录过的痕迹,比如有人登了,然后存了一个cookie到浏览器如果拿到了cookie是有东西的,则带上这个cookie的内容返回给client,如果没有东西,则继续登录,向session中存入userInfo,并给浏览器设置cookie......
  • 面试类-Java并发编程 (一)
    1.并行跟并发有什么区别?从操作系统的角度来看,线程是CPU分配的最小单位。并行就是同一时刻,两个线程都在执行。这就要求有两个CPU去分别执行两个线程。并发就是同一时刻,只有一个执行,但是一个时间段内,两个线程都执行了。并发的实现依赖于CPU切换线程,因为切换的时间特别短,所以基本......
  • Java面试常见问题总结
    Java面试常见问题总结Java基础Java中的几种基本数据类型是什么?对应的包装类型是什么?各自占用多少字节呢?String、StringBuffer和StringBuilder的区别是什么?String为什么是不可变的?Strings1=newString("abc");这段代码创建了几个字符串对象?==与equals?hashCo......
  • 面试-mq
    NameServer每个Broker在启动的时候会到NameServer注册,Producer在发送消息前会根据Topic到NameServer获取到Broker的路由信息,Consumer也会定时获取Topic的路由信息BrokerBroker负责消息存储,Broker是具体提供业务的服务器,单个Broker节点与所有的NameServer节点保......
  • AI面试官:Asp.Net 中使用Log4Net (三)
    AI面试官:Asp.Net中使用Log4Net(三)当面试涉及到使用log4net日志记录框架的相关问题时,通常会聚焦在如何在.NET或.NETCore应用程序中集成和使用log4net。以下是一些关于log4net的面试题目,以及相应的解答、案例和代码:目录AI面试官:Asp.Net中使用Log4Net(三)11.如何在log4net中......
  • AI面试官:Asp.Net 中使用Log4Net (二)
    AI面试官:Asp.Net中使用Log4Net(二)当面试涉及到使用log4net日志记录框架的相关问题时,通常会聚焦在如何在.NET或.NETCore应用程序中集成和使用log4net。以下是一些关于log4net的面试题目,以及相应的解答、案例和代码:目录AI面试官:Asp.Net中使用Log4Net(二)6.如何配置log4net,......