資料結構與演算法-跳錶《八》
一、什麼是跳錶?
為一個值有序的連結串列建立多級索引,比如每2個節點提取一個節點到上一級,我們把抽出來的那一級叫做索引或索引層。如下圖所示,其中down表示down指標,指向下一級節點。以此類推,對於節點數為n的連結串列,大約可以建立log2n-1級索引。像這種為連結串列建立多級索引的資料結構就稱為跳錶。
二、跳錶的時間複雜度?
- 計算跳錶的高度
如果連結串列有n個節點,每2個節點抽取抽出一個節點作為上一級索引的節點,那第1級索引的節點個數大約是n/2,第2級索引的節點個數大約是n/4,依次類推,第k級索引的節點個數就是n/(2k)。假設索引有h級別,最高階的索引有2個節點,則有n/(2h)=2,得出h=log2n-1,包含原始連結串列這一層,整個跳錶的高度就是log2n。 - 計算跳錶的時間複雜度
假設我們在跳錶中查詢某個資料的時候,如果每一層都遍歷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)。
三、跳錶的空間複雜度及如何優化?
- 計算索引的節點總數
如果連結串列有n個節點,每2個節點抽取抽出一個節點作為上一級索引的節點,那每一級索引的節點數分別為:n/2,n/4,n/8,…,8,4,2,等比數列求和n-1,所以跳錶的空間複雜度為O(n)。 - 如何優化時間複雜度
如果連結串列有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級索引中。
相關文章
- 資料結構與演算法整理總結---跳錶資料結構演算法
- 資料結構和演算法之——跳錶資料結構演算法
- 資料結構之跳錶資料結構
- 資料結構與演算法(八):排序資料結構演算法排序
- 資料結構與演算法---跳躍表資料結構演算法
- 跳躍表資料結構與演算法分析資料結構演算法
- 自己動手實現java資料結構(九) 跳錶Java資料結構
- 資料結構與演算法-資料結構(棧)資料結構演算法
- C#資料結構與演算法系列(八):棧(Stack)C#資料結構演算法
- 資料結構與演算法資料結構演算法
- 資料結構:初識(資料結構、演算法與演算法分析)資料結構演算法
- 資料結構與演算法:圖形結構資料結構演算法
- 複習資料結構:排序演算法(八)——基排序資料結構排序演算法
- 【JavaScript 演算法與資料結構】JavaScript演算法資料結構
- 資料結構與演算法03資料結構演算法
- 演算法與資料結構——序演算法資料結構
- 資料結構與演算法——概述資料結構演算法
- 資料結構與演算法-堆資料結構演算法
- 資料結構與演算法02資料結構演算法
- 資料結構與演算法(1)資料結構演算法
- 資料結構與演算法——排序資料結構演算法排序
- 資料結構與演算法——字串資料結構演算法字串
- 資料結構與演算法(java)資料結構演算法Java
- 【資料結構與演算法】bitmap資料結構演算法
- 資料結構:跳躍連結串列資料結構
- 資料結構與演算法之線性結構資料結構演算法
- 資料結構與演算法-連結串列資料結構演算法
- python演算法與資料結構-什麼是資料結構Python演算法資料結構
- [資料結構與演算法] 排序演算法資料結構演算法排序
- python演算法與資料結構-演算法和資料結構介紹(31)Python演算法資料結構
- 資料結構(一)--- 跳躍表資料結構
- Redis資料結構—跳躍表Redis資料結構
- 7.跳錶:各方面都非常優秀的動態資料結構資料結構
- [資料結構與演算法] 邂逅棧資料結構演算法
- 資料結構與演算法分析——棧資料結構演算法
- JavaScript資料結構與演算法——集合JavaScript資料結構演算法
- 【資料結構與演算法】快速冪資料結構演算法
- 資料結構與演算法——堆排序資料結構演算法排序