寫在前面: 本博文記錄下自己的理解,不屬於科普類分享
跳躍表是一種隨機化資料結構,基於併聯的鍊錶,其效率可以比擬平衡二叉樹,查詢、刪除、插入等操作都可以在對數期望時間內完成,對比平衡樹,跳躍表的實現要簡單直觀很多。
插入邏輯:
在上圖的基礎上,插入44這個數
假設44隨機生成的層數是2層
至此,插入工作完畢
效果如下所示:
插入與查詢以及刪除的邏輯其實都差不多
對於乙個普通的排序鍊錶,我們要進行增刪改時,無法隨機遍歷,只能順序遍歷,o(n)的時間複雜度,比較慢,如果資料量很大,直接崩潰。
而使用我們的跳表,則可以達到平均o(logn)的時間。
試想,乙個各個節點高度不一樣的鍊錶,參差不齊。
第一層的最多,在節點數量足夠多時,第一層佔比50%,第二層佔比25%,第三層佔比12.5%。。。
底層多,高層少。
當我們要從1000w個節點找到第660w個數時,我們從高層開始找,高層數的數量很少,我們僅用時很少的情況下,可能就找到了480w這個點,那麼480w之前的點我們就跳過去了,從而節省了事件。
然後在480w~1000w這個區間裡重複查詢,每次利用高度高的節點幫我們跳過多數節點
最終,我們可以近似的得到o(logn)的時間
redis中的5種資料結構之一的zset的一種實現方式之一
redis作者為了適合自己功能的需要,對原來的跳躍表進行了一下修改:
允許重複的score值:多個不同的元素(member)的score值可以相同
進行元素對比的時候,不僅要檢查score值,還需要檢查member:當score值相等時,需要比較member域進行比較。
結構儲存乙個tail指標:跳躍表的表尾指標
每個節點都有乙個高度為1層的前驅指標,用於從底層表尾向表頭方向遍歷
來自於跳表(skiplist)資料結構介紹
redis內部資料結構詳解之跳躍表(skiplist)
簡單理解的快速排序
快速排序就是c.r.a.hoare 於 1962年提出一種劃分交換排序,它採用了分治的策略,通常稱其為分治法。分治法的基本意思是 將原問題分解為若干規模更小但結構與原問題相似的子問題,遞迴地解答這些子問題,然後將這些子問題的解組合為原問題的解。快速排序的基本思想是 假設當前待排序的無序區為 a lo...
關於redis中zset底層跳表的理解
跳表是乙個隨機化的資料結構,實質就是一種可以進行二分查詢的有序鍊錶。跳表在原有的有序鍊錶上面增加了多級索引,通過索引來實現快速查詢。跳表不僅能提高搜尋效能,同時也可以提高插入和刪除操作的效能。考慮乙個有序鍊錶,我們要查詢3 7 17這幾個元素,我們只能從頭開始遍歷鍊錶,直到查詢到元素為止。上述這個鍊...
OI 關於快速冪的簡單理解
快速冪 因為a b c n a n b n c 所以n m可以分解為n m n a1 n a2 n a3.n ak a1 a2 a3.ak m 所以我們想到,如果存在k我們都知道二進位制轉十進位制時,是對每一位呈上位權,而計算機可以對十進位制數進行位運算,通過位運算可求出二進位制的每一位,tobe ...