chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

重點(diǎn)介紹幾種工作中常見(jiàn)且重要的數(shù)據(jù)結(jié)構(gòu)和算法

OSC開(kāi)源社區(qū) ? 來(lái)源:京東技術(shù) ? 作者:鄭冰 潘坤 ? 2022-11-07 11:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

導(dǎo)讀

本文介紹了算法和數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)概念和復(fù)雜度函數(shù),并提供了一些評(píng)價(jià)算法和數(shù)據(jù)結(jié)構(gòu)優(yōu)劣的方法論,之后又重點(diǎn)介紹了幾種工作中常見(jiàn)且重要的數(shù)據(jù)結(jié)構(gòu)和算法。作為系列文章的開(kāi)篇,希望讀者能夠在理解復(fù)雜度函數(shù)的基礎(chǔ)上,重點(diǎn)關(guān)注每一種數(shù)據(jù)結(jié)構(gòu)的優(yōu)劣勢(shì)分析。

01 前言

ES現(xiàn)在已經(jīng)被廣泛的使用在日常的搜索中,Lucene作為它的內(nèi)核值得深入研究,比如FST,下面就用兩篇分享來(lái)介紹一些本文的主題:

第一篇主要介紹數(shù)據(jù)結(jié)構(gòu)和算法基礎(chǔ)和分析方法,以及一些常用的典型的數(shù)據(jù)結(jié)構(gòu);

第二篇主要介紹圖論,以及自動(dòng)機(jī),KMP,F(xiàn)ST等算法;

下面開(kāi)始第一篇:

02 提出問(wèn)題

“算法是計(jì)算機(jī)科學(xué)領(lǐng)域最重要的基石之一“

編程語(yǔ)言雖然該學(xué),但是學(xué)習(xí)計(jì)算機(jī)算法和理論更重要,因?yàn)橛?jì)算機(jī)算法和理論更重要,因?yàn)橛?jì)算機(jī)語(yǔ)言和開(kāi)發(fā)平臺(tái)日新月異,但萬(wàn)變不離其宗的是那些算法和理論,例如數(shù)據(jù)結(jié)構(gòu)、算法、編譯原理、計(jì)算機(jī)體系結(jié)構(gòu)、關(guān)系型數(shù)據(jù)庫(kù)原理等等。“

——《算法的力量》

2.1.1 案例一

設(shè)有一組N個(gè)數(shù)而要確定其中第k個(gè)最大者,稱(chēng)之為選擇問(wèn)題。常規(guī)的解法如下:

該問(wèn)題的一種解法就是將這N個(gè)數(shù)讀進(jìn)一個(gè)數(shù)組中,在通過(guò)某種簡(jiǎn)單的算法,比如冒泡排序法,以遞減順序?qū)?shù)組排序,然后返回位置k上的元素。

稍微好一點(diǎn)的算法可以先把前k個(gè)元素讀入數(shù)組并對(duì)其排序。接著,將剩下的元素再逐個(gè)讀入。當(dāng)新元素被讀到時(shí),如果它小于數(shù)組中的第k個(gè)元素則忽略之,否則就將其放到數(shù)組中正確的位置上,同時(shí)將數(shù)組中的一個(gè)元素?cái)D出數(shù)組。當(dāng)算法終止時(shí),位于第k個(gè)位置上的元素作為答案返回。

這兩種算法編碼都很簡(jiǎn)單,但是自然要問(wèn):哪個(gè)算法更好?哪個(gè)算法更重要?還是兩個(gè)算法都足夠好?使用N=30000000和k=15000000進(jìn)行模擬將發(fā)現(xiàn),兩個(gè)算法在合理的時(shí)間量?jī)?nèi)均不能結(jié)束;每一種算法都需要計(jì)算機(jī)處理若干時(shí)間才能完成。

其實(shí)還有很多可以解決這個(gè)問(wèn)題,比如二叉堆,歸并算法等等。

2.2.2案例二

輸入是由一些字母構(gòu)成的一個(gè)二維數(shù)組以及一組單詞組成。目標(biāo)是要找出字謎中的單詞,這些單詞可能是水平、垂直、或沿對(duì)角線(xiàn)上任何方向放置。下圖所示的字謎由單詞this、two、fat和that組成。

907e369c-5c28-11ed-a3b6-dac502259ad0.png

圖1 字謎單詞字符排列示意圖

現(xiàn)在至少也有兩種直觀的算法來(lái)求解這個(gè)問(wèn)題:

對(duì)單詞表中的每個(gè)單詞,檢查每一個(gè)有序三元組(行,列,方向)驗(yàn)證是否有單詞存在。這需要大量嵌套的for循環(huán),但它基本上是直觀的算法。

對(duì)于每一個(gè)尚未越出迷板邊緣的有序四元組(行,列,方向,字符數(shù))可以測(cè)試是否所指的單詞在單詞表中。這也導(dǎo)致使用大量嵌套的for循環(huán)。

上述兩種方法相對(duì)來(lái)說(shuō)都不難編碼,但如果增加行和列的數(shù)量,則上面提出的兩種解法均需要相當(dāng)長(zhǎng)的時(shí)間。

以上兩個(gè)案例中,可以看到要寫(xiě)一個(gè)工作程序并不夠。如果這個(gè)程序在巨大的數(shù)據(jù)集上運(yùn)行,那么運(yùn)行時(shí)間就變成了重要問(wèn)題。

那么,使用自動(dòng)機(jī)理論可以快速的解決這個(gè)問(wèn)題,下一篇中給大家詳細(xì)的分析。

03 數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)

3.1 數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)

3.1.1 什么是數(shù)據(jù)結(jié)構(gòu)

在計(jì)算機(jī)領(lǐng)域中,數(shù)據(jù)是信息的載體,是能夠輸入到計(jì)算機(jī)中并且能被計(jì)算機(jī)識(shí)別、存儲(chǔ)和處理的符號(hào)的總稱(chēng)。數(shù)據(jù)結(jié)構(gòu)是指數(shù)據(jù)元素和數(shù)據(jù)元素之間的相互關(guān)系或數(shù)據(jù)的組織形式。數(shù)據(jù)元素是數(shù)據(jù)的的基本單位,數(shù)據(jù)元素有若干基本項(xiàng)組成。

3.1.2 數(shù)據(jù)之間的關(guān)系

數(shù)據(jù)之間的關(guān)系分為兩類(lèi):

邏輯關(guān)系

表示數(shù)據(jù)之間的抽象關(guān)系,按每個(gè)元素可能具有的前趨數(shù)和直接后繼數(shù)將邏輯結(jié)構(gòu)分為線(xiàn)性結(jié)構(gòu)和非線(xiàn)性結(jié)構(gòu)。

邏輯關(guān)系或邏輯結(jié)構(gòu)有如下特點(diǎn):

只是描述數(shù)據(jù)結(jié)構(gòu)中數(shù)據(jù)元素之間的聯(lián)系規(guī)律;

是從具體問(wèn)題中抽象出來(lái)的數(shù)學(xué)模型,是獨(dú)立于計(jì)算機(jī)存儲(chǔ)器的(與硬件無(wú)關(guān))

邏輯結(jié)構(gòu)的分類(lèi)如下:

線(xiàn)性結(jié)構(gòu)

樹(shù)形結(jié)構(gòu)

圖狀結(jié)構(gòu)

其他結(jié)構(gòu)

·物理關(guān)系

邏輯關(guān)系在計(jì)算中的具體實(shí)現(xiàn)方法,分為順序存儲(chǔ)方法、鏈?zhǔn)酱鎯?chǔ)方法、索引存儲(chǔ)方法、散列存儲(chǔ)方法。

物理關(guān)系或物理結(jié)構(gòu)有如下特點(diǎn):

是數(shù)據(jù)的邏輯結(jié)構(gòu)在計(jì)算機(jī)存儲(chǔ)其中的映像;

存儲(chǔ)結(jié)構(gòu)是通過(guò)計(jì)算機(jī)程序來(lái)實(shí)現(xiàn),因而是依賴(lài)于具體的計(jì)算機(jī)語(yǔ)言的;

物理結(jié)構(gòu)分類(lèi)如下:

順序結(jié)構(gòu)

鏈?zhǔn)浇Y(jié)構(gòu)

索引結(jié)構(gòu)

3.2 算法基礎(chǔ)

3.2.1 基礎(chǔ)概念

算法是為求解一個(gè)問(wèn)題需要遵循的、被清楚指定的簡(jiǎn)單指令的集合。對(duì)于一個(gè)問(wèn)題,一旦某種算法給定并且被確定是正確的,那么重要的一步就是確定該算法將需要多少諸如時(shí)間或空間等資源量的問(wèn)題。如果一個(gè)問(wèn)題的求解算法竟然需要長(zhǎng)達(dá)一年時(shí)間,那么這種算法就很難能有什么用處。同樣,一個(gè)需要若干個(gè)GB的內(nèi)存的算法在當(dāng)前的大多數(shù)機(jī)器上也是無(wú)法使用的。

3.2.2 數(shù)學(xué)基礎(chǔ)

一般來(lái)說(shuō),估算算法資源消耗所需的分析是一個(gè)理論問(wèn)題,因此需要一套數(shù)學(xué)分析法,先從數(shù)學(xué)定義開(kāi)始。

定理1:如果存在正常數(shù)c和n0,使得當(dāng)N>= n0時(shí),T(N) <= cf(N),則記為T(mén)(N) = O(f(N))。

定理2:如果存在正常數(shù)c和n0,使得當(dāng)N>=n0時(shí),T(N) <= cg(N),則記為T(mén)(N) = Ω(g(N))。

定理3:T(N) = θ(h(N))當(dāng)且僅當(dāng)T(N) = O(h(N)) 和 T(N) = Ω(h(N))。

定理4:如果對(duì)每一個(gè)正常數(shù)c都存在常數(shù)n0使得當(dāng)N>n0時(shí),T(N) < cp(N),則T(N) = o(p(N))。

這些定義的目的是要在函數(shù)間建立一種相對(duì)的級(jí)別。給定兩個(gè)函數(shù),通常存在一些點(diǎn),在這些點(diǎn)上一個(gè)函數(shù)的值小于另一個(gè)函數(shù)的值,因此,一般宣稱(chēng)f(N)相對(duì)增長(zhǎng)率。當(dāng)將相對(duì)增長(zhǎng)率應(yīng)用到算法分析時(shí),會(huì)明白它是重要的度量。

如果用傳統(tǒng)的不等式來(lái)計(jì)算增長(zhǎng)率,那么第一個(gè)定義T(N) = O(f(N))是說(shuō)T(N)的增長(zhǎng)率小于或者等于f(N)的增長(zhǎng)率。第二個(gè)定義T(N) = Ω(g(N))是說(shuō)T(N)增長(zhǎng)率大于或者等于g(N)的增長(zhǎng)率。第三個(gè)定義T(N) = θ(h(N))是說(shuō)T(N)的增長(zhǎng)率等于h(N)的增長(zhǎng)率。最后一個(gè)定義T(N) = o(p(N))說(shuō)的則是T(N)的增長(zhǎng)率小于p(N)的增長(zhǎng)率。他不同于大O,因?yàn)榇驩包含增長(zhǎng)率相同的可能性。

要證明某個(gè)函數(shù)T(N) =O(f(N)),通常不是形式的使用這些定義,而是使用一些已知的結(jié)果(比如說(shuō)T(N) = O(log(N)))。一般來(lái)說(shuō),這就意味著證明是非常簡(jiǎn)單的計(jì)算而不應(yīng)涉及微積分,除非遇到特殊情況。如下是常見(jiàn)的已知函數(shù)結(jié)果

c(常數(shù)函數(shù))

logN(對(duì)數(shù)函數(shù))

logN^2(對(duì)數(shù)平方函數(shù))

N(線(xiàn)性函數(shù))

NlogN

N^2(二次函數(shù))

N^3(三次函數(shù))

2^N(指數(shù)函數(shù))

在使用已知函數(shù)結(jié)果時(shí),有幾點(diǎn)需要注意:

首先,將常數(shù)或低階項(xiàng)放進(jìn)大O是非常壞的習(xí)慣。不要寫(xiě)成T(N) = O(2*N^2)或T(N) = O(N^2 + N)。這兩種情形下,正確的形式是T(N) = O(N^2)。也就是說(shuō)低階項(xiàng)一般可以被忽略,而常數(shù)也可以棄掉。

其次,總能夠通過(guò)計(jì)算極限limN→∞f(N)/g(N)(極限公式)來(lái)確定兩個(gè)函數(shù)f(N)和g(N)的相對(duì)增長(zhǎng)率。該極限可以有四種可能的值:

極限是0:這意味著f(N) = o(g(N))。

極限是c != 0:這意味著f(N) = θ(g(N))。

極限是∞:這意味著g(N) = o(f(N))。

極限擺動(dòng):二者無(wú)關(guān)。

3.2.3 復(fù)雜度函數(shù)

正常情況下的復(fù)雜度函數(shù)包含如下兩種:

時(shí)間復(fù)雜度

空間復(fù)雜度

時(shí)間和空間的度量并沒(méi)有一個(gè)固定的標(biāo)準(zhǔn),但是在正常情況下,時(shí)間復(fù)雜度的單位基本上是以一次內(nèi)存訪問(wèn)或者一次IO來(lái)決定??臻g復(fù)雜度是指在算法執(zhí)行過(guò)程中需要占用的存儲(chǔ)空間。對(duì)于一個(gè)算法來(lái)說(shuō),時(shí)間復(fù)雜度和空間復(fù)雜度往往是相互影響,當(dāng)追求一個(gè)好的時(shí)間復(fù)雜度時(shí),可能會(huì)使空間復(fù)雜度變差,即可能占用更多的存儲(chǔ)空間;反之,當(dāng)追求一個(gè)較好的空間復(fù)雜度時(shí),可能會(huì)使時(shí)間復(fù)雜度變差,即可能占用較長(zhǎng)的運(yùn)算時(shí)間。

3.3 知識(shí)儲(chǔ)備

3.3.1 質(zhì)數(shù)分辨定理(HashTree的理論基礎(chǔ))

簡(jiǎn)單的說(shuō)就是,n個(gè)不同的質(zhì)數(shù)可以分辨的連續(xù)數(shù)的個(gè)數(shù)和他們的乘機(jī)相同。分辨是指這些連續(xù)的整數(shù)不可能有相同的余數(shù)序列。

3.3.2Hash算法

1)Hash

Hash一般翻譯成散列,也可以直接音譯成哈希,就是把任意長(zhǎng)度的輸入,通過(guò)散列算法變換成固定長(zhǎng)度的輸出,該輸入就是散列值。不同的輸入可能散列成相同的值,確定的散列值不可能確定一個(gè)輸入。

2)常見(jiàn)的Hash算法

MD4:消息摘要算法;

MD5:消息摘要算法,MD4的升級(jí)版本;

SHA-1:SHA-1的設(shè)計(jì)和MD4相同原理,并模仿該算法;

自定義HASH算法:程序設(shè)計(jì)者可以自定義HASH算法,比如java中重寫(xiě)的hashCode()方法。

3)Hash碰撞

解決Hash碰撞常見(jiàn)的方法有一下幾種:

分離鏈接法(鏈表法):做法是將散列到同一個(gè)值的所有元素保留在一個(gè)表中,例如JDK中的HashMap;

探測(cè)散列表:當(dāng)發(fā)生Hash碰撞時(shí),嘗試尋找另外一個(gè)單元格,直到知道到空的單元為止。包括:線(xiàn)性探測(cè)法,平方探測(cè)法,雙散列。

3.3.2樹(shù)結(jié)構(gòu)的基本概念

樹(shù)的遞歸定義:一棵樹(shù)是一些節(jié)點(diǎn)的集合。這個(gè)集合可以是空集;若不是空集,則樹(shù)由根節(jié)點(diǎn)root以及0個(gè)或多個(gè)非空的子樹(shù)組成,這些子樹(shù)中每一棵的根都被來(lái)自根root的一條有向的邊所連接;

樹(shù)葉節(jié)點(diǎn):沒(méi)有兒子節(jié)點(diǎn)稱(chēng)為樹(shù)葉;

深度:對(duì)于任意節(jié)點(diǎn)ni,ni的深度為從根到ni的唯一路徑的長(zhǎng);

高度:對(duì)于任意節(jié)點(diǎn)ni,ni的高度為從ni到一片樹(shù)葉的最長(zhǎng)路徑的長(zhǎng);

樹(shù)的遍歷:樹(shù)的遍歷分為兩種,先序遍歷和后續(xù)遍歷。

3.3.4二叉搜索樹(shù)

二叉搜索樹(shù)是一棵二叉樹(shù),其中每個(gè)節(jié)點(diǎn)都不能有多于兩個(gè)子節(jié)點(diǎn)。

對(duì)于二叉查找樹(shù)的每一個(gè)節(jié)點(diǎn)X,它的左子樹(shù)中所有項(xiàng)的值都小于X節(jié)點(diǎn)中的項(xiàng),而它的右子樹(shù)中所有項(xiàng)的值大于X中的項(xiàng)。

04 常見(jiàn)數(shù)據(jù)結(jié)構(gòu)與算法分析

4.1 線(xiàn)性數(shù)據(jù)結(jié)構(gòu)

4.1.1 HashMap

·總述

HashMap是開(kāi)發(fā)中最常用的數(shù)據(jù)結(jié)構(gòu)之一,數(shù)據(jù)常駐于內(nèi)存中,對(duì)于小的數(shù)據(jù)量來(lái)說(shuō),HashMap的增刪改查的效率都非常高,復(fù)雜度接近于O(1)。

·數(shù)據(jù)結(jié)構(gòu)和算法

o HashMap由一個(gè)hash函數(shù)和一個(gè)數(shù)組組成;

o 數(shù)據(jù)插入,當(dāng)進(jìn)入到map的時(shí)候,根據(jù)hash(key)找到對(duì)應(yīng)點(diǎn)位置,如果位置為空,直接保存,如果位置不為空,則使用鏈表的方式處理;為了解決遍歷鏈表所增加的時(shí)間,JDK中的鏈表在大小增大到8時(shí),將會(huì)演變成紅黑樹(shù)以降低時(shí)間復(fù)雜度。為什么開(kāi)始使用鏈表,后面使用紅黑樹(shù):

§ 數(shù)據(jù)量較小的時(shí)候,鏈表的查詢(xún)效率相對(duì)來(lái)說(shuō)也比較高,使用紅黑樹(shù)占用空間比鏈表要大;

§ 為什么選擇8,請(qǐng)參考泊松分布;

o 查找和刪除的過(guò)程,同插入的過(guò)程類(lèi)似;

oHashMap可以支持自動(dòng)擴(kuò)容,擴(kuò)容機(jī)制需要看具體的實(shí)現(xiàn);

908fd0d2-5c28-11ed-a3b6-dac502259ad0.png

圖2HashMap的構(gòu)建過(guò)程示意圖

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):動(dòng)態(tài)可變長(zhǎng)存儲(chǔ)數(shù)據(jù),快速的查詢(xún)速度,查詢(xún)復(fù)雜度接近O(1);

缺點(diǎn):只支持小數(shù)據(jù)量的內(nèi)存查詢(xún);

使用場(chǎng)景

在內(nèi)存中小數(shù)據(jù)量的數(shù)據(jù)保存和快速查找。

4.1.2 BloomFilter(布隆過(guò)濾器)

·總述

布隆過(guò)濾器算法為大數(shù)據(jù)量的查找提供了快速的方法,時(shí)間復(fù)雜度為O(k),布隆過(guò)濾器的語(yǔ)義為:

布隆過(guò)濾器的輸出為否定的結(jié)果一定為真;

布隆過(guò)濾器的輸出為肯定的結(jié)果不一定為真;

·數(shù)據(jù)結(jié)構(gòu)和算法

布隆過(guò)濾器的具體結(jié)構(gòu)和算法為:

布隆過(guò)濾器包含k個(gè)hash函數(shù),每個(gè)函數(shù)可以把key散列成一個(gè)整數(shù)(下標(biāo));

布隆過(guò)濾器包含了一個(gè)長(zhǎng)度為n的bit數(shù)組(向量數(shù)組),每個(gè)bit的初始值為0;

當(dāng)某個(gè)key加入的時(shí)候,用k個(gè)hash函數(shù)計(jì)算出k個(gè)散列值,并把數(shù)組中對(duì)應(yīng)的比特置為1;

判斷某個(gè)key是否在集合時(shí),用k個(gè)hash函數(shù)算出k個(gè)值,并查詢(xún)數(shù)組中對(duì)應(yīng)的比特位,如果所有的bit位都為1,認(rèn)為在集合中;

布隆過(guò)濾器的大小需要提前評(píng)估,并且不能擴(kuò)容;

布隆過(guò)濾器的插入過(guò)程如下:

90a933f6-5c28-11ed-a3b6-dac502259ad0.png

圖3布隆過(guò)濾器的構(gòu)建過(guò)程示意圖

判斷某個(gè)key是否在集合時(shí),用k個(gè)hash函數(shù)算出k個(gè)值,并查詢(xún)數(shù)組中對(duì)應(yīng)的比特位,如果所有的bit位都為1,認(rèn)為在集合中

布隆過(guò)濾器無(wú)法刪除數(shù)據(jù);

布隆過(guò)濾器查詢(xún)的時(shí)間復(fù)雜度為O(k);

布隆過(guò)濾器空間的占用在初始化的時(shí)候已經(jīng)固定不能擴(kuò)容。

·優(yōu)缺點(diǎn)

優(yōu)點(diǎn):布隆過(guò)濾器在時(shí)間和空間上都有巨大的優(yōu)勢(shì)。布隆過(guò)濾器存儲(chǔ)空間和插入/查找時(shí)間都是常數(shù)。布隆過(guò)濾器不需要存儲(chǔ)數(shù)據(jù)本身,節(jié)省空間。

缺點(diǎn):布隆過(guò)濾器的缺點(diǎn)是有誤差。元素越多誤差越高。可以通過(guò)提高h(yuǎn)ash函數(shù)的個(gè)數(shù)和擴(kuò)大bit數(shù)組的長(zhǎng)度來(lái)降低誤差率;

·場(chǎng)景

使用場(chǎng)景:緩存擊穿,判斷有無(wú)。

4.1.3 SkipList(跳表)

·總述

跳表是一種特殊的鏈表,相比一般的鏈表有更高的查找效率,可比擬二差查找樹(shù),平均期望的插入,查找,刪除的時(shí)間復(fù)雜度都是O(logN);

·數(shù)據(jù)結(jié)構(gòu)和算法

跳表可視為水平排列(Level)、垂直排列(Row)的位置(Position)的二維集合。每個(gè)Level是一個(gè)列表Si,每個(gè)Row包含存儲(chǔ)連續(xù)列表中相同Entry的位置,跳表的各個(gè)位置可以通過(guò)以下方式進(jìn)行遍歷。

90bb87b8-5c28-11ed-a3b6-dac502259ad0.png

After(P):返回和P在同一Level的后面的一個(gè)位置,若不存在則返回NULL;

Before(P):返回和P在同一Level的前面的一個(gè)位置,若不存在則返回NULL;

Below(P):返回和P在同一Row的下面的一個(gè)位置,若不存在則返回NULL;

Above(P):返回和P在同一Row的上面的一個(gè)位置,若不存在則返回NULL。

圖4跳躍列表結(jié)構(gòu)示意圖

有順序關(guān)系的多個(gè)Entry(K,V)集合M可以由跳表實(shí)現(xiàn),跳表S由一系列列表{S0,S1,S2,......,Sh}組成,其中h代表的跳表的高度。每個(gè)列表Si按照Key順序存儲(chǔ)M項(xiàng)的子集,此外S中的列表滿(mǎn)足如下要求:

列表S0中包含了集合M的每個(gè)一個(gè)Entry;

對(duì)于i = 1 ,...... ,h-1列表Si包含列表Si-1中Entry的隨機(jī)子集;

Si中的Entry是從Si-1中的Entry集合中隨機(jī)選擇的,對(duì)于Si-1中的每一個(gè)Entry,以1/2的概率來(lái)決定是否需要拷貝到Si中,我們期望S1有大約n/2個(gè)Entry,S2中有大約n/4個(gè)Entry,Si中有n/2^i。跳表的高度h大約是logn。從一個(gè)列表到下一個(gè)列表的Entry數(shù)減半并不是跳表的強(qiáng)制要求;

插入的過(guò)程描述,以上圖為例,插入Entry58:

找到底層列表S0中55的位置,在其后插入Entry58;

假設(shè)隨機(jī)函數(shù)取值為1,緊著回到20的位置,在其后插入58,并和底層列表S0的Entry58鏈接起來(lái)形成Entry58的Row;

假設(shè)隨機(jī)函數(shù)取值為0,則插入過(guò)程終止;

下圖為隨機(jī)數(shù)為1的結(jié)果圖:

90cca548-5c28-11ed-a3b6-dac502259ad0.png

圖5插入一個(gè)元素的過(guò)程示意圖

刪除過(guò)程:同查找過(guò)程。

時(shí)間復(fù)雜度

o 查找包括兩個(gè)循環(huán),外層循環(huán)是從上層Level到底層Level,內(nèi)層循環(huán)是在同一個(gè)Level,從左到右;

o 跳表的高度大概率為O(logn),所以外層循環(huán)的次數(shù)大概率為O(logn);

o 在上層查找比對(duì)過(guò)的key,不會(huì)再下層再次查找比對(duì),任意一個(gè)key被查找比對(duì)的概率為1/2,因此內(nèi)存循環(huán)比對(duì)的期望次數(shù)是2也就是O(1);

o 因此最終的時(shí)間復(fù)雜度函數(shù)O(n) = O(1)*O(logn)也就是O(logn);

空間復(fù)雜度

o Level i期望的元素個(gè)數(shù)為 n/2^i;

o 跳表中所有的Entry(包含同一個(gè)Entry的Row中的元素) Σn/2^i = nΣ1/2^i,其中有級(jí)數(shù)公式得到Σ1/2^i < 2;

o 期望的列表空間為O(n);

·優(yōu)缺點(diǎn)

優(yōu)點(diǎn):快速查找,算法實(shí)現(xiàn)簡(jiǎn)單;

缺點(diǎn):跳表在鏈表的基礎(chǔ)上增加了多級(jí)索引以提升查詢(xún)效率,使用空間來(lái)?yè)Q取時(shí)間,必然會(huì)增加存儲(chǔ)的負(fù)擔(dān)。

·使用場(chǎng)景

許多開(kāi)源的軟件都在使用跳表:

Redis中的有序集合zset;

LevelDB Hbase中的memtable;

Lucene中的Posting List。

4.2 簡(jiǎn)單非線(xiàn)性數(shù)據(jù)結(jié)構(gòu)

4.2.1 AVL

·總述

AVL樹(shù)是帶有平衡條件的二叉查找樹(shù),這個(gè)平衡條件必須要容易保持,而且它保證樹(shù)的深度必須是O(logN)。在AVL樹(shù)中任何節(jié)點(diǎn)的兩個(gè)子樹(shù)的高度最大差別為1。

·數(shù)據(jù)結(jié)構(gòu)和算法

AVL樹(shù)本質(zhì)上還是一棵二叉查找樹(shù),有以下特點(diǎn):

AVL首先是一棵二叉搜索樹(shù);

帶有平衡條件:每個(gè)節(jié)點(diǎn)的左右子樹(shù)的高度之差的絕對(duì)值最多為1;

當(dāng)插入節(jié)點(diǎn)或者刪除節(jié)點(diǎn)時(shí),樹(shù)的結(jié)構(gòu)發(fā)生變化導(dǎo)致破壞特點(diǎn)二時(shí),就要進(jìn)行旋轉(zhuǎn)保證樹(shù)的平衡。

針對(duì)旋轉(zhuǎn)做詳細(xì)分析如下:

把必須重新平衡的節(jié)點(diǎn)叫做a,由于任意節(jié)點(diǎn)最多有兩個(gè)兒子,因此出現(xiàn)高度不平衡就需要a點(diǎn)的兩棵子樹(shù)的高度差2。可以看出,這種不平衡可能出現(xiàn)一下四種情況:

對(duì)a的左兒子的左子樹(shù)進(jìn)行一次插入;

對(duì)a的左兒子的右子樹(shù)進(jìn)行一次插入;

對(duì)a的右兒子的左子樹(shù)進(jìn)行一次插入;

對(duì)a的右兒子的柚子樹(shù)進(jìn)行一次插入。

情形1和4是關(guān)于a的對(duì)稱(chēng),而2和3是關(guān)于a點(diǎn)的對(duì)稱(chēng)。因此理論上解決兩種情況。

第一種情況是插入發(fā)生在外側(cè)的情況,該情況通過(guò)對(duì)樹(shù)的一次單旋轉(zhuǎn)而完成調(diào)整。第二種情況是插入發(fā)生在內(nèi)側(cè)的情況,這種情況通過(guò)稍微復(fù)雜些的雙旋轉(zhuǎn)來(lái)處理。

單旋轉(zhuǎn)的簡(jiǎn)單示意圖如下:

90f403a4-5c28-11ed-a3b6-dac502259ad0.png

圖6單旋轉(zhuǎn)示意圖


雙旋轉(zhuǎn)的簡(jiǎn)單示意圖如下:

91116462-5c28-11ed-a3b6-dac502259ad0.png

圖7雙旋轉(zhuǎn)示意圖

·優(yōu)缺點(diǎn)

優(yōu)點(diǎn):使用二叉查找算法時(shí)間復(fù)雜度為O(logN),結(jié)構(gòu)清晰簡(jiǎn)單;

缺點(diǎn):插入和刪除都需要進(jìn)行再平衡,浪費(fèi)CPU資源;

·使用場(chǎng)景

少量數(shù)據(jù)的查找和保存;

4.2.2 Red BlackTree

·總述

紅黑樹(shù)是一種自平衡的二叉查找樹(shù),是2-3-4樹(shù)的一種等同,它可以在O(logN)內(nèi)做查找,插入和刪除。

·數(shù)據(jù)結(jié)構(gòu)和算法

在AVL的基礎(chǔ)之上,紅黑樹(shù)又增加了如下特點(diǎn):

每個(gè)節(jié)點(diǎn)或者是紅色,或者是黑色;

根節(jié)點(diǎn)是黑色;

如果一個(gè)節(jié)點(diǎn)時(shí)紅色的,那么它的子節(jié)點(diǎn)必須是黑色的;

從一個(gè)節(jié)點(diǎn)到一個(gè)null引用的每一條路徑必須包含相同數(shù)目的黑色節(jié)點(diǎn)。

紅黑樹(shù)的示意圖如下(圖片來(lái)源于網(wǎng)絡(luò)):

9127155a-5c28-11ed-a3b6-dac502259ad0.png

圖8 紅黑樹(shù)結(jié)構(gòu)示意圖

那么將一個(gè)節(jié)點(diǎn)插入到紅黑樹(shù)中,需要執(zhí)行哪些步驟呢?

將紅黑樹(shù)當(dāng)做一棵二叉搜索樹(shù),將節(jié)點(diǎn)插入;

將插入的節(jié)點(diǎn)著色為紅色;

通過(guò)一系列的旋轉(zhuǎn)和著色等操作,使之重新成為一棵紅黑樹(shù)。

在第二步中,被插入的節(jié)點(diǎn)被著為紅色之后,他會(huì)違背哪些特性呢

對(duì)于特性1,顯然是不會(huì)違背;

對(duì)于特性2,顯然也是不會(huì)違背;

對(duì)于特性4,顯然也是不會(huì)違背;

對(duì)于特性3,有可能會(huì)違背,我們將情況描述如下:

被插入的節(jié)點(diǎn)是根節(jié)點(diǎn):直接把此節(jié)點(diǎn)涂為黑色;

被插入的節(jié)點(diǎn)的父節(jié)點(diǎn)是黑色:什么也不需要做。節(jié)點(diǎn)被插入后,仍然是紅黑樹(shù);

被插入的節(jié)點(diǎn)的父節(jié)點(diǎn)是紅色:此種情況下與特性3違背,所以將情況分析如下:

當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)是紅色,且當(dāng)前節(jié)點(diǎn)的祖父節(jié)點(diǎn)的另一個(gè)子節(jié)點(diǎn)也是紅色。處理策略為:將父節(jié)點(diǎn)置為黑色、將叔叔節(jié)點(diǎn)置為黑色、將祖父節(jié)點(diǎn)置為紅色;

當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)是紅色,叔叔節(jié)點(diǎn)時(shí)黑色,且當(dāng)前節(jié)點(diǎn)是其父節(jié)點(diǎn)的右子節(jié)點(diǎn)。將父節(jié)點(diǎn)作為新的當(dāng)前節(jié)點(diǎn)、以新的當(dāng)前節(jié)點(diǎn)作為支點(diǎn)進(jìn)行左旋;

當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)是紅色,叔叔節(jié)點(diǎn)時(shí)黑色,且當(dāng)前節(jié)點(diǎn)時(shí)父節(jié)點(diǎn)的左子節(jié)點(diǎn)。將父節(jié)點(diǎn)置為黑色、將祖父節(jié)點(diǎn)置為紅色、以祖父節(jié)點(diǎn)為支點(diǎn)進(jìn)行右旋。

定理:一棵含有n個(gè)節(jié)點(diǎn)的紅黑樹(shù)的高度至多為2log(N+1),證明過(guò)程請(qǐng)查看參考資料。

由此定理可推論紅黑樹(shù)的時(shí)間復(fù)雜度為log(N);

·優(yōu)缺點(diǎn)

優(yōu)點(diǎn):查詢(xún)效率高,插入和刪除的失衡的代銷(xiāo)比AVL要小很多。

缺點(diǎn):紅黑樹(shù)不追求完全平衡。

·使用場(chǎng)景

紅黑樹(shù)的應(yīng)用很廣泛,主要用來(lái)存儲(chǔ)有序的數(shù)據(jù),時(shí)間復(fù)雜度為log(N),效率非常高。例如java中的TreeSet、TreeMap、HashMap等。

4.2.3 B+Tree

·總述

提起B(yǎng)+Tree都會(huì)想到大名鼎鼎的MySql的InnoDB引擎,該引擎使用的數(shù)據(jù)結(jié)構(gòu)就是B+Tree。B+Tree是B-Tree(平衡多路查找樹(shù))的一種改良,使得更適合實(shí)現(xiàn)存儲(chǔ)索引結(jié)構(gòu),也是該篇分享中唯一一個(gè)與磁盤(pán)有關(guān)系的數(shù)據(jù)結(jié)構(gòu)。首先我們先了解一下磁盤(pán)的相關(guān)東西。

系統(tǒng)從磁盤(pán)讀取數(shù)據(jù)到內(nèi)存時(shí)是以磁盤(pán)塊(block)為基本單位,位于同一塊磁盤(pán)塊中的數(shù)據(jù)會(huì)被一次性讀取出來(lái)。InnoDB存儲(chǔ)引擎中有頁(yè)(Page)的概念,頁(yè)是引擎管理磁盤(pán)的基本單位。

·數(shù)據(jù)結(jié)構(gòu)和算法

首先,先了解一下一棵m階B-Tree的特性:

每個(gè)節(jié)點(diǎn)最多有m個(gè)子節(jié)點(diǎn);

除了根節(jié)點(diǎn)和葉子結(jié)點(diǎn)外,其他每個(gè)節(jié)點(diǎn)至少有m/2個(gè)子節(jié)點(diǎn);

若根節(jié)點(diǎn)不是葉子節(jié)點(diǎn),則至少有兩個(gè)子節(jié)點(diǎn);

所有的葉子結(jié)點(diǎn)都是同一深度;

每個(gè)非葉子節(jié)點(diǎn)都包含n個(gè)關(guān)鍵字

關(guān)鍵字的個(gè)數(shù)的關(guān)系為 m/2-1 < n < m-1

B-Tree很適合作為搜索來(lái)使用,但是B-Tree有一個(gè)缺點(diǎn)就是針對(duì)范圍查找支持的不太友好,所以才有了B+Tree;

那么B+Tree的特性在B-Tree的基礎(chǔ)上又增加了如下幾點(diǎn):

非葉子節(jié)點(diǎn)只存儲(chǔ)鍵值信息;

所有的葉子節(jié)點(diǎn)之間都有一個(gè)鏈指針(方便范圍查找);

數(shù)據(jù)記錄都存放在葉子節(jié)點(diǎn)中;

將上述特點(diǎn)描述整理成下圖(假設(shè)一個(gè)頁(yè)(Page)只能寫(xiě)四個(gè)數(shù)據(jù)):

9139e07c-5c28-11ed-a3b6-dac502259ad0.png

圖9B+Tree結(jié)構(gòu)示意圖

這樣的數(shù)據(jù)結(jié)構(gòu)可以進(jìn)行兩種運(yùn)算,一種是針對(duì)主鍵的范圍查找和分頁(yè)查找,另外一種是從根節(jié)點(diǎn)開(kāi)始,進(jìn)行隨機(jī)查找;

·優(yōu)缺點(diǎn)

優(yōu)點(diǎn):利用磁盤(pán)可以存儲(chǔ)大量的數(shù)據(jù),簡(jiǎn)單的表結(jié)構(gòu)在深度為3的B+Tree上可以保存大概上億條數(shù)據(jù);B+Tree的深度大概也就是2~4,深度少就意味這IO會(huì)減少;B+Tree的時(shí)間復(fù)雜度log(m)N

缺點(diǎn):插入或者刪除數(shù)據(jù)有可能會(huì)導(dǎo)致數(shù)據(jù)頁(yè)分裂;即使主鍵是遞增的也無(wú)法避免隨機(jī)寫(xiě),這點(diǎn)LSM-Tree很好的解決了;無(wú)法支持全文索引;

·使用場(chǎng)景

使用場(chǎng)景大多數(shù)數(shù)據(jù)庫(kù)的引擎,例如MySql,MongoDB等。

4.2.4 HashTree

·總述

HashTree是一種特殊的樹(shù)狀結(jié)構(gòu),根據(jù)質(zhì)數(shù)分辨定理,樹(shù)每層的個(gè)數(shù)為1、2、3、5、7、11、13、17、19、23、29.....

·數(shù)據(jù)結(jié)構(gòu)和算法

從2起的連續(xù)質(zhì)數(shù),連續(xù)10個(gè)質(zhì)數(shù)接可以分辨大約6464693230個(gè)數(shù),而按照目前CPU的計(jì)算水平,100次取余的整數(shù)除法操作幾乎不算什么難事。

我們選擇質(zhì)數(shù)分辨算法來(lái)構(gòu)建一顆哈希樹(shù)。選擇從2開(kāi)始的連續(xù)質(zhì)數(shù)來(lái)構(gòu)建一個(gè)10層的哈希樹(shù)。第一層節(jié)點(diǎn)為根節(jié)點(diǎn),根節(jié)點(diǎn)先有2個(gè)節(jié)點(diǎn),第二層的每個(gè)節(jié)點(diǎn)包含3個(gè)子節(jié)點(diǎn);以此類(lèi)推,即每層節(jié)點(diǎn)的數(shù)據(jù)都是連續(xù)的質(zhì)數(shù)。對(duì)質(zhì)數(shù)進(jìn)行取余操作得到的數(shù)據(jù)決定了處理的路徑。下面我們以隨機(jī)插入10個(gè)數(shù)(442 9041 3460 3164 2997 3663 8250 9088906 4005)為例,來(lái)圖解HashTree的插入過(guò)程,如下:

9149e260-5c28-11ed-a3b6-dac502259ad0.png

圖10HashTree構(gòu)建過(guò)程示意圖

HashTree的節(jié)點(diǎn)查找過(guò)程和節(jié)點(diǎn)插入過(guò)程類(lèi)似,就是對(duì)關(guān)鍵字用質(zhì)數(shù)取余,根據(jù)余數(shù)確定下一節(jié)點(diǎn)的分叉路徑,知道找到目標(biāo)節(jié)點(diǎn)。如上圖,在從對(duì)象中查找所匹配的對(duì)象,比較次數(shù)不超過(guò)10次,也就是說(shuō)時(shí)間復(fù)雜度最多是o(1).

刪除的過(guò)程和查找類(lèi)似。

·優(yōu)缺點(diǎn):

優(yōu)點(diǎn):結(jié)構(gòu)簡(jiǎn)單,查找迅速,結(jié)構(gòu)不變。

缺點(diǎn):非有序性。

4.2.5 其他數(shù)據(jù)結(jié)構(gòu)

鑒于篇幅有限,余下重要數(shù)據(jù)結(jié)構(gòu)將在下一篇文章中再來(lái)一起討論,敬請(qǐng)期待!






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:搜索中常見(jiàn)數(shù)據(jù)結(jié)構(gòu)與算法探究(一)

文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    盤(pán)點(diǎn)幾種常見(jiàn)數(shù)據(jù)結(jié)構(gòu)

    這里主要總結(jié)下在工作中常碰到的幾種數(shù)據(jù)結(jié)構(gòu):Array,ArrayList,List,LinkedList,Queue,Stack,Dictionary。
    的頭像 發(fā)表于 05-13 15:58 ?6690次閱讀
    盤(pán)點(diǎn)<b class='flag-5'>幾種</b><b class='flag-5'>常見(jiàn)</b>的<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>

    數(shù)據(jù)結(jié)構(gòu)算法分析(Java版)(pdf)

    數(shù)據(jù)結(jié)構(gòu)算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java數(shù)據(jù)結(jié)構(gòu)算法中文第
    發(fā)表于 12-20 21:22

    數(shù)據(jù)結(jié)構(gòu)算法分析

    數(shù)據(jù)結(jié)構(gòu)算法分析
    發(fā)表于 06-05 10:46

    數(shù)據(jù)結(jié)構(gòu)的幾個(gè)重要知識(shí)點(diǎn)

    等肯定是輕車(chē)熟路,可見(jiàn)它雖然難,但重要新不言而喻。下面我們就來(lái)說(shuō)說(shuō)數(shù)據(jù)結(jié)構(gòu)的幾個(gè)重要知識(shí)點(diǎn)兒。樹(shù)的結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)是否
    發(fā)表于 02-27 15:01

    常見(jiàn)數(shù)據(jù)結(jié)構(gòu)

    `數(shù)據(jù)結(jié)構(gòu)在實(shí)際應(yīng)用中非常常見(jiàn),現(xiàn)在各種算法基本都牽涉到數(shù)據(jù)結(jié)構(gòu),因此,掌握數(shù)據(jù)結(jié)構(gòu)算是軟件工程師的必備技能。一、什么是
    發(fā)表于 05-10 07:58

    C#數(shù)據(jù)結(jié)構(gòu)算法分析_ 魏寶剛

    數(shù)據(jù)結(jié)構(gòu)算法分析》描述了各種類(lèi)型的數(shù)據(jù)結(jié)構(gòu),包括線(xiàn)性表、樹(shù)、堆、圖,以及查找、排序等算法。自始至終將數(shù)據(jù)結(jié)構(gòu)的基本原理與
    發(fā)表于 12-15 16:46 ?0次下載
    C#<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>和<b class='flag-5'>算法</b>分析_ 魏寶剛

    數(shù)據(jù)結(jié)構(gòu)算法

    全國(guó)C語(yǔ)言考試公共基礎(chǔ)知識(shí)點(diǎn)——數(shù)據(jù)結(jié)構(gòu)算法,該資料包含了有關(guān)數(shù)據(jù)結(jié)構(gòu)算法的全部知識(shí)點(diǎn)。
    發(fā)表于 03-30 14:27 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)算法分析

    一部淺顯易懂的介紹數(shù)據(jù)結(jié)構(gòu)算法的書(shū)籍。
    發(fā)表于 07-14 17:12 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)常見(jiàn)的八大排序算法

    本文總結(jié)了數(shù)據(jù)結(jié)構(gòu)常見(jiàn)的八大排序算法。詳細(xì)分析請(qǐng)看下文
    發(fā)表于 02-05 15:26 ?1938次閱讀
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b><b class='flag-5'>常見(jiàn)</b>的八大排序<b class='flag-5'>算法</b>

    什么是數(shù)據(jù)結(jié)構(gòu)算法?抽象數(shù)據(jù)類(lèi)型的表示和實(shí)現(xiàn)和算法分析概述

    1.數(shù)據(jù)結(jié)構(gòu)是研究什么的? 2.根據(jù)數(shù)據(jù)元素間關(guān)系的不同特性,分哪幾種不同的結(jié)構(gòu)?本教材重點(diǎn)研究的是哪
    發(fā)表于 10-11 08:00 ?6次下載
    什么是<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>與<b class='flag-5'>算法</b>?抽象<b class='flag-5'>數(shù)據(jù)</b>類(lèi)型的表示和實(shí)現(xiàn)和<b class='flag-5'>算法</b>分析概述

    大牛分享平時(shí)如何學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法

    數(shù)據(jù)結(jié)構(gòu)算法的地位對(duì)于一個(gè)程序員來(lái)說(shuō)不言而喻。今天這篇文章不是來(lái)勸你們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)算法的,也不是來(lái)和你們說(shuō)數(shù)據(jù)結(jié)構(gòu)
    的頭像 發(fā)表于 11-02 11:25 ?3404次閱讀

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(上)

    有哪些常見(jiàn)數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見(jiàn)的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、
    的頭像 發(fā)表于 04-06 16:48 ?1199次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(上)

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(中)

    有哪些常見(jiàn)數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見(jiàn)的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、
    的頭像 發(fā)表于 04-06 16:48 ?959次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(中)

    算法數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)知識(shí)分享(下)

    有哪些常見(jiàn)數(shù)據(jù)結(jié)構(gòu)?基本操作是什么?常見(jiàn)的排序算法是如何實(shí)現(xiàn)的?各有什么優(yōu)缺點(diǎn)?本文簡(jiǎn)要分享算法基礎(chǔ)、
    的頭像 發(fā)表于 04-06 16:48 ?1119次閱讀
    <b class='flag-5'>算法</b>和<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>基礎(chǔ)知識(shí)分享(下)

    嵌入式技術(shù)數(shù)據(jù)結(jié)構(gòu)中常見(jiàn)的樹(shù)有哪些?

    數(shù)據(jù)庫(kù)中非常核心的一個(gè)部分,就是索引結(jié)構(gòu)的設(shè)計(jì)——這幾乎決定了數(shù)據(jù)庫(kù)的應(yīng)用領(lǐng)域。而索引結(jié)構(gòu)的設(shè)計(jì),又是數(shù)據(jù)結(jié)構(gòu)
    發(fā)表于 05-29 10:30 ?818次閱讀
    嵌入式技術(shù)<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b><b class='flag-5'>中常見(jiàn)</b>的樹(shù)有哪些?