1029:跳錶
目錄
一、什麼是跳錶?
為一個值有序的連結串列建立多級索引,比如每2個節點提取一個節點到上一級,我們把抽出來的那一級叫做索引或索引層。如下圖所示,其中down表示down指標,指向下一級節點。以此類推,對於節點數為n的連結串列,大約可以建立log2n-1級索引。像這種為連結串列建立多級索引的資料結構就稱為跳錶。
二、跳錶的時間複雜度?
1.計算跳錶的高度
如果連結串列有n個節點,每2個節點抽取抽出一個節點作為上一級索引的節點,那第1級索引的節點個數大約是n/2,第2級索引的節點個數大約是n/4,依次類推,第k級索引的節點個數就是n/(2^k)。
假設索引有h級別,最高階的索引有2個節點,則有n/(2^h)=2,得出h=log2n-1,包含原始連結串列這一層,整個跳錶的高度就是log2n。
2.計算跳錶的時間複雜度
假設我們在跳錶中查詢某個資料的時候,如果每一層都遍歷m個節點,那在跳錶中查詢一個數據的時間複雜度就是O(m*logn)。
那這個m是多少呢?如下圖所示,假設我們要查詢的資料是x,在第k級索引中,我們遍歷到y節點之後,發現x大於y,小於後面的節點z,所以我們通過y的down指標,從第k級下降到第k-1級索引。在第k-1級索引中,y和z之間只有3個節點(包含y和z),所以,我們在k-1級索引中最多隻需要遍歷3個節點,以此類推,每一級索引都最多隻需要遍歷3個節點。所以m=3。
因此在跳錶中查詢某個資料的時間複雜度就是O(logn)。
三、跳錶的空間複雜度及如何優化?
1.計算索引的節點總數
如果連結串列有n個節點,每2個節點抽取抽出一個節點作為上一級索引的節點,那每一級索引的節點數分別為:n/2,n/4,n/8,…,8,4,2,等比數列求和n-1,所以跳錶的空間複雜度為O(n)
2.如何優化空間複雜度
如果連結串列有n個節點,每3或5個節點抽取抽出一個節點作為上一級索引的節點,那每一級索引的節點數分別為(以3為例):n/3,n/9,n/27,…,27,9,3,1,等比數列求和n/2,所以跳錶的空間複雜度為O(n),但是和每2個節點抽取一次相比,時間複雜度要高不少。
四、高效的動態插入和刪除?
跳錶本質上就是連結串列,所以僅插作,入和刪除操時間複雜度就為O(1),但在實際情況中,要插入或刪除某個節點,需要先查詢到指定位置,而這個查詢操作比較費時,但在跳錶中這個查詢操作的時間複雜度是O(logn),所以,跳錶的插入和刪除操作的是時間複雜度也是O(logn)。
五、跳錶索引動態更新?
當往跳錶中插入資料的時候,可以選擇同時將這個資料插入到部分索引層中,那麼如何選擇這個索引層呢?可以通過隨機函式來決定將這個節點插入到哪幾級索引中,比如隨機函式生成了值K,那就可以把這個節點新增到第1級到第K級索引中。