漫画 | 什么是跳跃表?

超、凢脫俗 2022-04-23 11:18 347阅读 0赞

转自:https://baijiahao.baidu.com/s?id=1571323359136961&wfr=spider&for=pc

u_782180186_2337896488_fm_173_s_BD2479331B404C430A5171C80000B030_w_640_h_295_img.JPEG

u_3160413847_2737522790_fm_173_s_901478331B507C450A5111D800009030_w_640_h_295_img.JPEG

u_2526996680_1319499160_fm_173_s_BC2478331B524843085171C80000B0B0_w_640_h_295_img.JPEG

u_1135333528_3736611531_fm_173_s_BC08743313504865087111D80000D030_w_640_h_295_img.JPEG

几天以前……

u_3636100273_1700314107_fm_173_s_B524703317D04DCA045521CA0100A0B2_w_640_h_295_img.JPEG

u_3602435765_840380127_fm_173_s_A0D61BC6D3E483685E71D08F0300E0C1_w_640_h_361_img.JPEG

u_275975966_1602195416_fm_173_s_B424793317504DC8045521CA0100A0B2_w_640_h_295_img.JPEG

u_2552947724_1902399755_fm_173_s_B424783317D04DC80C5521CA0100A0B2_w_640_h_295_img.JPEG

u_2777353497_2709005730_fm_173_s_1434E9331B507C414E5501DA0000C0B2_w_640_h_295_img.JPEG

几天之后……

u_2536890468_1424028716_fm_173_s_1AAA742355CBECE85EF541C60100E0B2_w_300_h_300_img.JPEG

拍卖行的商品总数量有几十万件,对应数据库商品表的几十万条记录。

如果是按照商品名称精确查询还好办,可以直接从数据库查出来,最多也就上百条记录。

如果是没有商品名称的全量查询怎么办?总不可能把数据库里的所有记录全查出来吧,而且还要支持不同字段的排序。

所以,只能提前在内存中存储有序的全量商品集合,每一种排序方式都保存成独立的集合,每次请求的时候按照请求的排序种类,返回对应的集合。

比如按价格字段排序的集合:

比如按等级字段排序的集合:

需要注意的是,当时还没有Redis这样的内存数据库,所以小灰只能自己实现一套合适的数据结构来存储。

u_2338032725_4056282512_fm_173_s_0A2A742355CAECE85EE551C60100F0B2_w_300_h_300_img.JPEG

拍卖行商品列表是线性的,最容易表达线性结构的自然是数组和链表。可是,无论是数组还是链表,在插入新商品的时候,都会存在性能问题。

按照商品等级排序的集合为例,如果使用数组,插入新商品的方式如下:

u_1914285287_3874265004_fm_173_s_EDF0A452CC3E7E88424D14D6020010B0_w_531_h_501_img.JPEG

如果要插入一个等级是3的商品,首先要知道这个商品应该插入的位置。使用二分查找可以最快定位,这一步时间复杂度是O(logN)。

插入过程中,原数组中所有大于3的商品都要右移,这一步时间复杂度是O(N)。所以总体时间复杂度是O(N)。

如果使用链表,插入新商品的方式如下:

u_676400304_2782617717_fm_173_s_C1F0AC72CD736F88544130D60200C0B0_w_599_h_486_img.JPEG

如果要插入一个等级是3的商品,首先要知道这个商品应该插入的位置。链表无法使用二分查找,只能和原链表中的节点逐一比较大小来确定位置。这一步的时间复杂度是O(N)。

插入的过程倒是很容易,直接改变节点指针的目标,时间复杂度O(1)。因此总体的时间复杂度也是O(N)。

这对于拥有几十万商品的集合来说,这两种方法显然都太慢了。

u_629644169_3666000783_fm_173_s_00106D33495EFCC84E7850CE010080B2_w_300_h_300_img.JPEG

——————————————

u_707130396_3850943654_fm_173_s_3C087C3353106867087911D80000D0B0_w_640_h_295_img.JPEG

u_678033275_2835792792_fm_173_s_3D0875331F004C43085931C80000F030_w_640_h_295_img.JPEG

u_216424768_3274233225_fm_173_s_B034783313105865085151D800009030_w_640_h_295_img.JPEG

u_304607216_1061586948_fm_173_s_B52478330B404C430A5171C80000B030_w_640_h_295_img.JPEG

u_1518528724_729513897_fm_173_s_B524783303C049430A5131C80000B0B0_w_640_h_295_img.JPEG

u_798467208_2683764292_fm_173_s_BA0C79230B407C47487111D8000090B0_w_640_h_295_img.JPEG

u_869037700_2846670698_fm_173_s_BD34E9131F407843487151D800009030_w_640_h_295_img.JPEG

u_2797050817_4254960536_fm_173_s_1435E0330FC07943087151D80100D030_w_640_h_295_img.JPEG

u_620127787_3733628554_fm_173_s_A4B8E4324711F2210CF5055C020030B3_w_640_h_166_img.JPEG

u_2915186909_3929172660_fm_173_s_BC34E0131F405D430A7111D800009030_w_640_h_295_img.JPEG

u_209698409_920607908_fm_173_s_0FE6FC12F024F303426504FE0300E033_w_640_h_234_img.JPEG

u_2009096853_2835886744_fm_173_s_80FAEC32C910D2030CC5255E020060B3_w_640_h_209_img.JPEG

u_2689450324_226545809_fm_173_s_1C34E01307407943487111D801009030_w_640_h_295_img.JPEG

u_1295572172_1256537874_fm_173_s_AF6AE412CF51F601424500D6020070B3_w_640_h_207_img.JPEG

u_2362644991_1092388629_fm_173_s_8CE8E4126313F2280C75015D020030B3_w_640_h_145_img.JPEG

u_2446539674_4166324921_fm_173_s_BD74E9130F4079430A7111D800009030_w_640_h_295_img.JPEG

u_1059902209_990153066_fm_173_s_BD2478330BC049430A5131C80000B0B0_w_640_h_295_img.JPEG

u_4087162989_1957208499_fm_173_s_B534783303C04D4B085131C80100B0B0_w_640_h_295_img.JPEG

u_4176172167_457913969_fm_173_s_88FAE412C711D22346512CD6020080F2_w_640_h_231_img.JPEG

u_862915727_2972901052_fm_173_s_9414683317505DCA0A7111D8010090B0_w_640_h_295_img.JPEG

u_1820954124_1998980662_fm_173_s_B41C70335B407C430A5151D8000090B0_w_640_h_295_img.JPEG

u_1290433961_1212768914_fm_173_s_B524783307C04D490A5131C80000B0B0_w_640_h_295_img.JPEG

u_3332110879_2317306320_fm_173_s_B424783317C04D49085131C80100B0B0_w_640_h_295_img.JPEG

u_3580269272_553625613_fm_173_s_B42478331B107C41085151D800009030_w_640_h_295_img.JPEG

u_3478428825_1536838821_fm_173_s_BC24783307C04D4B0A5171C80000B0B0_w_640_h_295_img.JPEG

u_1356810579_3385739244_fm_173_s_B52479331FC049430A5131C80000B030_w_640_h_295_img.JPEG

u_645199812_383557928_fm_173_s_BA2675231B505C41087971D0000090B0_w_640_h_295_img.JPEG

u_2722996740_1438205229_fm_173_s_B92C7D3307D04DCA085131C80100B0B0_w_640_h_295_img.JPEG

u_81630421_309850762_fm_173_s_39247533174049430A5131C80000B0B0_w_640_h_295_img.JPEG

u_1233222363_3195609107_fm_173_s_CBEAA552C753F221544168D20200D0F2_w_640_h_237_img.JPEG

u_2051283880_3994167421_fm_173_s_C9EBAD52CD13C003544168DA020030F2_w_640_h_246_img.JPEG

u_4023717978_3275907331_fm_173_s_CEEBA552CD51E003544168520200E0F2_w_640_h_235_img.JPEG

u_2905668342_2260564150_fm_173_s_BE2C7D231F006C41087971D0000090B0_w_640_h_295_img.JPEG

u_4085865737_712530036_fm_173_s_BD24783307C04D4B085131C80000B0B0_w_640_h_295_img.JPEG

u_3125860031_2081304736_fm_173_s_B424703303C0494B0A5131C80000B030_w_640_h_295_img.JPEG

u_439349626_2525456141_fm_173_s_39247C330B404C43085971C80000B0B0_w_640_h_295_img.JPEG

新节点和各层索引节点逐一比较,确定原链表的插入位置。O(logN)

把索引插入到原链表。O(1)

利用抛硬币的随机方式,决定新节点是否提升为上一级索引。结果为“正”则提升并继续抛硬币,结果为“负”则停止。O(logN)

总体上,跳跃表插入操作的时间复杂度是O(logN),而这种数据结构所占空间是2N,既空间复杂度是 O(N)。

u_2095193009_495812260_fm_173_s_B43479330F506845085151D800009030_w_640_h_295_img.JPEG

u_82065600_3924227707_fm_173_s_BD24703307C04D4B085131C80000B0B0_w_640_h_295_img.JPEG

u_2334060984_272094795_fm_173_s_BC247C3307C04D43085131C80000B030_w_640_h_295_img.JPEG

u_536082564_3976559421_fm_173_s_8CB8E412CA11D2035E4824D6020090B2_w_640_h_213_img.JPEG

u_3610817856_3072314785_fm_173_s_ACEAE4124713F2284AF445DB0200F0B3_w_640_h_151_img.JPEG

u_3718581796_2484979896_fm_173_s_B12478331B4048430A5171C80000B030_w_640_h_295_img.JPEG

自上而下,查找第一次出现节点的索引,并逐层找到每一层对应的节点。O(logN)

删除每一层查找到的节点,如果该层只剩下1个节点,删除整个一层(原链表除外)。O(logN)

总体上,跳跃表删除操作的时间复杂度是O(logN)。

u_3267407043_3969957470_fm_173_s_B41460330F407843085151D800009030_w_640_h_295_img.JPEG

u_2108883981_1478506002_fm_173_s_BC24703307D04DC8085131C80100B030_w_640_h_295_img.JPEG

u_709961611_2498675786_fm_173_s_BD2478331B404D410A5171C80000B030_w_640_h_295_img.JPEG

小灰和大黄并不知道,他们的这一解决方案和若干年后Redis当中的Sorted-set不谋而合。而Sorted-set这种有序集合,正是对于跳跃表的改进和应用。

发表评论

表情:
评论列表 (有 0 条评论,347人围观)

还没有评论,来说两句吧...

相关阅读