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

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

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

詳細介紹ADAS算法

ADAS ? 來源:djl ? 作者:ADAS ? 2019-08-08 17:34 ? 次閱讀

閱讀目錄

1. 順序查找

2. 二分查找

3. 插值查找

4. 斐波那契查找

5. 樹表查找

6. 分塊查找

7. 哈希查找

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

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

查找算法分類:

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

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

2)無序查找和有序查找。

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

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

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

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

1. 順序查找

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

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

復雜度分析:

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

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

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

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

2. 二分查找

說明:元素必須是有序的,如果是無序的則要先進行排序操作。

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

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

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

C++實現(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. 插值查找

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

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

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

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

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

通過類比,我們可以將查找的點改進為如下:

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

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

基本思想:基于二分查找算法,將查找點的選擇改進為自適應選擇,可以提高查找效率。當然,差值查找也屬于有序查找。

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

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

C++實現(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. 斐波那契查找

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

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

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

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

詳細介紹ADAS算法

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

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

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

2)>,low=mid+1;

3)<,high=mid-1。

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

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

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

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

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

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

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

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

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

//斐波那契查找.cpp#include"stdafx.h"#include#includeusingnamespacestd;constintmax_size=20;//斐波那契數(shù)組的長度/*構(gòu)造一個斐波那契數(shù)組*/voidFibonacci(int*F) { F[0]=0; F[1]=1;for(inti=2;iF[k]-1)//計算n位于斐波那契數(shù)列的位置 ++k;int*temp;//將數(shù)組a擴展到F[k]-1的長度 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則說明是擴展的數(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. 樹表查找

5.1 最簡單的樹表查找算法——二叉樹查找算法。

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

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

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

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

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

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

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

詳細介紹ADAS算法

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

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

下圖為二叉樹查找和順序查找以及二分查找性能的對比圖:

詳細介紹ADAS算法

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

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

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

1)要么為空,要么:

2)對于2節(jié)點,該節(jié)點保存一個key及對應value,以及兩個指向左右節(jié)點的節(jié)點,左節(jié)點也是一個2-3節(jié)點,所有的值都比key要小,右節(jié)點也是一個2-3節(jié)點,所有的值比key要大。

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

詳細介紹ADAS算法

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

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

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

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

詳細介紹ADAS算法

復雜度分析:

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

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

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

距離來說,對于1百萬個節(jié)點的2-3樹,樹的高度為12-20之間,對于10億個節(jié)點的2-3樹,樹的高度為18-30之間。

對于插入來說,只需要常數(shù)次操作即可完成,因為他只需要修改與該節(jié)點關(guān)聯(lián)的節(jié)點即可,不需要檢查其他節(jié)點,所以效率和查找類似。下面是2-3查找樹的效率:

詳細介紹ADAS算法

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

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

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

詳細介紹ADAS算法

紅黑樹的定義:

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

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

一個節(jié)點不可能有兩個紅色鏈接

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

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

詳細介紹ADAS算法

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

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

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

詳細介紹ADAS算法

紅黑樹的平均高度大約為logn。

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

詳細介紹ADAS算法

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

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

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

.NET中的:SortedDictionary,SortedSet等。

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

平衡查找樹中的2-3樹以及其實現(xiàn)紅黑樹。2-3樹種,一個節(jié)點最多有2個key,而紅黑樹則使用染色的方式來標識這兩個key。

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

B樹定義:

B樹可以看作是對2-3查找樹的一種擴展,即他允許每個節(jié)點有M-1個子節(jié)點。

根節(jié)點至少有兩個子節(jié)點

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

位于M-1和M key的子節(jié)點的值位于M-1 和M key對應的Value之間

其它節(jié)點至少有M/2個子節(jié)點

下圖是一個M=4 階的B樹:

詳細介紹ADAS算法

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

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+樹定義:

B+樹是對B樹的一種變形樹,它與B樹的差異在于:

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

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

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

如下圖,是一個B+樹:

詳細介紹ADAS算法

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

B+ 樹的優(yōu)點在于:

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

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

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

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

詳細介紹ADAS算法

B/B+樹常用于文件系統(tǒng)和數(shù)據(jù)庫系統(tǒng)中,它通過對每個節(jié)點存儲個數(shù)的擴展,使得對連續(xù)的數(shù)據(jù)能夠進行較快的定位和訪問,能夠有效減少查找時間,提高存儲的空間局部性從而減少IO操作。它廣泛用于文件系統(tǒng)及數(shù)據(jù)庫中,如:

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

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

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

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

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

樹表查找總結(jié):

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

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

6. 分塊查找

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

7. 哈希查找

什么是哈希表(Hash)?

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

總的來說,"直接定址"與"解決沖突"是哈希表的兩大特點。

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

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

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

算法流程:

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

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

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

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

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

復雜度分析:

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

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

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

Hash算法和其他查找算法的性能對比:

詳細介紹ADAS算法

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

    關(guān)注

    23

    文章

    4552

    瀏覽量

    92024
  • adas
    +關(guān)注

    關(guān)注

    309

    文章

    2131

    瀏覽量

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

    關(guān)注

    0

    文章

    5

    瀏覽量

    8372
收藏 人收藏

    評論

    相關(guān)推薦

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

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

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

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

    ADAS高級算法工程師

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

    ADAS高級算法工程師

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

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

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

    ADAS的春天就要來了

    下半年?!乖谇跋騿?chuàng)位于深圳的公司,熊志亮指著桌上三個 ADAS 樣品告訴雷鋒網(wǎng),「前裝 ADAS 產(chǎn)品的原型去年下半年就出來了,今年我們的工作是產(chǎn)品化,不斷測試和修改?!篂榱藵M足從算法原型、代碼實現(xiàn)到芯片上
    發(fā)表于 08-02 17:40

    ADAS1000BSTZ現(xiàn)貨

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

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

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

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

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

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

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

    ADAS技術(shù)介紹

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

    SVPWM的原理及法則推導和控制算法介紹

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

    汽車安全和ADAS應用參考設(shè)計及其測試數(shù)據(jù)的介紹

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

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

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

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

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