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

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

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

詳細(xì)介紹ADAS算法

tUM2_ADA ? 來(lái)源:djl ? 作者:ADAS ? 2019-08-08 17:34 ? 次閱讀

閱讀目錄

1. 順序查找

2. 二分查找

3. 插值查找

4. 斐波那契查找

5. 樹(shù)表查找

6. 分塊查找

7. 哈希查找

查找是在大量的信息中尋找一個(gè)特定的信息元素,在計(jì)算機(jī)應(yīng)用中,查找是常用的基本運(yùn)算,例如編譯程序中符號(hào)表的查找。本文簡(jiǎn)單概括性的介紹了常見(jiàn)的七種查找算法,說(shuō)是七種,其實(shí)二分查找、插值查找以及斐波那契查找都可以歸為一類(lèi)——插值查找。插值查找和斐波那契查找是在二分查找的基礎(chǔ)上的優(yōu)化查找算法。樹(shù)表查找和哈希查找會(huì)在后續(xù)的博文中進(jìn)行詳細(xì)介紹。

查找定義:根據(jù)給定的某個(gè)值,在查找表中確定一個(gè)其關(guān)鍵字等于給定值的數(shù)據(jù)元素(或記錄)。

查找算法分類(lèi):

1)靜態(tài)查找和動(dòng)態(tài)查找;

注:靜態(tài)或者動(dòng)態(tài)都是針對(duì)查找表而言的。動(dòng)態(tài)表指查找表中有刪除和插入操作的表。

2)無(wú)序查找和有序查找。

無(wú)序查找:被查找數(shù)列有序無(wú)序均可;

有序查找:被查找數(shù)列必須為有序數(shù)列。

平均查找長(zhǎng)度(Average Search Length,ASL):需和指定key進(jìn)行比較的關(guān)鍵字的個(gè)數(shù)的期望值,稱為查找算法在查找成功時(shí)的平均查找長(zhǎng)度。

對(duì)于含有n個(gè)數(shù)據(jù)元素的查找表,查找成功的平均查找長(zhǎng)度為:ASL = Pi*Ci的和。
Pi:查找表中第i個(gè)數(shù)據(jù)元素的概率。
Ci:找到第i個(gè)數(shù)據(jù)元素時(shí)已經(jīng)比較過(guò)的次數(shù)。

1. 順序查找

說(shuō)明:順序查找適合于存儲(chǔ)結(jié)構(gòu)為順序存儲(chǔ)或鏈接存儲(chǔ)的線性表。

基本思想:順序查找也稱為線形查找,屬于無(wú)序查找算法。從數(shù)據(jù)結(jié)構(gòu)線形表的一端開(kāi)始,順序掃描,依次將掃描到的結(jié)點(diǎn)關(guān)鍵字與給定值k相比較,若相等則表示查找成功;若掃描結(jié)束仍沒(méi)有找到關(guān)鍵字等于k的結(jié)點(diǎn),表示查找失敗。

復(fù)雜度分析:

查找成功時(shí)的平均查找長(zhǎng)度為:(假設(shè)每個(gè)數(shù)據(jù)元素的概率相等) ASL = 1/n(1+2+3+…+n) = (n+1)/2 ;
當(dāng)查找不成功時(shí),需要n+1次比較,時(shí)間復(fù)雜度為O(n);

所以,順序查找的時(shí)間復(fù)雜度為O(n)。

C++實(shí)現(xiàn)源碼:

//順序查找intSequenceSearch(inta[],intvalue,intn) {inti;for(i=0;i}

2. 二分查找

說(shuō)明:元素必須是有序的,如果是無(wú)序的則要先進(jìn)行排序操作。

基本思想:也稱為是折半查找,屬于有序查找算法。用給定值k先與中間結(jié)點(diǎn)的關(guān)鍵字比較,中間結(jié)點(diǎn)把線形表分成兩個(gè)子表,若相等則查找成功;若不相等,再根據(jù)k與該中間結(jié)點(diǎn)關(guān)鍵字的比較結(jié)果確定下一步查找哪個(gè)子表,這樣遞歸進(jìn)行,直到查找到或查找結(jié)束發(fā)現(xiàn)表中沒(méi)有這樣的結(jié)點(diǎn)。

復(fù)雜度分析:最壞情況下,關(guān)鍵詞比較次數(shù)為log2(n+1),且期望時(shí)間復(fù)雜度為O(log2n);

注:折半查找的前提條件是需要有序表順序存儲(chǔ),對(duì)于靜態(tài)查找表,一次排序后不再變化,折半查找能得到不錯(cuò)的效率。但對(duì)于需要頻繁執(zhí)行插入或刪除操作的數(shù)據(jù)集來(lái)說(shuō),維護(hù)有序的排序會(huì)帶來(lái)不小的工作量,那就不建議使用?!洞笤挃?shù)據(jù)結(jié)構(gòu)》

C++實(shí)現(xiàn)源碼://二分查找(折半查找),版本1intBinarySearch1(inta[],intvalue,intn)

{intlow,high,mid; low=0; high=n-1;while(lowvalue) high=mid-1;if(a[mid]value)returnBinarySearch2(a,value,low,mid-1);if(a[mid]}

3. 插值查找

在介紹插值查找之前,首先考慮一個(gè)新問(wèn)題,為什么上述算法一定要是折半,而不是折四分之一或者折更多呢?

打個(gè)比方,在英文字典里面查“apple”,你下意識(shí)翻開(kāi)字典是翻前面的書(shū)頁(yè)還是后面的書(shū)頁(yè)呢?如果再讓你查“zoo”,你又怎么查?很顯然,這里你絕對(duì)不會(huì)是從中間開(kāi)始查起,而是有一定目的的往前或往后翻。

同樣的,比如要在取值范圍1 ~ 10000 之間 100 個(gè)元素從小到大均勻分布的數(shù)組中查找5, 我們自然會(huì)考慮從數(shù)組下標(biāo)較小的開(kāi)始查找。

經(jīng)過(guò)以上分析,折半查找這種查找方式,不是自適應(yīng)的(也就是說(shuō)是傻瓜式的)。二分查找中查找點(diǎn)計(jì)算如下:

mid=(low+high)/2, 即mid=low+1/2*(high-low);

通過(guò)類(lèi)比,我們可以將查找的點(diǎn)改進(jìn)為如下:

mid=low+(key-a[low])/(a[high]-a[low])*(high-low),

也就是將上述的比例參數(shù)1/2改進(jìn)為自適應(yīng)的,根據(jù)關(guān)鍵字在整個(gè)有序表中所處的位置,讓mid值的變化更靠近關(guān)鍵字key,這樣也就間接地減少了比較次數(shù)。

基本思想:基于二分查找算法,將查找點(diǎn)的選擇改進(jìn)為自適應(yīng)選擇,可以提高查找效率。當(dāng)然,差值查找也屬于有序查找。

注:對(duì)于表長(zhǎng)較大,而關(guān)鍵字分布又比較均勻的查找表來(lái)說(shuō),插值查找算法的平均性能比折半查找要好的多。反之,數(shù)組中如果分布非常不均勻,那么插值查找未必是很合適的選擇。

復(fù)雜度分析:查找成功或者失敗的時(shí)間復(fù)雜度均為O(log2(log2n))。

C++實(shí)現(xiàn)源碼:

//插值查找intInsertionSearch(inta[],intvalue,intlow,inthigh) {intmid=low+(value-a[low])/(a[high]-a[low])*(high-low);if(a[mid]==value)returnmid;if(a[mid]>value)returnInsertionSearch(a,value,low,mid-1);if(a[mid]}

4. 斐波那契查找

在介紹斐波那契查找算法之前,我們先介紹一下很它緊密相連并且大家都熟知的一個(gè)概念——黃金分割。

黃金比例又稱黃金分割,是指事物各部分間一定的數(shù)學(xué)比例關(guān)系,即將整體一分為二,較大部分與較小部分之比等于整體與較大部分之比,其比值約為1:0.618或1.618:1。

0.618被公認(rèn)為最具有審美意義的比例數(shù)字,這個(gè)數(shù)值的作用不僅僅體現(xiàn)在諸如繪畫(huà)、雕塑、音樂(lè)、建筑等藝術(shù)領(lǐng)域,而且在管理、工程設(shè)計(jì)等方面也有著不可忽視的作用。因此被稱為黃金分割。

大家記不記得斐波那契數(shù)列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89…….(從第三個(gè)數(shù)開(kāi)始,后邊每一個(gè)數(shù)都是前兩個(gè)數(shù)的和)。然后我們會(huì)發(fā)現(xiàn),隨著斐波那契數(shù)列的遞增,前后兩個(gè)數(shù)的比值會(huì)越來(lái)越接近0.618,利用這個(gè)特性,我們就可以將黃金比例運(yùn)用到查找技術(shù)中。

詳細(xì)介紹ADAS算法

基本思想:也是二分查找的一種提升算法,通過(guò)運(yùn)用黃金比例的概念在數(shù)列中選擇查找點(diǎn)進(jìn)行查找,提高查找效率。同樣地,斐波那契查找也屬于一種有序查找算法。

相對(duì)于折半查找,一般將待比較的key值與第mid=(low+high)/2位置的元素比較,比較結(jié)果分三種情況:

1)相等,mid位置的元素即為所求

2)>,low=mid+1;

3)<,high=mid-1。

斐波那契查找與折半查找很相似,他是根據(jù)斐波那契序列的特點(diǎn)對(duì)有序表進(jìn)行分割的。他要求開(kāi)始表中記錄的個(gè)數(shù)為某個(gè)斐波那契數(shù)小1,及n=F(k)-1;

開(kāi)始將k值與第F(k-1)位置的記錄進(jìn)行比較(及mid=low+F(k-1)-1),比較結(jié)果也分為三種

1)相等,mid位置的元素即為所求

2)>,low=mid+1,k-=2;

說(shuō)明:low=mid+1說(shuō)明待查找的元素在[mid+1,high]范圍內(nèi),k-=2 說(shuō)明范圍[mid+1,high]內(nèi)的元素個(gè)數(shù)為n-(F(k-1))=Fk-1-F(k-1)=Fk-F(k-1)-1=F(k-2)-1個(gè),所以可以遞歸的應(yīng)用斐波那契查找。

3)<,high=mid-1,k-=1。

說(shuō)明:low=mid+1說(shuō)明待查找的元素在[low,mid-1]范圍內(nèi),k-=1 說(shuō)明范圍[low,mid-1]內(nèi)的元素個(gè)數(shù)為F(k-1)-1個(gè),所以可以遞歸 的應(yīng)用斐波那契查找。

復(fù)雜度分析:最壞情況下,時(shí)間復(fù)雜度為O(log2n),且其期望復(fù)雜度也為O(log2n)。

C++實(shí)現(xiàn)源碼:

//斐波那契查找.cpp#include"stdafx.h"#include#includeusingnamespacestd;constintmax_size=20;//斐波那契數(shù)組的長(zhǎng)度/*構(gòu)造一個(gè)斐波那契數(shù)組*/voidFibonacci(int*F) { F[0]=0; F[1]=1;for(inti=2;iF[k]-1)//計(jì)算n位于斐波那契數(shù)列的位置 ++k;int*temp;//將數(shù)組a擴(kuò)展到F[k]-1的長(zhǎng)度 temp=newint[F[k]-1]; memcpy(temp,a,n*sizeof(int));for(inti=n;itemp[i]=a[n-1]; while(low<=high) {int?mid=low+F[k-1]-1;if(keytemp[mid]) { ?low=mid+1; ?k-=2; }else {?if(mid=n則說(shuō)明是擴(kuò)展的數(shù)值,返回n-1} } delete?[]?temp;return?-1; }int?main() {int?a[]?=?{0,16,24,35,47,59,62,73,88,99};int?key=100;int?index=FibonacciSearch(a,sizeof(a)/sizeof(int),key); cout<} 5. 樹(shù)表查找

5.1 最簡(jiǎn)單的樹(shù)表查找算法——二叉樹(shù)查找算法。

基本思想:二叉查找樹(shù)是先對(duì)待查找的數(shù)據(jù)進(jìn)行生成樹(shù),確保樹(shù)的左分支的值小于右分支的值,然后在就行和每個(gè)節(jié)點(diǎn)的父節(jié)點(diǎn)比較大小,查找最適合的范圍。這個(gè)算法的查找效率很高,但是如果使用這種查找方法要首先創(chuàng)建樹(shù)。

二叉查找樹(shù)(BinarySearch Tree,也叫二叉搜索樹(shù),或稱二叉排序樹(shù)Binary Sort Tree)或者是一棵空樹(shù),或者是具有下列性質(zhì)的二叉樹(shù):

1)若任意節(jié)點(diǎn)的左子樹(shù)不空,則左子樹(shù)上所有結(jié)點(diǎn)的值均小于它的根結(jié)點(diǎn)的值;

2)若任意節(jié)點(diǎn)的右子樹(shù)不空,則右子樹(shù)上所有結(jié)點(diǎn)的值均大于它的根結(jié)點(diǎn)的值;

3)任意節(jié)點(diǎn)的左、右子樹(shù)也分別為二叉查找樹(shù)。

二叉查找樹(shù)性質(zhì):對(duì)二叉查找樹(shù)進(jìn)行中序遍歷,即可得到有序的數(shù)列。

不同形態(tài)的二叉查找樹(shù)如下圖所示:

詳細(xì)介紹ADAS算法

有關(guān)二叉查找樹(shù)的查找、插入、刪除等操作的詳細(xì)講解,請(qǐng)移步淺談算法和數(shù)據(jù)結(jié)構(gòu): 七 二叉查找樹(shù)。

復(fù)雜度分析:它和二分查找一樣,插入和查找的時(shí)間復(fù)雜度均為O(logn),但是在最壞的情況下仍然會(huì)有O(n)的時(shí)間復(fù)雜度。原因在于插入和刪除元素的時(shí)候,樹(shù)沒(méi)有保持平衡(比如,我們查找上圖(b)中的“93”,我們需要進(jìn)行n次查找操作)。我們追求的是在最壞的情況下仍然有較好的時(shí)間復(fù)雜度,這就是平衡查找樹(shù)設(shè)計(jì)的初衷。

下圖為二叉樹(shù)查找和順序查找以及二分查找性能的對(duì)比圖:

詳細(xì)介紹ADAS算法

基于二叉查找樹(shù)進(jìn)行優(yōu)化,進(jìn)而可以得到其他的樹(shù)表查找算法,如平衡樹(shù)、紅黑樹(shù)等高效算法。

5.2 平衡查找樹(shù)之2-3查找樹(shù)(2-3 Tree)

2-3查找樹(shù)定義:和二叉樹(shù)不一樣,2-3樹(shù)運(yùn)行每個(gè)節(jié)點(diǎn)保存1個(gè)或者兩個(gè)的值。對(duì)于普通的2節(jié)點(diǎn)(2-node),他保存1個(gè)key和左右兩個(gè)自己點(diǎn)。對(duì)應(yīng)3節(jié)點(diǎn)(3-node),保存兩個(gè)Key,2-3查找樹(shù)的定義如下:

1)要么為空,要么:

2)對(duì)于2節(jié)點(diǎn),該節(jié)點(diǎn)保存一個(gè)key及對(duì)應(yīng)value,以及兩個(gè)指向左右節(jié)點(diǎn)的節(jié)點(diǎn),左節(jié)點(diǎn)也是一個(gè)2-3節(jié)點(diǎn),所有的值都比key要小,右節(jié)點(diǎn)也是一個(gè)2-3節(jié)點(diǎn),所有的值比key要大。

3)對(duì)于3節(jié)點(diǎn),該節(jié)點(diǎn)保存兩個(gè)key及對(duì)應(yīng)value,以及三個(gè)指向左中右的節(jié)點(diǎn)。左節(jié)點(diǎn)也是一個(gè)2-3節(jié)點(diǎn),所有的值均比兩個(gè)key中的最小的key還要??;中間節(jié)點(diǎn)也是一個(gè)2-3節(jié)點(diǎn),中間節(jié)點(diǎn)的key值在兩個(gè)跟節(jié)點(diǎn)key值之間;右節(jié)點(diǎn)也是一個(gè)2-3節(jié)點(diǎn),節(jié)點(diǎn)的所有key值比兩個(gè)key中的最大的key還要大。

詳細(xì)介紹ADAS算法

2-3查找樹(shù)的性質(zhì):

1)如果中序遍歷2-3查找樹(shù),就可以得到排好序的序列;

2)在一個(gè)完全平衡的2-3查找樹(shù)中,根節(jié)點(diǎn)到每一個(gè)為空節(jié)點(diǎn)的距離都相同。(這也是平衡樹(shù)中“平衡”一詞的概念,根節(jié)點(diǎn)到葉節(jié)點(diǎn)的最長(zhǎng)距離對(duì)應(yīng)于查找算法的最壞情況,而平衡樹(shù)中根節(jié)點(diǎn)到葉節(jié)點(diǎn)的距離都一樣,最壞情況也具有對(duì)數(shù)復(fù)雜度。)

性質(zhì)2)如下圖所示:

詳細(xì)介紹ADAS算法

復(fù)雜度分析:

2-3樹(shù)的查找效率與樹(shù)的高度是息息相關(guān)的。

在最壞的情況下,也就是所有的節(jié)點(diǎn)都是2-node節(jié)點(diǎn),查找效率為lgN

在最好的情況下,所有的節(jié)點(diǎn)都是3-node節(jié)點(diǎn),查找效率為log3N約等于0.631lgN

距離來(lái)說(shuō),對(duì)于1百萬(wàn)個(gè)節(jié)點(diǎn)的2-3樹(shù),樹(shù)的高度為12-20之間,對(duì)于10億個(gè)節(jié)點(diǎn)的2-3樹(shù),樹(shù)的高度為18-30之間。

對(duì)于插入來(lái)說(shuō),只需要常數(shù)次操作即可完成,因?yàn)樗恍枰薷呐c該節(jié)點(diǎn)關(guān)聯(lián)的節(jié)點(diǎn)即可,不需要檢查其他節(jié)點(diǎn),所以效率和查找類(lèi)似。下面是2-3查找樹(shù)的效率:

詳細(xì)介紹ADAS算法

5.3 平衡查找樹(shù)之紅黑樹(shù)(Red-Black Tree)

2-3查找樹(shù)能保證在插入元素之后能保持樹(shù)的平衡狀態(tài),最壞情況下即所有的子節(jié)點(diǎn)都是2-node,樹(shù)的高度為lgn,從而保證了最壞情況下的時(shí)間復(fù)雜度。但是2-3樹(shù)實(shí)現(xiàn)起來(lái)比較復(fù)雜,于是就有了一種簡(jiǎn)單實(shí)現(xiàn)2-3樹(shù)的數(shù)據(jù)結(jié)構(gòu),即紅黑樹(shù)(Red-Black Tree)。

基本思想:紅黑樹(shù)的思想就是對(duì)2-3查找樹(shù)進(jìn)行編碼,尤其是對(duì)2-3查找樹(shù)中的3-nodes節(jié)點(diǎn)添加額外的信息。紅黑樹(shù)中將節(jié)點(diǎn)之間的鏈接分為兩種不同類(lèi)型,紅色鏈接,他用來(lái)鏈接兩個(gè)2-nodes節(jié)點(diǎn)來(lái)表示一個(gè)3-nodes節(jié)點(diǎn)。黑色鏈接用來(lái)鏈接普通的2-3節(jié)點(diǎn)。特別的,使用紅色鏈接的兩個(gè)2-nodes來(lái)表示一個(gè)3-nodes節(jié)點(diǎn),并且向左傾斜,即一個(gè)2-node是另一個(gè)2-node的左子節(jié)點(diǎn)。這種做法的好處是查找的時(shí)候不用做任何修改,和普通的二叉查找樹(shù)相同。

詳細(xì)介紹ADAS算法

紅黑樹(shù)的定義:

紅黑樹(shù)是一種具有紅色和黑色鏈接的平衡查找樹(shù),同時(shí)滿足:

紅色節(jié)點(diǎn)向左傾斜

一個(gè)節(jié)點(diǎn)不可能有兩個(gè)紅色鏈接

整個(gè)樹(shù)完全黑色平衡,即從根節(jié)點(diǎn)到所以葉子結(jié)點(diǎn)的路徑上,黑色鏈接的個(gè)數(shù)都相同。

下圖可以看到紅黑樹(shù)其實(shí)是2-3樹(shù)的另外一種表現(xiàn)形式:如果我們將紅色的連線水平繪制,那么他鏈接的兩個(gè)2-node節(jié)點(diǎn)就是2-3樹(shù)中的一個(gè)3-node節(jié)點(diǎn)了。

詳細(xì)介紹ADAS算法

紅黑樹(shù)的性質(zhì):整個(gè)樹(shù)完全黑色平衡,即從根節(jié)點(diǎn)到所以葉子結(jié)點(diǎn)的路徑上,黑色鏈接的個(gè)數(shù)都相同(2-3樹(shù)的第2)性質(zhì),從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)的距離都相等)。

復(fù)雜度分析:最壞的情況就是,紅黑樹(shù)中除了最左側(cè)路徑全部是由3-node節(jié)點(diǎn)組成,即紅黑相間的路徑長(zhǎng)度是全黑路徑長(zhǎng)度的2倍。

下圖是一個(gè)典型的紅黑樹(shù),從中可以看到最長(zhǎng)的路徑(紅黑相間的路徑)是最短路徑的2倍:

詳細(xì)介紹ADAS算法

紅黑樹(shù)的平均高度大約為logn。

下圖是紅黑樹(shù)在各種情況下的時(shí)間復(fù)雜度,可以看出紅黑樹(shù)是2-3查找樹(shù)的一種實(shí)現(xiàn),它能保證最壞情況下仍然具有對(duì)數(shù)的時(shí)間復(fù)雜度。

詳細(xì)介紹ADAS算法

紅黑樹(shù)這種數(shù)據(jù)結(jié)構(gòu)應(yīng)用十分廣泛,在多種編程語(yǔ)言中被用作符號(hào)表的實(shí)現(xiàn),如:

Java中的java.util.TreeMap,java.util.TreeSet;

C++ STL中的:map,multimap,multiset;

.NET中的:SortedDictionary,SortedSet等。

5.4 B樹(shù)和B+樹(shù)(B Tree/B+ Tree)

平衡查找樹(shù)中的2-3樹(shù)以及其實(shí)現(xiàn)紅黑樹(shù)。2-3樹(shù)種,一個(gè)節(jié)點(diǎn)最多有2個(gè)key,而紅黑樹(shù)則使用染色的方式來(lái)標(biāo)識(shí)這兩個(gè)key。

維基百科對(duì)B樹(shù)的定義為“在計(jì)算機(jī)科學(xué)中,B樹(shù)(B-tree)是一種樹(shù)狀數(shù)據(jù)結(jié)構(gòu),它能夠存儲(chǔ)數(shù)據(jù)、對(duì)其進(jìn)行排序并允許以O(shè)(log n)的時(shí)間復(fù)雜度運(yùn)行進(jìn)行查找、順序讀取、插入和刪除的數(shù)據(jù)結(jié)構(gòu)。B樹(shù),概括來(lái)說(shuō)是一個(gè)節(jié)點(diǎn)可以擁有多于2個(gè)子節(jié)點(diǎn)的二叉查找樹(shù)。與自平衡二叉查找樹(shù)不同,B樹(shù)為系統(tǒng)最優(yōu)化大塊數(shù)據(jù)的讀和寫(xiě)操作。B-tree算法減少定位記錄時(shí)所經(jīng)歷的中間過(guò)程,從而加快存取速度。普遍運(yùn)用在數(shù)據(jù)庫(kù)和文件系統(tǒng)。

B樹(shù)定義:

B樹(shù)可以看作是對(duì)2-3查找樹(shù)的一種擴(kuò)展,即他允許每個(gè)節(jié)點(diǎn)有M-1個(gè)子節(jié)點(diǎn)。

根節(jié)點(diǎn)至少有兩個(gè)子節(jié)點(diǎn)

每個(gè)節(jié)點(diǎn)有M-1個(gè)key,并且以升序排列

位于M-1和M key的子節(jié)點(diǎn)的值位于M-1 和M key對(duì)應(yīng)的Value之間

其它節(jié)點(diǎn)至少有M/2個(gè)子節(jié)點(diǎn)

下圖是一個(gè)M=4 階的B樹(shù):

詳細(xì)介紹ADAS算法

可以看到B樹(shù)是2-3樹(shù)的一種擴(kuò)展,他允許一個(gè)節(jié)點(diǎn)有多于2個(gè)的元素。B樹(shù)的插入及平衡化操作和2-3樹(shù)很相似,這里就不介紹了。下面是往B樹(shù)中依次插入

6 10 4 14 5 11 15 3 2 12 1 7 8 8 6 3 6 21 5 15 15 6 32 23 45 65 7 8 6 5 4

B+樹(shù)定義:

B+樹(shù)是對(duì)B樹(shù)的一種變形樹(shù),它與B樹(shù)的差異在于:

有k個(gè)子結(jié)點(diǎn)的結(jié)點(diǎn)必然有k個(gè)關(guān)鍵碼;

非葉結(jié)點(diǎn)僅具有索引作用,跟記錄有關(guān)的信息均存放在葉結(jié)點(diǎn)中。

樹(shù)的所有葉結(jié)點(diǎn)構(gòu)成一個(gè)有序鏈表,可以按照關(guān)鍵碼排序的次序遍歷全部記錄。

如下圖,是一個(gè)B+樹(shù):

詳細(xì)介紹ADAS算法

B和B+樹(shù)的區(qū)別在于,B+樹(shù)的非葉子結(jié)點(diǎn)只包含導(dǎo)航信息,不包含實(shí)際的值,所有的葉子結(jié)點(diǎn)和相連的節(jié)點(diǎn)使用鏈表相連,便于區(qū)間查找和遍歷。

B+ 樹(shù)的優(yōu)點(diǎn)在于:

由于B+樹(shù)在內(nèi)部節(jié)點(diǎn)上不好含數(shù)據(jù)信息,因此在內(nèi)存頁(yè)中能夠存放更多的key。 數(shù)據(jù)存放的更加緊密,具有更好的空間局部性。因此訪問(wèn)葉子幾點(diǎn)上關(guān)聯(lián)的數(shù)據(jù)也具有更好的緩存命中率。

B+樹(shù)的葉子結(jié)點(diǎn)都是相鏈的,因此對(duì)整棵樹(shù)的便利只需要一次線性遍歷葉子結(jié)點(diǎn)即可。而且由于數(shù)據(jù)順序排列并且相連,所以便于區(qū)間查找和搜索。而B(niǎo)樹(shù)則需要進(jìn)行每一層的遞歸遍歷。相鄰的元素可能在內(nèi)存中不相鄰,所以緩存命中性沒(méi)有B+樹(shù)好。

但是B樹(shù)也有優(yōu)點(diǎn),其優(yōu)點(diǎn)在于,由于B樹(shù)的每一個(gè)節(jié)點(diǎn)都包含key和value,因此經(jīng)常訪問(wèn)的元素可能離根節(jié)點(diǎn)更近,因此訪問(wèn)也更迅速。

下面是B 樹(shù)和B+樹(shù)的區(qū)別圖:

詳細(xì)介紹ADAS算法

B/B+樹(shù)常用于文件系統(tǒng)和數(shù)據(jù)庫(kù)系統(tǒng)中,它通過(guò)對(duì)每個(gè)節(jié)點(diǎn)存儲(chǔ)個(gè)數(shù)的擴(kuò)展,使得對(duì)連續(xù)的數(shù)據(jù)能夠進(jìn)行較快的定位和訪問(wèn),能夠有效減少查找時(shí)間,提高存儲(chǔ)的空間局部性從而減少I(mǎi)O操作。它廣泛用于文件系統(tǒng)及數(shù)據(jù)庫(kù)中,如:

Windows:HPFS文件系統(tǒng);

Mac:HFS,HFS+文件系統(tǒng);

Linux:ResiserFS,XFS,Ext3FS,JFS文件系統(tǒng);

數(shù)據(jù)庫(kù):ORACLE,MYSQL,SQLSERVER等中。

有關(guān)B/B+樹(shù)在數(shù)據(jù)庫(kù)索引中的應(yīng)用,請(qǐng)看張洋的MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法原理這篇文章,這篇文章對(duì)MySQL中的如何使用B+樹(shù)進(jìn)行索引有比較詳細(xì)的介紹,推薦閱讀。

樹(shù)表查找總結(jié):

二叉查找樹(shù)平均查找性能不錯(cuò),為O(logn),但是最壞情況會(huì)退化為O(n)。在二叉查找樹(shù)的基礎(chǔ)上進(jìn)行優(yōu)化,我們可以使用平衡查找樹(shù)。平衡查找樹(shù)中的2-3查找樹(shù),這種數(shù)據(jù)結(jié)構(gòu)在插入之后能夠進(jìn)行自平衡操作,從而保證了樹(shù)的高度在一定的范圍內(nèi)進(jìn)而能夠保證最壞情況下的時(shí)間復(fù)雜度。但是2-3查找樹(shù)實(shí)現(xiàn)起來(lái)比較困難,紅黑樹(shù)是2-3樹(shù)的一種簡(jiǎn)單高效的實(shí)現(xiàn),他巧妙地使用顏色標(biāo)記來(lái)替代2-3樹(shù)中比較難處理的3-node節(jié)點(diǎn)問(wèn)題。紅黑樹(shù)是一種比較高效的平衡查找樹(shù),應(yīng)用非常廣泛,很多編程語(yǔ)言的內(nèi)部實(shí)現(xiàn)都或多或少的采用了紅黑樹(shù)。

除此之外,2-3查找樹(shù)的另一個(gè)擴(kuò)展——B/B+平衡樹(shù),在文件系統(tǒng)和數(shù)據(jù)庫(kù)系統(tǒng)中有著廣泛的應(yīng)用。

6. 分塊查找

分塊查找又稱索引順序查找,它是順序查找的一種改進(jìn)方法。 算法思想:將n個(gè)數(shù)據(jù)元素"按塊有序"劃分為m塊(m ≤ n)。每一塊中的結(jié)點(diǎn)不必有序,但塊與塊之間必須"按塊有序";即第1塊中任一元素的關(guān)鍵字都必須小于第2塊中任一元素的關(guān)鍵字;而第2塊中任一元素又都必須小于第3塊中的任一元素,…… 算法流程: step1 先選取各塊中的最大關(guān)鍵字構(gòu)成一個(gè)索引表; step2 查找分兩個(gè)部分:先對(duì)索引表進(jìn)行二分查找或順序查找,以確定待查記錄在哪一塊中;然后,在已確定的塊中用順序法進(jìn)行查找。

7. 哈希查找

什么是哈希表(Hash)?

我們使用一個(gè)下標(biāo)范圍比較大的數(shù)組來(lái)存儲(chǔ)元素??梢栽O(shè)計(jì)一個(gè)函數(shù)(哈希函數(shù), 也叫做散列函數(shù)),使得每個(gè)元素的關(guān)鍵字都與一個(gè)函數(shù)值(即數(shù)組下標(biāo))相對(duì)應(yīng),于是用這個(gè)數(shù)組單元來(lái)存儲(chǔ)這個(gè)元素;也可以簡(jiǎn)單的理解為,按照關(guān)鍵字為每一個(gè)元素"分類(lèi)",然后將這個(gè)元素存儲(chǔ)在相應(yīng)"類(lèi)"所對(duì)應(yīng)的地方。但是,不能夠保證每個(gè)元素的關(guān)鍵字與函數(shù)值是一一對(duì)應(yīng)的,因此極有可能出現(xiàn)對(duì)于不同的元素,卻計(jì)算出了相同的函數(shù)值,這樣就產(chǎn)生了"沖突",換句話說(shuō),就是把不同的元素分在了相同的"類(lèi)"之中。后面我們將看到一種解決"沖突"的簡(jiǎn)便做法。

總的來(lái)說(shuō),"直接定址"與"解決沖突"是哈希表的兩大特點(diǎn)。

什么是哈希函數(shù)?

哈希函數(shù)的規(guī)則是:通過(guò)某種轉(zhuǎn)換關(guān)系,使關(guān)鍵字適度的分散到指定大小的的順序結(jié)構(gòu)中,越分散,則以后查找的時(shí)間復(fù)雜度越小,空間復(fù)雜度越高。

算法思想:哈希的思路很簡(jiǎn)單,如果所有的鍵都是整數(shù),那么就可以使用一個(gè)簡(jiǎn)單的無(wú)序數(shù)組來(lái)實(shí)現(xiàn):將鍵作為索引,值即為其對(duì)應(yīng)的值,這樣就可以快速訪問(wèn)任意鍵的值。這是對(duì)于簡(jiǎn)單的鍵的情況,我們將其擴(kuò)展到可以處理更加復(fù)雜的類(lèi)型的鍵。

算法流程:

1)用給定的哈希函數(shù)構(gòu)造哈希表;

2)根據(jù)選擇的沖突處理方法解決地址沖突;

常見(jiàn)的解決沖突的方法:拉鏈法和線性探測(cè)法。詳細(xì)的介紹可以參見(jiàn):淺談算法和數(shù)據(jù)結(jié)構(gòu): 十一 哈希表。

3)在哈希表的基礎(chǔ)上執(zhí)行哈希查找。

哈希表是一個(gè)在時(shí)間和空間上做出權(quán)衡的經(jīng)典例子。如果沒(méi)有內(nèi)存限制,那么可以直接將鍵作為數(shù)組的索引。那么所有的查找時(shí)間復(fù)雜度為O(1);如果沒(méi)有時(shí)間限制,那么我們可以使用無(wú)序數(shù)組并進(jìn)行順序查找,這樣只需要很少的內(nèi)存。哈希表使用了適度的時(shí)間和空間來(lái)在這兩個(gè)極端之間找到了平衡。只需要調(diào)整哈希函數(shù)算法即可在時(shí)間和空間上做出取舍。

復(fù)雜度分析:

單純論查找復(fù)雜度:對(duì)于無(wú)沖突的Hash表而言,查找復(fù)雜度為O(1)(注意,在查找之前我們需要構(gòu)建相應(yīng)的Hash表)。

使用Hash,我們付出了什么? 我們?cè)趯?shí)際編程中存儲(chǔ)一個(gè)大規(guī)模的數(shù)據(jù),最先想到的存儲(chǔ)結(jié)構(gòu)可能就是map,也就是我們常說(shuō)的KV pair,經(jīng)常使用Python的博友可能更有這種體會(huì)。使用map的好處就是,我們?cè)诤罄m(xù)處理數(shù)據(jù)處理時(shí),可以根據(jù)數(shù)據(jù)的key快速的查找到對(duì)應(yīng)的value值。map的本質(zhì)就是Hash表,那我們?cè)讷@取了超高查找效率的基礎(chǔ)上,我們付出了什么?

Hash是一種典型以空間換時(shí)間的算法,比如原來(lái)一個(gè)長(zhǎng)度為100的數(shù)組,對(duì)其查找,只需要遍歷且匹配相應(yīng)記錄即可,從空間復(fù)雜度上來(lái)看,假如數(shù)組存儲(chǔ)的是byte類(lèi)型數(shù)據(jù),那么該數(shù)組占用100byte空間?,F(xiàn)在我們采用Hash算法,我們前面說(shuō)的Hash必須有一個(gè)規(guī)則,約束鍵與存儲(chǔ)位置的關(guān)系,那么就需要一個(gè)固定長(zhǎng)度的hash表,此時(shí),仍然是100byte的數(shù)組,假設(shè)我們需要的100byte用來(lái)記錄鍵與位置的關(guān)系,那么總的空間為200byte,而且用于記錄規(guī)則的表大小會(huì)根據(jù)規(guī)則,大小可能是不定的。

Hash算法和其他查找算法的性能對(duì)比:

詳細(xì)介紹ADAS算法

聲明:本文內(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)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4580

    瀏覽量

    92362
  • adas
    +關(guān)注

    關(guān)注

    309

    文章

    2154

    瀏覽量

    208446
  • 查找
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    8381
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ADAS系統(tǒng)組成簡(jiǎn)介#ADAS

    adas
    北匯信息POLELINK
    發(fā)布于 :2024年08月03日 20:05:37

    ADAS功能安全HiL仿真測(cè)試系統(tǒng)介紹#ADAS #VTHiL

    adas
    北匯信息POLELINK
    發(fā)布于 :2024年08月03日 20:07:34

    ADAS高級(jí)算法工程師

    ADAS高級(jí)算法工程師1、精通圖像識(shí)別及處理算法2、精通前車(chē)防撞預(yù)警算法3、精通車(chē)道偏移預(yù)警算法4、精通行人檢測(cè)預(yù)警
    發(fā)表于 11-05 09:26

    ADAS高級(jí)算法工程師

    ADAS高級(jí)算法工程師1、精通圖像識(shí)別及處理算法2、精通前車(chē)防撞預(yù)警算法3、精通車(chē)道偏移預(yù)警算法4、精通行人檢測(cè)預(yù)警
    發(fā)表于 04-10 13:00

    數(shù)學(xué)建模十大算法介紹

    算法是程序的靈魂,本資料詳細(xì)介紹了數(shù)學(xué)建模當(dāng)中的主要幾個(gè)算法的應(yīng)用分析,希望對(duì)大家在編程解決其他問(wèn)題的時(shí)候有所幫助
    發(fā)表于 11-11 09:40

    ADAS的春天就要來(lái)了

    下半年。」在前向啟創(chuàng)位于深圳的公司,熊志亮指著桌上三個(gè) ADAS 樣品告訴雷鋒網(wǎng),「前裝 ADAS 產(chǎn)品的原型去年下半年就出來(lái)了,今年我們的工作是產(chǎn)品化,不斷測(cè)試和修改。」為了滿足從算法原型、代碼實(shí)現(xiàn)到芯片上
    發(fā)表于 08-02 17:40

    ADAS1000BSTZ現(xiàn)貨

    `ADAS1000BSTZ-RL心電圖(ECG)模擬前端產(chǎn)品介紹ADAS1000BSTZ-RL詢價(jià)熱線ADAS1000BSTZ-RL現(xiàn)貨ADAS
    發(fā)表于 05-28 09:12

    上海 武漢 深圳招聘:圖像算法 電機(jī)控制算法 ADAS算法 咨詢:微信473421885

    軟硬件實(shí)現(xiàn) 6. 有FOC/MRAS/PMSM電機(jī)量產(chǎn)項(xiàng)目經(jīng)驗(yàn)者優(yōu)先ADAS算法高級(jí)工程師-武漢 深圳崗位職責(zé)開(kāi)發(fā)并實(shí)現(xiàn)汽車(chē)高級(jí)輔助駕駛系統(tǒng)的計(jì)算機(jī)視覺(jué)算法獨(dú)立完成數(shù)學(xué)建模及算法設(shè)計(jì),
    發(fā)表于 08-28 15:29

    ADAS系統(tǒng)的最新發(fā)展

    ,ADAS 系統(tǒng)中的算法和數(shù)據(jù)流非常復(fù)雜。TI 的創(chuàng)新型視覺(jué) SDK 框架允許用戶創(chuàng)建涉及視頻采集、視頻預(yù)處理、視頻分析算法以及視頻顯示的不同 ADAS 應(yīng)用數(shù)據(jù)流。SDK 具有示例
    發(fā)表于 09-17 15:52

    萌新求助,求大佬詳細(xì)介紹一下stm32S型加減速算法

    為什么我們喜歡用sigmoid這類(lèi)S型非線性變換?萌新求助,求大佬詳細(xì)介紹一下stm32S型加減速算法
    發(fā)表于 11-19 07:07

    ADAS技術(shù)介紹

    能夠?qū)?shí)時(shí)數(shù)據(jù)進(jìn)行高效感知、處理和應(yīng)對(duì)。對(duì)智能和多樣化傳感的需求傳統(tǒng)上,為ADAS運(yùn)行而收集的圖像數(shù)據(jù)由基于功能的計(jì)算機(jī)視覺(jué)算法進(jìn)行分析。在過(guò)去的十年里…
    發(fā)表于 11-08 06:07

    SVPWM的原理及法則推導(dǎo)和控制算法介紹

    包含SVPWM的算法介紹,基本原理,以及詳細(xì)的公式推導(dǎo),詳細(xì)的圖表示意,是初學(xué)FOC,準(zhǔn)備自己手寫(xiě)FOC庫(kù)或者理解FOC算法的工程師的有利手
    發(fā)表于 10-07 09:13

    汽車(chē)安全和ADAS應(yīng)用參考設(shè)計(jì)及其測(cè)試數(shù)據(jù)的介紹

    本文詳細(xì)介紹了汽車(chē)安全和ADAS應(yīng)用的參考設(shè)計(jì)及其測(cè)試數(shù)據(jù)。
    發(fā)表于 11-20 15:30 ?7次下載
    汽車(chē)安全和<b class='flag-5'>ADAS</b>應(yīng)用參考設(shè)計(jì)及其測(cè)試數(shù)據(jù)的<b class='flag-5'>介紹</b>

    ADAS有什么功能?ADAS的核心技術(shù)詳細(xì)介紹。你是否需要一個(gè)ADAS?

    大家對(duì)于這個(gè)名詞應(yīng)該不會(huì)很陌生。我們?cè)谠S多品牌的高端車(chē)型、行車(chē)記錄儀或者智能云鏡的配置中聽(tīng)到關(guān)于“ADAS”的介紹。都知道ADAS有著預(yù)測(cè)和規(guī)避風(fēng)險(xiǎn)的強(qiáng)大技能。而ADAS具體運(yùn)用到行駛
    的頭像 發(fā)表于 08-26 10:40 ?10.1w次閱讀

    數(shù)學(xué)建模中的常用算法詳細(xì)介紹

    本文檔的主要內(nèi)容詳細(xì)介紹的是數(shù)學(xué)建模中的常用算法詳細(xì)介紹。
    發(fā)表于 07-20 08:00 ?2次下載
    數(shù)學(xué)建模中的常用<b class='flag-5'>算法</b><b class='flag-5'>詳細(xì)</b><b class='flag-5'>介紹</b>