數據結構08查找

第九章?查找

另一種在實際應用中大量使用的數據結構--查找表。

所謂查找,即為在一個含有眾多的數據元素的查找表中找出某個“特定的”數據元素。

?

查找表 search table?是由同一類型的數據元素構成的集合。集合中的數據元素之間存在著完全松散的關系,故查找表非常靈便。

?

對查找表經常進行的操作:

>查詢某個元素是否在查找表中;

>檢索某個元素的各種屬性;

>插入

>刪除

?

靜態查找表 static search table:只包含查詢和檢索。

動態查找表 dynamic search table:包含查詢、檢索、插入、刪除。

?

關鍵字 Key 用于標識數據元素。

>主關鍵字 primary key:唯一的標識一個記錄。

>次關鍵字 secondary key:識別若干記錄。

?

查找 searching:

根據給定的某個值,在查找表中確定一個其關鍵字等于給定值的記錄。

?

由于表中數據元素之間僅存在“同屬一個集合”的松散關系,需在數據元素之間人為的加上一些關系,以便按某種規則進行查找,即以另一種數據結構來表示查找表。

>靜態查找表

>動態查找表

?

9.1 靜態查找表

靜態查找表有不同的表示方法,在不同的表示方法中,實現查找操作的方法也不同。

?

9.1.1 順序表的查找

以順序表或線性鏈表表示靜態查找表,則可用順序查找來實現。

順序查找 sequential search

從表中最后一個記錄開始,逐個進行記錄關鍵字和給定值的比較,若相等,則查找成功;反之,直到第一個記錄都不相等,則表明表中沒有要查找的記錄,查找不成功。

?

Tip:在查找尾端設置哨兵,而免去每一步都要檢測整個表是否查找完畢,可節約一半的時間。哨兵的值等于所查找的關鍵字。

?

查找表性能度量:平均查找長度(Average Search Length)ASL

?


對記錄的查找概率不相等的查找表,若能預先得知每個記錄的查找概率,則應先對記錄的查找概率進行排序,使表中記錄按查找概率由小到大重新排列,以便提高查找效率。

在一般情況下,記錄的查找概率預先無法測定。

為了提高查找效率,可以在每個記錄中附設一個訪問頻度域,并使順序表中的記錄保持按訪問頻度非遞減有序排列,使得查找概率大的記錄在查找過程中不斷后移,以便在以后的逐次查找中減少比較次數。

或者在每次查找之后都將剛查找到的記錄直接移至表尾。

?

順序查找:

缺點:平均查找長度較長,當n很大時,查找效率低。

優點:簡單且適應面廣,對表結構無任何要求,無論記錄是否按關鍵字有序均可應用。

?

?

?

9.1.2 有序表的查找

?

折半查找 binary search:

先確定待查記錄所在的范圍(區間),然后逐步縮小范圍直到找到或找不到該記錄為止。

?

折半查找性能:

對任意的n,當n>50時,有下列近似結果

?

折半查找只適用于有序表,且限于順序存儲結構,對線性鏈表無法有效地進行折半查找。

?

?

Fibonacci查找:

根據Fibonacci序列的特點對表進行分割。

開始時,表中記錄個數比某個Fibonacci數小1,即

?

Fibonacci查找的平均性能比折半查找好,但最壞情況下的性能(雖然仍是O(logn))比折半查找差。

另一個優點,分割時只需進行加減運算。

?

插值查找:

根據給定值key來確定進行比較的關鍵字位置i的查找方案。

公式:

?

其中,high和low為最大關鍵字和最小關鍵字的下標。

插值查找只適合于關鍵字均勻分布的表。在這種情況下,對表長較大的順序表,其平均性能比折半查找好。

?

9.1.3 靜態樹表的查找

當有序表中各記錄的查找概率不等時,折半查找性能未必最優。

描述查找過程的判定樹為何類二叉樹時,其查找性能最佳?

如果只考慮查找成功的情況,則查找性能最佳的判定樹是其帶權內路徑長度之和PH值取最小值的二叉樹。

稱PH值最小的二叉樹為靜態最優查找樹(Static Optimal Search Tree)。

構造靜態最優查找樹花費的時間代價高。

?

靜態樹表是把有序的靜態查找表根據數據被查找的概率生成一棵二叉樹。

?

介紹一種構造近似最優查找樹的有效算法。

次優查找樹(Nearly Optimal Search Tree):帶權內路徑長度PH值在所有具有同樣權值的二叉樹中近似為最小。

方法:選取第i個記錄作為根結點,然后分別對左右序列構造兩個次優查找樹作為i的左右子樹。

i滿足的條件:左序列權值和右序列權值之和差值的絕對值最小。

?

由于在構造次優查找樹的過程中,沒有考察單個關鍵字的相應權值,則有可能出現被選為根的關鍵字的權值比與它相鄰的關鍵字的權值小。此時應作適當調整:選取鄰近的權值較大的關鍵字作次優查找樹的根結點。

例:關鍵字 A ?B ??C ?D ?E

????權值 ??1 ?30 ?2 ?29 ?3

大量的實驗研究表明,次優查找樹和最優查找樹的查找性能之差僅為1%~2%,很少超過3%。

且構造次優查找樹的算法的時間復雜度為O(nlogn)。

?

?

9.1.4 索引順序表

有點像Skip List。

分塊查找又稱索引順序查找,這是順序查找的一種改進方法。

除表本身外,還需建立一個“索引表”。

索引表按關鍵字有序,表或者有序或者分塊有序。

分塊查找過程需分兩步進行:先確定待查記錄所在的塊(子表),然后在塊中順序查找。

?

由于索引表按關鍵字有序,則確定塊的查找可以用順序查找,亦可用折半查找。而塊中記錄是任意排列的,則在塊中只能是順序查找。

分塊查找是順序查找和折半查找的簡單結合。

若都用順序,

?

9.2 動態查找表

表結構支持插入和刪除操作。

9.2.1 二叉排序樹和平衡二叉樹

二叉排序樹(Binary Sort Tree)或者是一棵空樹,或者是具有下列性質的二叉樹:

(1)若左子樹不空,則左子樹上所有結點均小于根結點;

(2)若右子樹不空,則右子樹上所有結點均大于根結點;

(3)左右子樹均為二叉排序樹。

?

?

二叉排序樹又稱二叉查找樹。

中序遍歷二叉排序樹可得到一個關鍵字的有序序列。

即一個無序序列可以通過構造一棵二叉排序樹而變成一個有序序列,構造樹的過程即為對無序序列進行排序的過程。

?

插入:每次插入的新結點都是二叉排序樹上新的葉子結點。

刪除: ?

  1. 若刪除點無孩子結點,直接刪除;
  2. 若刪除點只有一個孩子,則將其孩子替代其位置;
  3. 若刪除點有兩個孩子,兩種方法:
    a)?鏈上左孩子,右孩子為左孩子的最右;或鏈上右孩子,左孩子為右孩子最左;
    b)?用直接前驅替代,然后刪掉直接前驅;或用直接后繼替代,然后刪掉直接后繼。

?

?

平衡二叉樹(Balanced Binary Tree 或 Height-Balanced Tree)或者是一棵空樹,或者是具有如下性質的二叉樹:

它的左右子樹都是平衡二叉樹,且左右子樹的深度之差的絕對值不超過1。

?

平衡因子BF(Balance Factor):該結點左子樹的深度減去右子樹的深度。

平衡二叉樹所有結點的平衡因子只可能是-1,0,1。

只要二叉樹上有一個結點平衡因子的絕對值大于1,則該二叉樹就是不平衡的。

?

在平衡二叉排序樹BBST上插入一個新的數據元素e的遞歸算法如下:

  1. 若BBST為空樹,則插入一個數據元素為e的新結點作為BBST的根結點,樹的深度增1;
  2. 若e的關鍵字和BBST的根結點的關鍵字相等,則不進行插入;
  3. 若e的關鍵字小于BBST的根結點的關鍵字,而且在BBST的左子樹中不存在和e有相同關鍵字的結點,則將e插入在BBST的左子樹上,并且當插入之后的左子樹深度加1時,分別就下列不同情況處理之:

    a)?BBST的根結點的平衡因子為-1,則將根結點的平衡因子更改為0,BBST的深度不變;?
    b)?BBST的根結點的平衡因子為0,則將根結點的平衡因子更改為1,BBST的深度增1;
    c)?BBST的根結點的平衡因子為1:
    ? ? ? ??若BBST的左子樹根結點的平衡因子為1,則需進行單向右旋平衡處理,并且在右旋處理之后,將根結點和其右子樹根結點的平衡因子更改為0,樹的深度不變;
    ? ? ? ??若BBST的左子樹根結點的平衡因子為-1,則需進行先向左、后向右的雙向旋轉平衡處理,并且在旋轉處理之后,修改根結點和其左右子樹根結點的平衡因子,樹的深度不變;
    ?
  4. 若e的關鍵字大于BBST的根結點的關鍵字,而且在BBST的右子樹中不存在和e有相同關鍵字的結點,則將e插入在BBST的右子樹上,并且當插入之后的右子樹深度增加1時,分別就不同情況處理之。其處理操作和步驟3中所述相對稱。

??

LL型:新結點Y插入到A的左子樹的左子樹上 ??左左->右

?

RR型:新結點Y插入到A的右子樹的右子樹上 ??右右->左

?

LR型:新結點Y插入到A的左子樹的右子樹上 ??左右->左右

????????????????????????

?

RL型:新結點Y插入到A的右子樹的左子樹上 ??右左->右左

?

?????????????????????????????

AVL樹的平衡化處理:通過調換根結點,使左右子樹的深度相等。
在一棵AVL樹上插入結點可能會破壞樹的平衡性,需要平衡化處理恢復平衡,且保持BST的結構性質。

若用Y表示新插入的結點,A表示離新插入結點Y最近的,且平衡因子變為2的祖先結點。

可用4種旋轉進行平衡化處理:

>LL型:新結點Y插入到A的左子樹的左子樹上 ??左左->右

>RR型:新結點Y插入到A的右子樹的右子樹上 ??右右->左

>LR型:新結點Y插入到A的左子樹的右子樹上 ??左右->左右

>RL型:新結點Y插入到A的右子樹的左子樹上 ??右左->右左

?

4種不平衡情況經調整都有如下特性:

  1. 成為A型,調整前的中值結點成為新的根結點,其平衡因子為0,其左、右孩子分別是小值、大值結點;
  2. 調整后,樹的深度和插入結點前一樣。

特性2說明,如果插入一個結點導致平衡二叉樹失衡,則只需在通向根結點的路徑上進行一次平衡調整。

?

?

9.2.2 B-樹和B+樹

磁盤查找

?

?

?

高為h的B-樹的最大結點數:

?

?

設m階B-樹的高為h,失敗結點位于h+1層,則關鍵字個數N最少到達多少?

11結點

22結點

3結點

h結點

若樹中關鍵字有N個,則失敗結點數為N+1。

即:

給定m和N可以求出最大高度:m=199,N=1,999,999,可得h<=4;

給定m和h可以求出最少關鍵字數:m=3,h=4,N>=15。

?

m的選擇:查找關鍵字所用時間最少。

兩部分時間:從磁盤讀入結點所需時間,在結點中查找關鍵字所需時間。

在B-樹上進行查找的過程是一個順指針查找結點在結點的關鍵字中進行查找交叉進行的過程。

?

?

在含有N個關鍵字的B-樹上進行查找時,從根節點到關鍵字所在結點的路徑上涉及的結點數不超過

?

插入過程為自底向上分裂結點。

每次插入首先在最低層的某個非終端結點中添加一個關鍵字,如果該結點的關鍵字個數不超過m-1,則插入完成;否則分裂。

B樹索引,關鍵字后跟的是文件地址信息。

?

刪除,若不是最后一層非終端結點,則將其用左子樹的最右或者右子樹的最左來替換。然后刪除用于替換的結點。

否則分4種情況:

1、最后一層非終端結點,且為根結點,直接刪;

2、最后一層非終端結點,不為根結點。

?

B-樹主要用作文件的索引,因此它的查找涉及外存的存取。

查找包括兩步:1、在B-樹中找結點(磁盤);2、在結點中找關鍵字(內存)。

即,在磁盤上找到結點后,將其讀入內存,再在內存中進行關鍵字的查找。

?

?

?

B+樹:B-樹的一種變形。

差異:

1、含k個關鍵字的結點必有k個子樹;

2、非終端結點僅具有索引作用,與記錄有關的信息均存放在葉結點中;

3、葉結點依關鍵字自小而大順序鏈接。

?

兩個頭指針:一個指向根結點,另一個指向關鍵字最小的葉子結點。

兩種查找方式

1、沿著根結點隨機查找;

2、從最小關鍵字結點順序查找。

?

9.2.3 鍵樹

鍵樹又稱數字查找樹(Digital Search Tree):

它是一棵度大于等于2的樹,樹中的每個結點只含有組成關鍵字的符號。

若關鍵字是數值,則結點中只包含一個數位;若關鍵字是單詞,則結點中只包含一個字母字符。

?

兩種存儲方式:1、孩子兄弟鏈;2、多重鏈表。

?

9.3 哈希表

9.3.1 什么是哈希表

前述查找結構中,關鍵字和相對存儲位置是隨機的,在查找過程中需要進行比較,是建立在比較基礎上。

沖突(collision):哈希值相同。

同義詞(synonym):哈希值沖突的關鍵字。

一般情況下,沖突只能盡可能減少,而不能完全避免。

?

哈希表:根據設定的哈希函數H(key)和處理沖突的方法將一組關鍵字映像到一個有限的連續的地址集(區間)上,并以關鍵字在地址集中的像作為記錄在表中的存儲位置,這種表便稱為哈希表

這一映像過程稱為散列,所得存儲位置稱為哈希地址散列地址

?

9.3.2 哈希函數的構造方法

好的哈希函數:對于關鍵字集合,經哈希函數映像到地址集合中任何一個地址的概率是相等的,則稱此類哈希函數為均勻的(Uniform)哈希函數

即使關鍵字經過哈希函數得到一個“隨機的地址”,以便使一組關鍵字的哈希地址均勻分布在整個地址區間中,從而減少沖突。

1、直接定址法

取關鍵字或關鍵字的某個線性函數值為哈希地址:

?

2、除留余數法

?

9.3.3 處理沖突的方法

1、開放定址法

?

2、再哈希法

對沖突的關鍵字用另一個哈希函數計算地址,直至不再沖突。

?

3、鏈地址法

?

4、建立一個公共溢出區

將沖突的關鍵字全部加入這個緩沖區中。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387202.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387202.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387202.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

下載Centos7 64位鏡像

下載Centos7 64位鏡像 1.打開Centos官網 打開Centos官方網站地址&#xff1a;https://www.centos.org/&#xff0c;點擊Get CentOS Now 2.點擊Minimal ISO鏡像 Minimal ISO鏡像&#xff0c;與DVD ISO鏡像的差別有很多&#xff0c;這里只說兩點 1.Minimal ISO類似于Windows的純凈…

[Objective-C語言教程]結構體(17)

Objective-C數組可定義包含多個相同類型的數據項的變量類型&#xff0c;但結構體是Objective-C編程中的另一個用戶定義數據類型&#xff0c;它可組合不同類型的數據項。 結構體用于表示記錄&#xff0c;假設要圖書館中跟蹤書籍信息。可能希望跟蹤每本書的以下屬性 - 標題作者學…

Scala01入門

第1章 可伸展的語言 Scala應用范圍廣&#xff0c;從編寫腳本&#xff0c;到建立大型系統。 運行在標準Java平臺上&#xff0c;與Java庫無縫交互。 更能發揮力量的地方&#xff1a;建立大型系統或可重用控件的架構。 將面向對象和函數式編程加入到靜態類型語言。 在Scala中&a…

架構師之路17年精選80篇

【架構必備】 《互聯網架構如何實現“高并發”》4W 《TCP接入層的負載均衡、高可用、擴展性架構設計》2.2W 《配置中心架構設計演進》1.7W 《跨公網調用的大坑與架構優化》1.4W 《DNS在架構設計中的巧用》1.9W 《消息如何在網絡上安全傳輸》1.2W 《10W定時任務&#xff0c;如何…

iphone手機型號獲取

#import <sys/utsname.h> //手機型號 NSString *device [self iphoneType]; (NSString *)iphoneType { struct utsname systemInfo; uname(&systemInfo); NSString *platform [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding]; if…

Java網絡01基本網絡概念

協議 Protocol&#xff1a;明確規則 &#xff08;1&#xff09;地址格式&#xff1b; &#xff08;2&#xff09;數據如何分包&#xff1b; ... TCP/IP四層模型&#xff1a; 應用層 HTTP SMTP POP IMAP 傳輸層 TCP UDP 網際層 IP 主機網絡層 host to host layer 數模、…

apache的產品分類說明

分類 項目名 說明 開發語言 服務器&#xff08;共20&#xff09; Apache HTTP Server全球第一HTTP服務器C/CTomcatJava的Web服務器JavaJames郵件服務器JavaSpamAssassin反垃圾郵件C/CPerlApache的Perl編程語言支持C/CTclTCL腳本語言C/CDirectory Server超級目錄服務器JavaAxisW…

Java網絡02基本Web概念

URI Uniform Resource Identifier 同一資源標識符 以特定語法標識一個資源的字符串 絕對URI&#xff1a;URI模式模式特有部分 scheme:scheme-specific-part scheme分為&#xff1a; data file本地文件系統 ftp http telnet urn 統一資源名 scheme-specific-part為&am…

解決自建ca認證后瀏覽器警告

前一篇講解了基本的建立證書的過程&#xff0c;但是建立后總是會在瀏覽器那里警告&#xff1a; 此鏈接不是私密鏈接 --谷歌瀏覽器 此證書頒發機構不可信 此證書不是這個網站的 --ie瀏覽器 總之證書是生成成功了&#xff0c;但是其中的內容填寫錯誤了&a…

設計模式學習(三)——單例模式

在Java開發過程中&#xff0c;很多場景下都會碰到或要用到單例模式&#xff0c;在設計模式里也是經常作為指導學習的熱門模式之一&#xff0c;相信每位開發童鞋都用到過。我們總是沿著前輩的足跡去做設定好的思路&#xff0c;往往沒去探究為何這么做&#xff0c;所以這篇文章對…

Java網絡03流

網絡程序所做的很大一部分工作只是輸入和輸出&#xff1a;從一個系統向另一個系統移動數據。 輸出流 Java的基本輸出流類是java.io.OutputStream: public abstract class OutputStream 這個類提供了寫入數據所需的基本方法&#xff0c;包括&#xff1a; public abstract vo…

基于微信小程序開發的仿微信demo

(本文參考自github/liujians,地址:https://github.com/liujians/weApp) 作者聲明&#xff1a; 基于微信小程序開發的仿微信demo 整合了ionic的樣式庫和weui的樣式庫 使用請查看使用必讀! 更新日志請點擊這里 目前功能 查看消息 網絡請求獲取數據&#xff08;download示例server…

設計模式之六大原則

設計模式之設計原則 這軟件設計過程中&#xff0c;有六大設計原則&#xff1a; 單一職責原則里氏替換原則依賴倒置原則接口隔離原則迪米特法則開閉原則由于軟件開發過程中&#xff0c;根據業務不同等因素形成了各種復雜的而不可預料的需求&#xff0c;遵守原則&#xff0c;讓項…

安裝配置tengine

安裝tengine 1、依賴gcc openssl-devel pcre-devel zlib-devel 安裝&#xff1a;yum install gcc openssl-devel pcre-devel zlib-devel 2、解壓tengine壓縮包&#xff0c;并進入目錄&#xff1b; 3、./configure --prefix/usr/tengine 4、make && make install 5…

使用springboot集成jseesite

請訪問 開源中國下的https://git.oschina.net/wolfking/wolfking-jeesitehttps://www.oschina.net/p/wolfking-jeesite?fromerr6Iie3qZt 下載源碼&#xff0c;按照如下的運行使用 springboot 改造 jeesite&#xff0c;只保留最簡單的系統配置 。 介紹 1、運行主類&#xff0c;…

解決idea 中web項目無法正常顯示的問題

轉載于:https://www.cnblogs.com/nulijiushimeili/p/10575364.html

Hadoop小知識點

hdfs命令行 上傳 hadoop fs -put 文件名 hdfs://主機名:9000/... 下載 hadoop fs -get hdfs://主機名:9000/... 文件名 /hadoop/share/hadoop/mapreduce 文件夾下有測試程序 提交MapReduce任務命令 #hadoop jar hadoop-mapreduce-examples-2.4.1.jar pi 5 5 hadoop fs -m…

copy 擴展名 包含子文件夾 文件 到某個 文件夾

比如我在d:\fff下面有很多子文件夾&#xff0c;子文件夾里還有子文件夾&#xff0c;里面有些文件夾里有.ppm.bz2的后綴的文件&#xff0c;需要把他們找出來復制到d:\fff2里面&#xff0c;應該怎么用批處理寫&#xff1f;最佳答案1234echo offfor /r d:\fff %%a in (*.ppm.bz2) …

在線視頻常見加密方式及安全性透析

信息化時代&#xff0c;多媒體的應用日漸成為人們生活中不可或缺的部分&#xff0c;無論是獲取最新資訊還是教育學習&#xff0c;視頻都是直觀高效的媒介之一。 基于互聯網的快速傳播&#xff0c;眾多培訓機構也逐漸將線下原創版權課程遷移到在線平臺中&#xff0c;一方面可以更…

分享一個前后端分離的web項目(vue+spring boot)

Github地址&#xff1a;https://github.com/smallsnail-wh 前端項目名為wh-web后端項目名為wh-server項目展示地址為我的github pages&#xff08;https://smallsnail-wh.github.io&#xff09;用戶名&#xff1a;admin&#xff0c;密碼admin&#xff08;第一次啟動會比較慢&am…