如數組的二分查找,鏈表中逐漸縮小查找區域,來查詢目標數據。git
在單鏈表中查找數據,即便有序,因爲指針方向也只能從頭至尾遍歷鏈表。如何進行優化,讓查找次數減小呢? —— 跳錶 github
如圖,給鏈表創建一級索引層 這樣咱們查找某個節點能夠如今第一級查找出大體範圍,在逐漸縮小範圍,減小了查找次數。若是再創建一層:數組
查找次數再次減小。若是在數據量比較大的狀況,在鏈表中查找的效率會明顯提高。優化
這種在鏈表上加多級索引的結構,就是跳錶。查找到過程就是一個逐漸縮小範圍的過程。3d
時間複雜: 每層結點數m = n/(2^k); // 每兩個結點抽出一層 假設有k級,最高級索引有兩個結點。那麼有n個數據求層級數: n/(2^k) = 2; k = log2n-1。若是每一個層級都要遍歷m個結點,則總的時間複雜度O(m*logn)。 由於每兩個結點抽出一層,所以一個範圍內最多也就3個結點,m=3。時間複雜度O(logn)指針
空間複雜度:cdn
等比數列求和O(n),m大一些,空間複雜度會更加下降。同時,實際開發中索引層級中的節點只須要存儲須要進行比較的關鍵值和指針就行,相比於數據節點的對象來講,索引額外佔用的空間能夠忽略掉了。對象
插入: blog
時間複雜度:查找位置+插入 O(logn)刪除: 注意:當刪除節點的同時,索引也要刪除。還要找到前驅結點。索引
索引表添加節點