資料結構學習筆記五(跳錶)
一、什麼是跳錶
在普通連結串列中要查詢某個元素,只能從頭到尾遍歷連結串列。這樣查詢的時間複雜度很高(O(n))。為了提高查詢效率,可以對連結串列建立“索引”。連結串列加多級索引的結構,就是跳錶。在跳錶中查詢任意資料的時間複雜度為O(logn)。由於要儲存索引結構,空間複雜度為O(n),跳錶利用了“空間換時間”這種思想。
跳錶不僅支援查詢操作,還支援動態的插入、刪除操作,而且插入、刪除操作的時間複雜度也是O(logn)。
二、為什麼Redis要用跳錶來實現有序集合,而不是紅黑樹
Redis中的有序集合支援的核心操作主要有下面這幾個:
- 插入一個數據
- 刪除一個數據
- 查詢一個數據
- 按照區間查詢資料(比如查詢值[100,356]之間的資料)
- 迭代輸出有序序列
對於插入、刪除、查詢以及迭代輸出有序序列這幾個操作,紅黑樹也可以完成,時間複雜度跟跳錶是一樣的。但是,根據區間來查詢資料這個操作,紅黑樹的效率沒有跳錶高。對於按照區間查詢資料這個操作,跳錶可以做到O(logn)的時間複雜度定位區間的起點,然後再原始連結串列中順序往後遍歷就可以了。這樣做非常高效。
相關推薦
資料結構學習筆記五(跳錶)
一、什麼是跳錶 在普通連結串列中要查詢某個元素,只能從頭到尾遍歷連結串列。這樣查詢的時間複雜度很高(O(n))。為了提高查詢效率,可以對連結串列建立“索引”。連結串列加多級索引的結構,就是跳錶。在跳錶
資料結構學習筆記六(散列表)
一、散列表的由來 散列表用的就是陣列支援按照下標隨機訪問的時候時間複雜度是O(1)的特性。我們通過雜湊函式把元素的鍵值對映為下標,然後將資料儲存在陣列中對應下標的位置。當我們按照鍵值查詢元素時,我們用
資料結構學習筆記四(二分查詢)
一、什麼是二分查詢 二分查詢針對的是一個有序的資料集合,每次都通過更區間的中間元素做對比,將要查詢的區間縮小為原來的一半,直到找到要查詢的元素,或者區間被縮小為0。其時間複雜度為O(logn)。
資料結構學習筆記-串(C語言實現)
串由零個或多個字元組成,說白了就是字串。串的儲存方式相對於線性表來講有些不同,他分為以下幾種:順序儲存、堆分配儲存、鏈式儲存。順序儲存通常在陣列中的頭元素存放字串長度。堆分配儲存通常會動態分配空間。鏈式儲存分為兩種,一種是每個節點存放一個字元(比較浪費空間),另一種則是每個節
資料結構學習筆記七(雜湊演算法)
一、什麼是雜湊演算法 將任意長度的任意二進位制值串對映為固定長度的二進位制值串,這個對映的規則就是雜湊演算法,而通過原始資料對映之後得到的二進位制值串就是雜湊值。 雜湊演算法需要滿足的要求:
資料結構學習筆記三(排序)
一、氣泡排序 氣泡排序只會操作相鄰的兩個資料。每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關係要求。如果不滿足就讓它倆互換。一次冒泡會讓至少一個元素移動到它應該在的位置,重複n次,就完成了n個數據的排序工作。 //氣泡排序,n表示陣列中元素個數 public void
微信小程序學習筆記五(持續更新)---小程序上傳文件
gin false round count splice dex 一個 key 屬性 項目中需要用戶上傳圖片,需要實現,上傳按鈕默認為一個,在上傳一張圖片之後,自動增加一個上傳按鈕,上傳三張圖片後按鈕消失。 實現思路: 1、圖片路徑存儲在一個數組中,增加和刪除圖片是對數組進
資料結構(Java筆記)—佇列(順序佇列)
佇列(Queue)—先進先出線性表,佇列結構具有特殊的運算規則,從資料的邏輯結構來看,佇列結構是一種線性表;從資料的儲存結構來看,佇列結構分為順序佇列結構和鏈式佇列結構; 順序佇列結構:使用一組地址連
微信小程式學習筆記五(持續更新)---上傳檔案
專案中需要使用者上傳圖片,需要實現,上傳按鈕預設為一個,在上傳一張圖片之後,自動增加一個上傳按鈕,上傳三張圖片後按鈕消失。 實現思路: 1、圖片路徑儲存在一個數組中,增加和刪除圖片是對陣列進行操作; 2、僅一個按鈕,新增計數器,num=1;當num==3時,設定按鈕隱藏。 直接上程式
一個菜鳥的資料結構學習之路(棧篇)
棧的基本操作如下: 相關結構體: typedef int status; typedef struct { SElemType *base; //在棧建立之前和銷燬之後,base的值為NULL SElemType *top; //棧
資料結構學習之堆疊(順序儲存)
【摘要】在計算機領域,堆疊是一個不容忽視的概念,堆疊是兩種資料結構。堆疊都是一種資料項按序排列的資料結構,只能在一端(稱為棧頂(top))對資料項進行插入和刪除。在微控制器應用中,堆疊是個特殊的儲存區,主要功能是暫時存放資料和地址,通常用來保護斷點和現場。要點:
資料結構學習筆記------紅黑樹(附c++程式碼)
1、紅黑樹簡介 紅黑樹是二叉查詢樹的一種,其增刪改查的統計效能要優於AVL樹,查詢、插入、刪除演算法的複雜度都為O(log(n))。先附上紅黑樹這種資料結構的性質: 性質1、節點是紅色或黑色。 性質2、根節點是黑色。 性質3、每個葉節點(是指的空節點,nil節點)是黑色的。 性質4、
資料結構學習筆記------並查集(附cf例題)
並查集是將原始的資料集S看成一個森林,每棵樹代表一個集合。初始時,每個資料看成一顆只有根節點的樹,根據具體要求,將若干樹合併起來組成若干個含有節點較多的樹,每棵樹就是一個集合。此資料結構可以方便的對資料集S進行:(1)查詢其屬於哪個集合(2)將一個集合合併到另一個集合的操作。要注意的是,
資料結構學習筆記——C++實現雙向迴圈連結串列模板類(超詳解)
定義了兩個標頭檔案分別放置結點類模板(Node.h)和雙鏈表模板(DoubleLinkList.h), 然後在原始檔的main函式中測試。 Node.h #pragma once # include <iostream> template <class
資料結構學習筆記——線性表之順序表(c語言實現)
1.概念 順序表即線性表的順序儲存結構 ,指的是用一段地址連續的儲存單元依次儲存線性表資料元素。線上性表中,每個資料元素的型別都相同,一般可以用一維陣列來實現順序儲存結構。 2.實現 (1)建立順序表的結構 利用c語言結構體來建立順序表的結構,順序表結構體中
資料結構學習筆記——堆疊之鏈式儲存結構(c語言實現)
棧的鏈式儲存結構使用單鏈表實現,同線性表一樣,鏈式儲存結構的堆疊在儲存空間的利用上顯得更加靈活,只要硬體允許一般不會出現溢位的情況。但鏈式棧相對於順序棧稍顯麻煩,若所需堆疊空間確定,順序棧顯得方便一些。關於鏈式和順序式的選擇視具體情況而定。 1.棧的鏈式儲存結構
資料結構學習筆記Day2-單鏈表(用java實現)
一、首先說一下線性表 1. 什麼是線性表,線性表的邏輯特性? 1)有一個頭(表頭),有一個尾(表尾) 2)表頭與表尾之間的元素有且只有一個前驅元素,有且只有一個後繼元素 2.線性表有兩種儲存方式? 順序表和連結串列 3.順序表和連結串列的區別? 1)順序表是一邊
資料結構學習筆記(二)
一、棧 棧是一種操作受限的資料結構,只支援入棧和出棧操作。後進先出(LIFO)是它的最大的特點。棧既可以通過陣列實現,也可以通過連結串列實現。不管基於陣列還是連結串列,入棧、出棧的時間複雜度都為O(1)。 二
資料結構學習筆記(一)
一.陣列 陣列用一塊連續的記憶體空間,來儲存形同型別的一組資料,最大的特點就是支援隨機訪問,但插入,刪除操作也因此變得比較低效(為了保持記憶體資料的連續性),平均情況時間複雜度為O(n)。在平時的業務開發中,我們
資料結構學習筆記(18)---B樹
(1)什麼是B樹,其實有一個另外的名字叫B-樹,所以網上說的B-樹其實就是B樹。 B樹的定義: (1) 首先B樹是一棵平衡的m路查詢樹,樹中每個節點的最多有m個子樹。 (2) 根節點最少有兩個子樹。 (3) 除根節點以外的非葉子結點最少有[m/2]個子樹