二分查找法依賴於數組的隨機訪問特性,只能用數組實現算法
跳錶是基於鏈表實現相似於二分查找的算法數組
查找、插入、刪除各方面性能都不錯的動態數據結構,甚至能夠替代紅黑樹數據結構
Redis 中的有序集合(Sorted Set)就是用跳錶來實現的函數
上級索引經過指針降低到下級索引性能
當每級索引都是兩個結點抽出一個結點做爲上一級索引的結點時,每一層最多遍歷3個結點spa
時間複雜度爲 \(O(2*logn)\),即 \(O(logn)\)指針
若是每一層最多要遍歷 m 個結點,那麼時間複雜度爲 \(O(m*logn)\)對象
在單鏈表中,若是知道要插入的位置,插入結點的時間複雜度是 \(O(1)\)索引
爲了保證原始鏈表中數據的有序性,須要先找到要插入的位置,這個查找操做比較耗時內存
查找某個結點的的時間複雜度是 \(O(logn)\),查找某個數據應該插入的位置,時間複雜度也是 \(O(logn)\)
比起單鏈表,跳錶須要存儲多級索引,要消耗更多的存儲空間
若是將包含 n 個結點的單鏈表構形成跳錶,須要額外再用接近 n 個結點的存儲空間
每隔三個結點抽出一個結點比每隔兩個會節省索引存儲空間,但性能會降低
在實際的軟件開發中,原始鏈表中存儲的多是很大的對象
而索引結點只須要存儲關鍵值和幾個指針,並不須要存儲對象
因此當對象比索引結點大不少時,索引佔用的額外空間能夠忽略
跳錶中插入數據,若是不更新索引,某 2 個索引結點之間數據過多,性能退化
跳錶是經過隨機函數來維護索引與原始鏈表大小之間的平衡
經過隨機函數,來決定將這個結點插入到哪幾級索引中
好比隨機函數生成了值 K,就將這個結點添加到第一級到第 K 級索引中
隨機函數的選取很重要,從機率上來說,可以保證跳錶的索引大小和數據大小平衡性,避免性能過分退化