前面我們學(xué)習(xí)了三種基本數(shù)據(jù)結(jié)構(gòu).ppt_第1頁
前面我們學(xué)習(xí)了三種基本數(shù)據(jù)結(jié)構(gòu).ppt_第2頁
前面我們學(xué)習(xí)了三種基本數(shù)據(jù)結(jié)構(gòu).ppt_第3頁
前面我們學(xué)習(xí)了三種基本數(shù)據(jù)結(jié)構(gòu).ppt_第4頁
前面我們學(xué)習(xí)了三種基本數(shù)據(jù)結(jié)構(gòu).ppt_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

前面我們學(xué)習(xí)了三種基本數(shù)據(jù)結(jié)構(gòu):,一般線性表(數(shù)據(jù)元素、關(guān)系、操作無限制) 棧和隊(duì)列(操作有限制) 字符串(數(shù)據(jù)元素有限制) 廣義表和數(shù)組(參與關(guān)系有限制) 樹和二叉樹結(jié)構(gòu) 圖結(jié)構(gòu),ADT的定義: 數(shù)據(jù)結(jié)構(gòu)的邏輯特性; 數(shù)據(jù)結(jié)構(gòu)上定義的操作; ADT的虛擬實(shí)現(xiàn): 邏輯結(jié)構(gòu)的虛擬實(shí)現(xiàn)(存儲(chǔ)結(jié)構(gòu)) 操作的虛擬實(shí)現(xiàn)(算法); ADT應(yīng)用舉例:,講授的方法:,前面學(xué)習(xí)的每一種數(shù)據(jù)結(jié)構(gòu)都定義了一 些常用的操作,如:初始化、訪問某數(shù) 據(jù)元素等等,因此,研究操作的實(shí)現(xiàn)( 不是操作的定義)即算法也是數(shù)據(jù)結(jié)構(gòu) 的范疇。,有兩個(gè)操作在每個(gè)數(shù)據(jù)結(jié)構(gòu)上、在計(jì)算 機(jī)應(yīng)用中是非常重要的: 其一,確定元素的位置查找; 其二,將元素按某種順序排列分類 后面兩章我們分別學(xué)習(xí)這兩類操作的算 法(思想、效率、優(yōu)缺點(diǎn)等等);,第九章 查找,本章學(xué)習(xí)各種查找算法,了解算法的思想、 效率、優(yōu)缺點(diǎn)、適用范圍等等。,預(yù)備知識(shí),1、查找:在某一數(shù)據(jù)集合中查找數(shù)據(jù)元素是否存 在,若存在,返回其位置,否則,返回 失敗信息。,2、查找表:被查找數(shù)據(jù)元素的集合(一般都是一 種數(shù)據(jù)結(jié)構(gòu),元素的位置是指在該數(shù) 據(jù)結(jié)構(gòu)中的邏輯位置,但是查找方法 還依賴與元素的存儲(chǔ),即與存儲(chǔ)結(jié)構(gòu) 有關(guān)),一般是虛擬實(shí)現(xiàn)了的邏輯結(jié) 構(gòu)(數(shù)據(jù)結(jié)構(gòu)+存儲(chǔ)結(jié)構(gòu))。,3、查找表的種類: 靜態(tài)查找表:數(shù)據(jù)集合在查找前后不變; 動(dòng)態(tài)查找表:數(shù)據(jù)集合在查找后會(huì)改變;,注意: 查找表一般可以描述為: 數(shù)據(jù)對(duì)象D0:D0是具有相同特性的數(shù)據(jù)元素的 集合。每個(gè)數(shù)據(jù)元素含有類型相 同的關(guān)鍵字,可唯一標(biāo)識(shí)數(shù)據(jù)元 素。 數(shù)據(jù)關(guān)系R:數(shù)據(jù)元素同屬一個(gè)集合(關(guān)系描述)。,4、查找方法: 查找表不同,查找方法就會(huì)不同。有很多不同 的查找方法。,5、查找算法的評(píng)價(jià): 空間:占用的輔助空間少; 時(shí)間:時(shí)間少。查找的基本操作是比較,因此 時(shí)間主要體現(xiàn)為比較次數(shù)。,查找成功: 最大比較次數(shù)MSL 平均比較次數(shù)ASL,查找失?。?最大比較次數(shù)MSL 平均比較次數(shù)ASL,9.1 靜態(tài)查找表的查找,靜態(tài)查找表有很多種,查找方法也不一樣, 下面介紹幾種常見的靜態(tài)查找表的查找方法。,一、靜態(tài)查找表是順序或鏈?zhǔn)酱鎯?chǔ)的線性表 順序查找,1、查找表的要求:線性表,2、查找方法:略,1、查找表的要求:,3、特點(diǎn): 思想簡單,對(duì)查找表要求少,適應(yīng)面廣; 比較次數(shù)較大O(n); (考慮查找概率不相等時(shí)應(yīng)該如何處理?),二、靜態(tài)查找表是順序存儲(chǔ)的、有序的線性表 折半查找(Fibonacci查找、插值查找),1、查找表的要求:順序存儲(chǔ)、有序的線性表,2、查找方法:,x=Rmid OK! xRmid mid+1hig,R,3、特點(diǎn): 對(duì)查找表要求多; 比較次數(shù)較少O(log2n);,折半查找的過程可以用一棵二叉樹表示,稱之為 “折半查找的判定樹”。(構(gòu)造方法自己總結(jié), 該樹是唯一的嗎?) 例如: 折半查找在n=11 時(shí)的判定樹如下:,一般情況下,表長為n的折半查找的判定樹的深度和 含有n個(gè)結(jié)點(diǎn)的完全二叉樹的深度相同。 假設(shè) n=2h-1 并且查找概率相等則:,在n50時(shí),可得近似結(jié)果:,三、靜態(tài)查找表是樹 靜態(tài)樹查找,1、查找表的要求:二叉分類樹,2、查找方法:,X與根比較: 相等: OK! X根: 在右子樹上找,3、特點(diǎn): 類似折半,最大是樹的深度; 等概率時(shí),折半查找的判定樹是最好的; 不等概率時(shí),概率高的應(yīng)該靠近根。,四、靜態(tài)查找表是分塊索引表 分塊查找,1、查找表的要求:順序存儲(chǔ)、分塊有序,2、查找方法:,折半方法確定可能在的塊; 順序查找確定元素;,3、特點(diǎn): 要建立索引表; 效率介于折半和順序之間;,9.2 動(dòng)態(tài)查找表的查找 動(dòng)態(tài)二叉分類樹的查找,1、查找表的要求:二叉分類樹,2、查找方法:,若二叉排序樹為空,則查找不成功;否則 1)若給定值等于根結(jié)點(diǎn)的關(guān)鍵字,則查找成功; 2)若給定值小于根結(jié)點(diǎn)的關(guān)鍵字,則繼續(xù)在左 子樹上進(jìn)行查找; 3)若給定值大于根結(jié)點(diǎn)的關(guān)鍵字,則繼續(xù)在右 子樹上進(jìn)行查找。,Btreenode * find( Btreenode *BST,elentype x) /在以BST為根指針的二叉排隊(duì) 樹中查找值為x的結(jié)點(diǎn) if ( BST= =NULL) return NULL; /查找失敗 else if (BST-data= =x) /查找成功 return BST; else if (BST-datax) /進(jìn)入左子樹查找 return find ( BST-left,x); else /進(jìn)入右子樹查找 return find (BST-right,x); ,3、特點(diǎn): 與樹的深度有關(guān);,對(duì)于每一棵特定的二叉排序樹,均可按照平均 查找長度的定義來求它的ASL值,顯然,由值 相同的n個(gè)關(guān)鍵字構(gòu)造所得的,不同形態(tài)的各棵 二叉排序樹的平均查找長度的值不同,甚至可 能差別很大,例如: 由關(guān)鍵字序列1,2,3,4,5構(gòu)造而得的二叉 排序樹,ASL =(1+2+3+4+5)/ 5 = 3 由關(guān)鍵字序列3,1,2,5,4構(gòu)造而得的二叉 排序樹,ASL =(1+2+3+2+3)/ 5 = 2.2,一般情況下,考慮含有n個(gè)關(guān)鍵字可能出現(xiàn)的n!種 序列出現(xiàn)的可能性相等。 不失一般性,假設(shè)某個(gè)序列中有k個(gè)關(guān)鍵字小于第 一個(gè)關(guān)鍵字,即有n-k-1個(gè)關(guān)鍵字大于第一個(gè)關(guān)鍵 字,由它構(gòu)造的二叉排序樹的平均查找長度是n和 k的函數(shù): P(n, k) (0kn-1),則含n個(gè)關(guān)鍵字的二叉排序樹的平均查找長度:,而在等概率的情況下,,由此:,可類似于解差分方程,此遞歸方程有解:,從查找的角度看,希望由任意序列生成的二叉 排序樹,其左、右子樹的深度近似相等,但實(shí)際 上有47%的情況生成的二叉排序樹非如此。 那么,如何構(gòu)造高度比較低的二叉分類樹呢?,9.3 平衡二叉樹,一、平衡二叉樹的定義,1、定義:一棵分類二叉樹是平衡的,當(dāng)且僅當(dāng)每個(gè)結(jié)點(diǎn) 的左右子樹的高度至多相差為1 。由G.M.Adelson_Velskii 和E.M.Landis給出的定義AVL樹。,遞歸定義: ()空樹是二叉分類樹; ()它的左右子樹都是二叉分類樹,且左右子樹 的高度最多相差為;,、平衡因子: 左子樹的高度右子樹的高度,即 BF(t)=Hl-Hr 平衡二叉樹中,對(duì)任意結(jié)點(diǎn):BF=、 ,、平衡二叉樹的特點(diǎn): 其深度和log2n同數(shù)量級(jí),即樹的平均查找長度 為O(log2n);,4、AVL樹的構(gòu)造和調(diào)整過程:,()基本原則: 按照二叉分類樹的構(gòu)造方法,構(gòu)造過程中判斷是否 為平衡二叉樹(平衡因子),是,則繼續(xù)構(gòu)造;否則, 按一定的原則(保持是二叉分類和平衡)將其調(diào)整為平 衡,然后繼續(xù)。,()插入過程中的調(diào)整原則: 二叉分類樹在插入前平衡,插入一個(gè)結(jié)點(diǎn)后如果失去 平衡,則至少有一個(gè)結(jié)點(diǎn)的平衡因子變?yōu)榛颉?若平衡因子,則左分支高于右分支; 若平衡因子,則右分支高于左分支;,失去平衡的四種情況:,型:左分支的左子樹上插入,使之失去平衡因子 平衡因子;,特殊地:,型:右分支的右子樹上插入,使之失去平衡因子 平衡因子;,特殊地:,型:左分支的右子樹上插入,使之失去平衡因子 平衡因子;,特殊地:,L型:右分支的左子樹上插入,使之失去平衡因子 平衡因子;,特殊地:,略(參見教材236-238),5、算法:,6、舉例:有下列元素,構(gòu)造平衡二叉樹 13,24,37,90,53,13,24,37,RR型,24,13,37,13,24,37,90,53,90,53,RL型,24,13,37,53,90,53,37,90,9.3 平衡二叉樹,二、平衡二叉樹的查找,1、查找過程:同二叉分類樹一樣!,、效率分析: 查找過程中和給定值進(jìn)行比較的關(guān)鍵字的個(gè)數(shù)不 超過平衡樹的深度。 假設(shè)深度為h的二叉平衡樹上所含結(jié)點(diǎn)數(shù)的最小值 為Nh,則顯然 Nh = Nh-1 + Nh-2 + 1 由此可以推導(dǎo)出:hlog(n) 因此,在平衡樹上進(jìn)行查找的時(shí)間復(fù)雜度為O(log(n),9.4 哈希查找,一、哈希技術(shù)介紹,1、哈希技術(shù)的提出背景:,一般的線性表,樹中,記錄在結(jié)構(gòu)中的相對(duì)位置是隨機(jī)的,即和記錄的關(guān)鍵字之間不存在確定的關(guān)系,因此,在結(jié)構(gòu)中查找記錄時(shí)需進(jìn)行一系列和關(guān)鍵字的比較。這一類查找方法建立在“比較“的基礎(chǔ)上,查找的效率依賴于查找過程中所進(jìn)行的比較次數(shù)。,“哈希”是英文HASH的音譯,又翻譯作“散列”、 “雜湊”等。,那么,有沒有不用比較的查找方法?,9.4 哈希查找,理想的情況是能直接找到需要的記錄,因此必須在記錄的存儲(chǔ)位置和它的關(guān)鍵字之間建立一個(gè)確定的對(duì)應(yīng)關(guān)系f,使每個(gè)關(guān)鍵字和結(jié)構(gòu)中一個(gè)唯一的存儲(chǔ)位置相對(duì)應(yīng)。,因此,如果有一個(gè)函數(shù),它能夠根據(jù)要查找的關(guān)鍵字直接計(jì)算出要查找記錄的地址,該地址的內(nèi)容為空,則查找的元素不存在,否則,查找成功。顯然,這樣的查找不需要比較!,基于這種思想的技術(shù)就是HASH技術(shù);,9.4 哈希查找,哈希表最常見的例子是以學(xué)生學(xué)號(hào)為關(guān)鍵字的成績表,號(hào)學(xué)生的記錄位置在第一條, 2號(hào)學(xué)生的記錄位置在第二條, 號(hào)學(xué)生的記錄位置在第條.,如果我們以學(xué)生姓名為關(guān)鍵字,如何建立查找表,使得根據(jù)姓名可以直接找到相應(yīng)記錄呢?,其次,我們?nèi)⌒彰鱾€(gè)字的拼音字頭字母的編號(hào)和為該 記錄的存儲(chǔ)位置,例如吳軍,wj=33,存儲(chǔ)位置33; 吳曉燕,wxy=72,存儲(chǔ)位置為72;,首先,我們規(guī)定每個(gè)字母的編號(hào):,9.4 哈希查找,顯然存儲(chǔ)地址從378。如果76個(gè)學(xué)生的姓名的拼音字頭字母都互不相同,則我們可以按這種方式存儲(chǔ)這些學(xué)生的信息,而且很容易的查找一個(gè)學(xué)生的信息。,例如:要查吳曉燕的信息,則計(jì)算wxy=72,第72個(gè)位置存儲(chǔ)的就是該學(xué)生的信息。,如果我們有m個(gè)空間,n個(gè)數(shù)據(jù)元素,n=m,且每個(gè) 數(shù)據(jù)元素能按某種映射關(guān)系得到唯一的空間地址,則 我們很容易的實(shí)現(xiàn)查找!,但是,千萬不要忘了我們假設(shè)的前提: 互不相同!,例如,如果學(xué)生中還有一個(gè)學(xué)生姓名為王新云,wxy=72 怎么辦?,9.4 哈希查找,一、哈希技術(shù)介紹,2、什么情況下使用HASH技術(shù)?,如果問題的數(shù)據(jù)元素已知,很容易地建立數(shù)據(jù)元素 和存儲(chǔ)地址之間的一一映射函數(shù)關(guān)系,HASH技術(shù)是很 簡單的,HASH技術(shù)也就失去了意義,實(shí)際上HSAH技 術(shù)是針對(duì)下類問題的:,問題的數(shù)據(jù)元素的可用集合很大,而一個(gè)問題的 具體數(shù)據(jù)元素是取自該可用集合的一個(gè)很小的任意一 個(gè)集合,因此,解決問題時(shí)需要的空間大小是根據(jù)小 集合大小確定的,但是,如果要建立函數(shù)映射,函數(shù) 的定義域應(yīng)該是大集合,而值域是由小集合確定的, 因此建立這樣的一一映射是很困難的,所以才有了HASH 技術(shù)。,9.4 哈希查找,一、哈希技術(shù)介紹,3、HASH類問題的描述:,假設(shè)問題可能用到的關(guān)鍵字集合為U,|U|=n0,即該集合 的元素個(gè)數(shù)為n0,而一個(gè)問題實(shí)際用到的關(guān)鍵字集合為S, |S|=n,nn0,且S是取自U的任意一個(gè)子集合,表示 為R1,R2,R3,.Rn,其關(guān)鍵字集合為K1,K2,.,Kn; T是解決問題需要的連續(xù)空間,它由m個(gè)存儲(chǔ)單元組成, 表示為T0m-1,mn。,有一個(gè)函數(shù)H,其定義域是keyU,值域是i 0m-1, 它將關(guān)鍵字映射到存儲(chǔ)空間地址上; H(key)= i key U, i0m-1,9.4 哈希查找,一、哈希技術(shù)介紹,n,H,9.4 哈希查找,一、哈希技術(shù)介紹,4、有關(guān)基本概念:,(1)HASH函數(shù):將關(guān)鍵字映射到存儲(chǔ)空間地址的函數(shù), 記作:H(key),(2)HASH地址:由HSAH函數(shù)計(jì)算出的關(guān)鍵字地址;,(3)HASH表:存儲(chǔ)記錄的連續(xù)地址空間T;,(4)HASH造表:利用HASH函數(shù)將記錄存儲(chǔ)到HASH表 中的過程;,(5)HASH表的填充度(裝填因子): 表中填入的記錄數(shù) = HASH表的長度,9.4 哈希查找,一、哈希技術(shù)介紹,(6)沖突:由于HASH函數(shù)的定義域是U,而S是U的任 意一個(gè)小子集,映射地址空間是由S的大小 確定的,因此,對(duì)于不同的關(guān)鍵字可能得到 相同的HASH地址,即: 若 key1key2 , 而 H(key1)=H(key2),則稱為 沖突。,(7)同義詞: 若 H(key1)=H(key2),則key1和key2互稱 為同義詞。,5、HASH技術(shù)的關(guān)鍵:, HASH函數(shù)的構(gòu)造, 解決沖突的方法,9.4 哈希查找,一、哈希技術(shù)介紹,5、HASH問題舉例:,我們寫程序時(shí),可以用的標(biāo)識(shí)符是一個(gè)很大集合(U) 因?yàn)榉彩欠险Z言詞法定義的都是合法、可用的標(biāo) 識(shí)符,但是對(duì)于你寫的每一個(gè)程序,真正使用到的 標(biāo)識(shí)符卻是一個(gè)很小的子集(S),編譯程序存儲(chǔ)和 處理程序時(shí)只要能存儲(chǔ)和處理任意的小子集S即可, 但是,要注意S的特點(diǎn)!,例如:標(biāo)準(zhǔn)PASCAL的標(biāo)識(shí)符為字母開頭的8個(gè)長度的 字母數(shù)字串,則|U|=C(26,1)*C(36,1)*7=1.093881012,而 一個(gè)程序中可能出現(xiàn)的標(biāo)識(shí)符不會(huì)太多,1000足矣!即 |S|=1000。,9.4 哈希查找,二、哈希函數(shù)的構(gòu)造方法,1、直接定址法: H(key)=key 或 H(key)=a*key+b a,b為常數(shù),特點(diǎn): * 關(guān)鍵字必須是整數(shù); * 地址集合和關(guān)鍵字集合大小相同,沒有沖突; * 空間浪費(fèi)大;,2、數(shù)字分析法: H(key)=關(guān)鍵字的某進(jìn)制的若干位組成,特點(diǎn): * 要求關(guān)鍵字已知; * 取幾位,哪幾位的原則是盡量避免沖突, 均勻性好;,9.4 哈希查找,3、平方取中法: H(key)=關(guān)鍵字平方后的中間幾位,4、折疊法: H(key)=將關(guān)鍵字分割成位數(shù)相同的幾部分,然后取 這幾部分的疊加和(舍去進(jìn)位),特點(diǎn):這是一種較常用的方法。 * 關(guān)鍵字不一定全部知道; * 由于一個(gè)數(shù)平方后的中間幾位和數(shù)的每一位相關(guān), 均勻性較好,取的位數(shù)與表長有關(guān); * 乘和截取的代價(jià)較高;,特點(diǎn): * 關(guān)鍵字位數(shù)很多,而且關(guān)鍵字中每一位上數(shù)字 分布大致均勻時(shí),均勻性很好;,9.4 哈希查找,5、除留余法: H(key)= key MOD P P是不大于m的素?cái)?shù),m是 HASH表的長度;,6、隨機(jī)數(shù)法: H(key)= Random(key); Random位隨機(jī)函數(shù),特點(diǎn):這是一種最簡單、最常用的方法。 * P的選擇很重要,選擇不好會(huì)產(chǎn)生同義詞; * P一般取位素?cái)?shù)或不包含小于20的質(zhì)數(shù)的合數(shù);,HASH函數(shù)考慮的因素: (1)計(jì)算HASH函數(shù)的時(shí)間; (2)關(guān)鍵字的長度; (3)HASH表的長度; (4)關(guān)鍵字的分布情況; (5)記錄的查找頻率;,9.4 哈希查找,三、沖突的解決方法,1、開放定址法:(閉散列) 發(fā)生沖突后,按一定的原則尋找新的地址: Hi=(H(key)+di) MOD m i=1,2,.,k di為增量,m為HASH表的長度; di的取法: 線性探測:di=1,2,3,.,m-1 二次探測:di=12,-12,22,-22,.,k2,解決沖突的策略分為兩類: (1) 閉散列方法(Closed Hashing):同義詞放在HASH表 的其他位置;(Open addressing,又稱為開地址法) (2) 閉散列方法(Open Hashing):同義詞放在HASH表 之外的空間中;(Separate chaining,又稱為拉鏈法),9.4 哈希查找,三、沖突的解決方法,2、再造HASH法:(閉散列) Hi=RHi(key) 用一系列HASH函數(shù)計(jì)算地址,3、鏈地址法:(開散列) 將同義詞存放在同一個(gè)鏈 表中;,9.4 哈希查找,4、建立公共溢出區(qū)法: 除了HASH表外,開辟一個(gè)公共溢出區(qū),一旦沖突,將同義詞放入公共溢出區(qū);,HASH表:,溢出表:,9.4 哈希查找,四、哈希查找,1、哈希查找的方法,給定關(guān)鍵字 k : (1)用給定的HASH函數(shù)計(jì)算出k的HASH地址; i=H(key) (2)若該地址為空,則查找失??; 否則,若 Ti=k ,則查找成功,返回地址; 否則,按HASH造表時(shí)解決沖突時(shí)的 方法計(jì)算出新的地址; (3)重復(fù)(2)直到查找成功或失敗。,9.4 哈希查找,、哈希查找的算法,參見教材259頁,9.4 哈希查找,3、舉例:,已知有一組元素:19,14,23,01,6

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論