1. 程式人生 > >數據結果的擴展—跳躍表

數據結果的擴展—跳躍表

str 分享 直接 大小 adf size 如果 復雜 16px

知識來源:算法導論

數據結構的擴展步驟:(在真正設計的時候,下面的步驟的順序可以置換)

  1.選擇一種基礎數據結構   2.確定基礎數據結構中需要維護的附加信息   3.檢驗基礎數據結構上的基本修改操作能否維護附加信息   4.設計需要的新操作 技術分享圖片

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

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

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

技術分享圖片

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

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

對於比較龐大的數據操作來說,這兩種方法顯然都太慢了。

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

跳躍表(Skip Lists)是一種基於有序鏈表的擴展技術分享圖片 技術分享圖片 技術分享圖片 技術分享圖片 技術分享圖片 技術分享圖片 技術分享圖片 技術分享圖片 技術分享圖片 插入

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

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

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

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

刪除 技術分享圖片 技術分享圖片

自上而下,查找第一次出現節點的索引,並逐層找到每一層對應的節點。O(logN)

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

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

數據結果的擴展—跳躍表