日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

漫画:什么是跳跃表

發(fā)布時間:2023/12/3 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 漫画:什么是跳跃表 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載自?玻璃貓 程序員小灰




這是發(fā)生在很多年以前的故事......











幾天以前......












幾天之后......





拍賣行的商品總數(shù)量有幾十萬件,對應數(shù)據(jù)庫商品表的幾十萬條記錄。


如果是按照商品名稱精確查詢還好辦,可以直接從數(shù)據(jù)庫查出來,最多也就上百條記錄。


如果是沒有商品名稱的全量查詢怎么辦?總不可能把數(shù)據(jù)庫里的所有記錄全查出來吧,而且還要支持不同字段的排序。


所以,只能提前在內(nèi)存中存儲有序的全量商品集合,每一種排序方式都保存成獨立的集合,每次請求的時候按照請求的排序種類,返回對應的集合。



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



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



需要注意的是,當時還沒有Redis這樣的內(nèi)存數(shù)據(jù)庫,所以小灰只能自己實現(xiàn)一套合適的數(shù)據(jù)結構來存儲。





拍賣行商品列表是線性的,最容易表達線性結構的自然是數(shù)組和鏈表。可是,無論是數(shù)組還是鏈表,在插入新商品的時候,都會存在性能問題。


按照商品等級排序的集合為例,如果使用數(shù)組,插入新商品的方式如下:



如果要插入一個等級是3的商品,首先要知道這個商品應該插入的位置。使用二分查找可以最快定位,這一步時間復雜度是O(logN)。


插入過程中,原數(shù)組中所有大于3的商品都要右移,這一步時間復雜度是O(N)。所以總體時間復雜度是O(N)。



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



如果要插入一個等級是3的商品,首先要知道這個商品應該插入的位置。鏈表無法使用二分查找,只能和原鏈表中的節(jié)點逐一比較大小來確定位置。這一步的時間復雜度是O(N)。


插入的過程倒是很容易,直接改變節(jié)點指針的目標,時間復雜度O(1)。因此總體的時間復雜度也是O(N)。



對于擁有幾十萬商品的集合來說,這兩種方法顯然都太慢了。





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







































































  • 新節(jié)點和各層索引節(jié)點逐一比較,確定原鏈表的插入位置。O(logN)


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


  • 利用拋硬幣的隨機方式,決定新節(jié)點是否提升為上一級索引。結果為“”則提升并繼續(xù)拋硬幣,結果為“負”則停止。O(logN)


  • 總體上,跳躍表插入操作的時間復雜度是O(logN),而這種數(shù)據(jù)結構所占空間是2N,既空間復雜度是 O(N)。















  • 自上而下,查找第一次出現(xiàn)節(jié)點的索引,并逐層找到每一層對應的節(jié)點。O(logN)


  • 刪除每一層查找到的節(jié)點,如果該層只剩下1個節(jié)點,刪除整個一層(原鏈表除外)。O(logN)


  • 總體上,跳躍表刪除操作的時間復雜度是O(logN)。










    小灰和大黃并不知道,他們的這一解決方案和若干年后Redis當中的Sorted-set不謀而合。而Sorted-set這種有序集合,正是對于跳躍表的改進和應用。


    對于關系型數(shù)據(jù)庫如何維護有序的記錄集合呢?使用的是B+樹。有關B+樹的知識,將在以后的漫畫中詳細介紹。


    小伙伴們,感謝支持!




    —————END—————



    總結

    以上是生活随笔為你收集整理的漫画:什么是跳跃表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。