00:01
下面我们继续来学习red里边常用的数据类型,刚才呢已经演示完成了字符串string的操作,那下面呢,给各位来演示一下red里边的列表list的操作,首先我们先看一下关于这个list的一个基本介绍,List它叫做单键多值,那什么叫单键多值呢?给大家说一下,因为各位知道我们ready是不是一个KY6方式进行存储的,比如说在里边呢,它的K肯定还是一个字符串这个操作,比如说我们的K,假如说是这个内,然后它的值呢,里边有多个值,比如说name幕中有一个Lucy me、杰克等等,所以这个叫做单键多值,而这个多值部分咱们用列表例子进行相应的这么一个存储,所以这是它的一个特点,然后咱们继续来看啊,我这里写的。列表是简单的字符串列表,它可以按照插入的顺序进行排序。
01:07
也就是说里边内容是有序的,你可以添加一个元素。到列表的头部或者它的尾部,比如说你在头部可以讲数据,也可以直接加到它的尾部进行操作,而它的底层实际是个什么?就是一个双向链表。双向链表我们在Java基础中应该有过讲解,大家应该知道什么叫双向列表。说到通透点,我通过头找到它的下一个元素,能找到它的尾,然后通过尾下一个元素找到它的头。当然你可以设计成一个双向循环列表,比如说我的尾的下一个元素是头元素,然后头的上元素是尾元素,所以它是一个双向列表结构,从头找到尾,从尾找到头。而这个操作中呢,有个特点,它对两端操作性能很高,因为你的头和尾需要有很多操作,但是它通过索引下标想要去操作中间的节点,性能会很差,也就说我们做链表的时候呢,它的查询效率是比较低的。
02:12
所以这是关于例子一个结构的介绍,底层就是一个双向链表,那这个介绍之后,下面呢,给各位来演示一下关于这个列表例子中常用的病毒操作,那我们先看一下里边的第一组操作,就是里边的这几个操作,首先你看啊,它的第一组叫l push和这个r push表示咱可以从左边插入一个或多值,从右边插入一个或者多值,那下面给大家演示一下这个操作,咱们现在这个叫l push操作,它表示从左边插入你的数据,那我到里边演示,为了明显,我把这个先清空一下。然后再来操作,叫L复式,里边加上一个K,这个K呢,比如我叫K1。
03:04
然后加上里边的多个值,这个值我们给它加入多个,比如说值,我就叫这个V1。VR。V3咱就加入三个值,而这样的话呢,我们现在就像re里边加入这么一个K是K1Y6,值是V1 V2 V3,但是我们加的方式,但是从左边往里面加,那从左边往里面加,它有什么特点呢?给大家来说明一下啊,比如说啊,咱先把这值先给它取出来,咱先看一下这个效果,而取值一会说到咱用这个命令叫l run值加上T,加上你的位置,那我们先给它取一下啊,咱们看下这个特点。L润值加上K1,咱们从零到负一表示取所有的值,然后大家看这个特点啊,这表示从左边取,然后咱放也是从左边放的,但是大家看这特点是怎么样,它里面的第一个值是V3,第二个是V2,第一个是不是就是V1啊,所以它里边是这么一个特点,比如说你放的话是按照这个顺序来放的,那怎么意思呢?给大家也说明一下啊,我在图上画一下。
04:15
比如我现在往这里边要放入就是。三个元素,咱的K,我们叫K1。它的外调值就是V1 V2 V3,那我第一次放的话,V1是不是可能在第一个位置,我们叫V1,然后现在我又放第二个,但你注意啊,我是从左边放的,V2并不是在这个地方,就是这么放是不对的,这不是从左边放,而V2怎么做,你放V2的话,还是在V一个地方,但是V1就放到这里边,它就变成V1,然后这里边变成什么,就叫V2。这个变成V2,比如咱再放V3,那怎么放,那V3的话放到这个位置,然后你的V1放到了这里,V2放到第二位置,V3在这个位置,所以它这个叫从左边放,最终结果就是第一个是V3,第二个是V2,然后这个是V1。
05:12
这个叫做l push操作,大家把这特点给他知道啊,从左边放,就是你放V1V2V3,然后你可以通俗理解啊,我V1之后放V2 V2把它挤到右边,V3把它又挤到右边,最终结果就是我们看到的这么一个效果。那这个演示之后呢,我们再看下一个啊,叫r push,跟它方向正好相反,它表示从右边往里面放数据,那咱们也是演示一下,比如现在为了明显,我把它就是先给他,咱们再加入一个新的内容,我们叫r push。然后里边放的这个K,我叫K2,然后咱们放的值,我还是放这个V1。V2V3,现在我是从右边发,然后放完之后咱用L润值来看一下,我们叫K2从零到负一,表示取它的所有值,然后大家看这顺序啊,因为现在是从右边放,那那放的话放的是V1V2V3,然后它里边怎么做,给各位也是画一下这过程啊,就是现在我们里边是在这个地方,咱们还是放。
06:24
V1V2V3,然后这个K我们叫K2 K2呢是从右边放,那能放到第一个这位置是不是就是V1啊,就第一次放V1,然后你放V2,把V就挤到第二位置,再放V3,它就挤到了这个地方,所以最终结果就是这里边是V1,然后第二位置是V2。第三位置就是咱们看到那个V3,最终是这个结果,这表示从右边往里边放那种,所以这两个特点要各位同学要知道,一个L,一个l push,一个从左边放,一个从右边放,这是我们说明的这么一个特点。
07:06
然后这个说完之后,咱再看下一个啊,叫l pop和r pop,它表示从左边或者从右边吐出一个值,就是把值给它取出来,注意给它就是拿出来这个值,那我们来看一下啊,咱看这个叫L泡泡,我们来测试一下。L泡泡。就是pop,然后在里边呢,加上我的K,比如咱加这个K1 K1里边呢,我们从左边拿出值,那我们看到拿出是不是就V3,因为它从左边放嘛,比如咱就用这个R泡泡,我们来拿这个K2,然后它从右边拿的这个值是不是就是V3,就是咱们刚才看到的这个特点,所以这是我们的这么两个基本的命令,L pop l pop表示从左边或者从右边吐出来,就是取出来一个值,而取出来之后有个特点啊,比如现在你把值都取出来之后,那它见也就不存在了,就是这个特点见在值在。
08:09
直光见亡啊这么一个特点,比如说现在比如说我取这值,我再取一个K2,我再取一次K2,现在是不是取了三次V2 V3 V1都取出来了,然后现在这K2应该就不存在了,这是它里面的这么一个特点。各位把这知道啊,然后除了这个之外呢,下面还有一个操作,这个操作叫做r pop l push啊注意啊,这是一个操作啊,它中间没有那个斜杠,它是一个操作,这个操作什么意思呢?它表示啊,就是我们现在。从K1里边列表中的右边取出一个值,然后插入到K2列表的左边去,注意这个过程啊,稍微麻烦点,什么意思呢?比如现在我从这个的右边取个V,然后插入到这个的左边,就V这个位置中满,就是从它的右边取个值,插入到它的左边位置中脉,这时候它里边的这命令,那我下面给大家演示一下啊,为了明显点给它清空一下,比如现在我这么做啊,我们先用第一个命令,就刚才咱们演示的这个叫l push。
09:18
往里边加入一些数据。我们叫K1,比如叫V1 V2。V3,咱们从左边就是加入三个值V1 V2 V3就是这种结果,然后现在呢,我再加一个就是K2,比如咱们从右边加r push,我们叫KR,为了区分我叫V11 V12。V13,现在咱们加了这三个,然后从右边加的就是这个场景,我把这个值稍微改一下啊,这个叫V11。这个叫V12。给他稍微改一下啊,这叫V12,然后这个叫V13,这么画让各位看的更明确一点。
10:03
VU3,然后咱们做件事情,把这个K里边从右边取个值,放到K2的左边的位置中来,咱最终来做这效果,然后里边有一个命令叫r pop l push,那我们给它取下啊。就是这个命令,比如说我们取这个就是K1放到Q2位置中来,现在这个就完成了,就是它里边你看啊,放的是这个V嘛,就是我们把这个取出来放到这位置,然后取来之后我们可以啊,最终再看一下最终这个结果,比如用这个l range。咱们查这个就是K20到负一,然后大家看它的第一个是不是就V1了,就是我说这过程从右边取个值放到它的左边,最终变成这个位置就是。V1,然后V11 V12 V13,咱们看到的这个效果啊,所以这几个就是针对我们例次的列表中的常用的操作,各位把这个叫知道,然后除了这个之外呢,下面还命令刚才咱们演示过了,就用这个叫l range能获取你索引下标里边的这个元素,比如这位置我们加个K,加个K加上你的位置能取到,就是从左到右,如果你这值呢,加上零到负一,咱能取到里边的所有值,刚才咱们应该都一直在用这个,所以你看这个L转K2,零到负一,把里面所有值是不是都取到了啊,这个咱刚才已经演示过了。
11:40
然后除了这个之外,我们再看下一个啊,这个叫l inex,根据你索引下标获取你指定位置的这么一个元素,那比如说我们来取一下啊。L in desk k,二比咱加个零,大家看取到是不是就不一了,比如说我再取个,咱来一个二。
12:02
取道是不是就是V2,就是012嘛,下标从零开始,这个叫l in代,然后除了它之外还有一个叫LN获取列表的长度,那我们来取一下K2,它的长度是不是就四,就是V到V3拥有四个这么一个元素,所以这些呢,都是我们针对list列表中的常操作,各位把这些给他要知道。然后除了这个之外呢,下面还有三个,我快速演示一下啊,咱们看下一个叫l insert,它表示呢,在你这个值的后面或者前面插入一个新值,但是这个关键字你可以写比before,也可以写这个after,那我们现在用它做操作,比如现在我们在一个里边的前面或者后面插入这么一个进的值啊,那咱们来试一下啊,比如我来测试一下。L。
13:01
Insert。咱们在这个K2的地方插入值,然后后面你可以加after。或者说加before都可以,看你是在之前还是之后,就看你的实际,比如我们加一个before,然后before呢,我们在一个值的里边加入一个新的值,比如说啊,我们现在就来到这里边,咱们给它加一个值,我们就在这个就是这个。V11这里边吧,啊,咱们加入一个新的纸,这个新的纸呢,我就叫new v11现在做了这个操作啊,当然这个写到啊,它里边其实我们有点问题啊,咱给他快速改一下啊。我们看一下l insert应该是我这关键字写错了啊,Insertert就是这个,呃,关键字写的不对啊,快速改一下啊。Insert。然后里边我们再执行,然后它反应值是五,咱们看一下这个结果啊L值。
14:05
K20到负一,然后各位看在V11的前面是不是加了一个叫NEW11 new v11,这样的话我们就加入了,比如说啊,我们再加一个,比如现在用这个,我们在这个V1这个二的前面再加入这么一个值,咱们现在推车,然后再看一下l run指。K2。零到负一是不是加这个值,比如说我在加最后一个啊,为了咱一会儿测试方便啊,我们来一个V13,在它的前面加入这个值。513。然后咱们最终做个查看,现在你看啊,在V11前面,幺二前面,幺三前面是不是都加入这么一个禁止,这个叫insert,各位把这知道啊,然后除了这个之外呢,还有个下一命令叫r l rem,它表示删除。
15:07
删除的话呢,是从左边删除。而左边删除要删除就是N个Y6值,那什么意思,给大家演示一下啊。比如现在我用这个l rem,咱们叫K2,然后我删两个这个值,这个值呢,就是咱刚才加这个叫UV11,那他会把我前面的两个V11删掉,就是从左边开始的这两个会删掉。然后咱们执行,最终我们再查看一下,你看啊,前面两个这个NEW511是不是就没了,因为咱们用这个l rem就给它删掉了啊,这是基本命令,然后除了这个之外呢,还有最后一个叫l site,这好理解,是不是就设置了,然后怎么设置呢?这里写到啊,将你K下标为in代T值替换成Y流,其实做的就是一个替换操作,那咱们来测试一下啊L。
16:08
赛。我们叫K2,比如现在啊,我在第一个位置,咱给它换上一个新的这么一个值,这个值呢,之前叫V11,比如我叫这个at硅谷,最终咱们再查看一下。K2,零到负一,然后大家看第一个位置,也就是说下标是一的这个位置,其实它是第二个位置啊,我们变成是不是叫at硅谷啊,这个就叫l set,所以现在这些呢,都是针对这个列表例子中常见的操作给各位都演示完成的,要求各位把这命令都能给他记住,自己呢都能给他测出来,应该并不复杂,都是最基本操作。这个我们就完成了啊,然后完成之后呢,最后给大家来介绍一下re中列表list,它的底层的数据结构到底是怎么样的,给各位来说一下啊,就是底层的结构。
17:09
然后我这里写到list的数据结构是一个什么叫做快速链表,它叫做quick list子,注意啊,它本身是个list,但是它也是一种列表形式叫quick list的,那quick list什么特点给各位详细来说一下啊,咱们看一下我课件中写到的啊这个特点。就是第一种情况,如果说啊,你列表中元素比较少的时候,那它会怎么存储呢?它会省一块连续的那种存储,而这个结构叫做zip,就是一个压缩的一个列表,这是它的第一种形式。给各位写一下啊,比如现在我这数据很少,假如说只有两个元素,只有三个元素,那怎么做?它在内存中分在一块连续的这么一个空间,然后这空间它起名叫这个ZP,历史就叫做压缩列表,在这里边存储你的内容,这是它的一块区域,但是随着我们的数据量不断增加,那怎么做呢?它就在里边,就是每个少的元素都是一块这个压缩列表,它把多个压缩列表变成一个链表,最终组成咱们一个叫quick list,比如说现在如果你很少元素,那就是一个这个zp list压缩列表。
18:27
比如现在我这个里边可能会有多个这个压缩列表啊,给大家画一下有多个啊,当你数据很多,它里面会有多个压缩列表,然后他会怎么做,把多个压缩列表用列表形式进行,就是给它给到一起表示出来,这个过程就咱说这个叫quick例子用这个。多个压缩列表构成这么一个链表形式,所以这个粒子的底层结构就是这个样子,而这个结构中这里也写到啊,因为普通链表呢,需要附加指针,空间太大会比较浪费空间,比如说这里边啊,你需要这种东西,但是re中呢,将这个列表和这个压缩列表集合到一起,这样的话能极大减少我们这个空间的浪费,让你空间可以充分利用起来,而这么做既能满足插入删除性能,又不会出现太大的空间用于啊,但是它本身肯定也是用于,但是相对于我们普通链表,它可以说极大的交流空间。
19:29
所以这就是关于例子的一个底层结构,通过一个快速列表,快速列表中的每部分是一个压缩列表,当你数据比较少的时候,只有压缩列表,当你数据比较多的话,它用多个压缩列表构成这么一个列表形式,这是关于list的列表的相关操作。
我来说两句