數(shù)據(jù)庫(kù)中的幾種數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)庫(kù)中的幾種數(shù)據(jù)結(jié)構(gòu)

陣列

  • 二維陣列是最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)。一個(gè)表可以看做是一個(gè)陣列:

| |column 0|column 1|column 2|
|--|--|--|--|--|
|row 0|fy|4|CHN|
|row 1|ame|1|CHN|
|row 2|maybe|2|CHN|
|row 3|charles|3|CHN|
|row 4|xNova|5|CHN|
|...|..|...|..|
|row n|..|..|..|..

這個(gè)二維陣列是帶有行與列的表:

  • 每個(gè)行代表一個(gè)主體
  • 列用來(lái)描述主體的特征
  • 每個(gè)列保存某一種類(lèi)型對(duì)數(shù)據(jù)

當(dāng)要查找特定的值時(shí),這種數(shù)據(jù)結(jié)構(gòu)需要對(duì)每一行的值進(jìn)行判斷娶牌。這會(huì)造成N次運(yùn)算衅胀,復(fù)雜度是O(N)

樹(shù)和數(shù)據(jù)庫(kù)索引

  • 二叉查找樹(shù)/二叉搜索樹(shù):
    一種帶有特殊屬性的二叉樹(shù)稚新,每個(gè)節(jié)點(diǎn)的值滿(mǎn)足:
    • 比保存在左子樹(shù)的任何鍵值都要大
    • 比保存在右子樹(shù)的任何鍵值都要小


      image

這個(gè)樹(shù)有N=15個(gè)元素。如果要找208概龄,會(huì)從根節(jié)點(diǎn)開(kāi)始尋找:

  • 136 < 208 --> 去找節(jié)點(diǎn)136的右子樹(shù)
  • 298 > 208 --> 去找節(jié)點(diǎn)398的左子樹(shù)
  • 50>208 --> 去找節(jié)點(diǎn)250的左子樹(shù)
  • 200<208 --> 去找節(jié)點(diǎn)200的右子樹(shù)丐谋。但是 200 沒(méi)有右子樹(shù)芍碧,值不存在(因?yàn)槿绻嬖冢鼤?huì)在 200 的右子樹(shù))

一次查詢(xún)的成本基本就是樹(shù)內(nèi)部的層數(shù)号俐,這個(gè)成本是log(N)

B+樹(shù)索引

查找一個(gè)特定的值時(shí)泌豆,二叉查找樹(shù)挺好用的,但是當(dāng)我們需要查找某一個(gè)范圍之間的多個(gè)元素時(shí)吏饿,我們還是要對(duì)每一個(gè)節(jié)點(diǎn)進(jìn)行遍歷践美,以判斷它是否處于那兩個(gè)值之間,這樣你必須讀取整個(gè)樹(shù),成本是O(N)找岖。
為了解決這個(gè)問(wèn)題陨倡,現(xiàn)代數(shù)據(jù)庫(kù)使用了一種修訂版的樹(shù)---B+樹(shù):

  • 只有最底層的葉子節(jié)點(diǎn)才保存信息
  • 其它節(jié)點(diǎn)只是用來(lái)指引到正確的節(jié)點(diǎn)


    image

    可以看到節(jié)點(diǎn)多了兩倍,同時(shí)最底層的節(jié)點(diǎn)是跟后續(xù)節(jié)點(diǎn)相連的许布。

用這個(gè)B+樹(shù)兴革,如果要找某個(gè)范圍內(nèi)(例如40到100之間)的值:

  • 找到40(49不存在則找40之后最貼近的值),就像在二叉查找樹(shù)中的那樣蜜唾。
  • 向后遍歷節(jié)點(diǎn)杂曲,直到找到100

找到了 M 個(gè)后續(xù)節(jié)點(diǎn),樹(shù)總共有 N 個(gè)節(jié)點(diǎn)袁余。對(duì)指定節(jié)點(diǎn)的搜索成本是 log(N)擎勘,跟上一個(gè)樹(shù)相同。但是當(dāng)你找到這個(gè)節(jié)點(diǎn)之后颖榜,你可以通過(guò)后續(xù)節(jié)點(diǎn)的連接得到 M 個(gè)后續(xù)節(jié)點(diǎn)棚饵,這需要 M 次運(yùn)算煤裙。那么這次搜索只消耗了 M+log(N) 次運(yùn)算

這種方式方便查找,但是需要在節(jié)點(diǎn)之間保持順序噪漾,所以在插入和刪除數(shù)據(jù)時(shí)硼砰,為了維護(hù)這個(gè)B+樹(shù),需要以每個(gè)索引O(log(N))的代價(jià)來(lái)更新索引欣硼。這樣的話(huà)就會(huì)減慢插入/更新/刪除的操作题翰。

哈希表

這個(gè)數(shù)據(jù)結(jié)構(gòu)被數(shù)據(jù)庫(kù)用來(lái)保存一些內(nèi)部的東西(比如鎖表或者緩沖池)
哈希表可以通過(guò)關(guān)鍵字來(lái)快速找到一個(gè)元素,為了構(gòu)建一個(gè)hash表诈胜,你需要定義:

  • 元素的關(guān)鍵字
  • 哈希函數(shù): 根據(jù)元素的關(guān)鍵字給出對(duì)應(yīng)的hash值
  • 比較函數(shù):通過(guò)hash值在桶中找到需要的元素

例子:


image

對(duì)于這個(gè)存儲(chǔ)數(shù)字的hash表豹障,我們定義:

  • 元素關(guān)鍵字: 數(shù)字本身
  • 哈希函數(shù): 對(duì)10取模
        def hash(num):
            return num % 10
    
  • 比價(jià)函數(shù):判斷兩個(gè)整數(shù)是否相等

尋找元素78:

  1. hash(78) = 8
  2. 查找hash桶8,找到第一個(gè)元素78,
  3. 返回78

搜索耗費(fèi)了2次運(yùn)算

找元素 59:

  1. 哈希表計(jì)算 59 的哈希碼焦匈,等于9沼填。

  2. 查找哈希桶 9,第一個(gè)找到的元素是 99括授。因?yàn)?99 不等于 59, 那么 99 不是正確的元素岩饼。

  3. 用同樣的邏輯荚虚,查找第二個(gè)元素(9),第三個(gè)(79)籍茧,……版述,最后一個(gè)(29)。
    元素不存在寞冯。

搜索耗費(fèi)了 7 次運(yùn)算渴析。

從列子可以看出,根據(jù)查找的值吮龄,每次尋找的成本(計(jì)算次數(shù))可能并不相同俭茧。

一個(gè)好的hash函數(shù)會(huì)將所有的元素盡可能地均勻分配在hash桶中,這樣會(huì)盡可能地減少查找次數(shù)漓帚。

如果有了好的哈希函數(shù)母债,在哈希表里搜索的時(shí)間復(fù)雜度是 O(1)。

陣列 vs 哈希表

  • 一個(gè)哈希表可以只裝載一半到內(nèi)存尝抖,剩下的哈希桶可以留在硬盤(pán)上毡们。
  • 用陣列的話(huà),你需要一個(gè)連續(xù)內(nèi)存空間昧辽。如果你加載一個(gè)大表衙熔,很難分配足夠的連續(xù)內(nèi)存空間。
  • 用哈希表的話(huà)搅荞,你可以選擇你要的關(guān)鍵字(比如红氯,一個(gè)人的國(guó)家和姓氏)框咙。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市脖隶,隨后出現(xiàn)的幾起案子扁耐,更是在濱河造成了極大的恐慌,老刑警劉巖产阱,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婉称,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡构蹬,警方通過(guò)查閱死者的電腦和手機(jī)王暗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)庄敛,“玉大人俗壹,你說(shuō)我怎么就攤上這事≡蹇荆” “怎么了绷雏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)怖亭。 經(jīng)常有香客問(wèn)我涎显,道長(zhǎng),這世上最難降的妖魔是什么兴猩? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任期吓,我火速辦了婚禮,結(jié)果婚禮上倾芝,老公的妹妹穿的比我還像新娘讨勤。我一直安慰自己,他們只是感情好晨另,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布潭千。 她就那樣靜靜地躺著,像睡著了一般借尿。 火紅的嫁衣襯著肌膚如雪脊岳。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天垛玻,我揣著相機(jī)與錄音割捅,去河邊找鬼。 笑死帚桩,一個(gè)胖子當(dāng)著我的面吹牛亿驾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播账嚎,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼莫瞬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼儡蔓!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起疼邀,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤喂江,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后旁振,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體获询,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年拐袜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吉嚣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蹬铺,死狀恐怖尝哆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情甜攀,我是刑警寧澤秋泄,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站规阀,受9級(jí)特大地震影響恒序,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姥敛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瞎暑。 院中可真熱鬧彤敛,春花似錦、人聲如沸了赌。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勿她。三九已至袄秩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逢并,已是汗流浹背之剧。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留砍聊,地道東北人背稼。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像玻蝌,于是被迫代替她去往敵國(guó)和親蟹肘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子词疼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容