數據結果的擴展—跳躍表
阿新 • • 發佈:2018-10-03
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)。
數據結果的擴展—跳躍表