- 1、本文档共55页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
10-4杂凑搜寻法
第10章 資料搜尋(Searching) 10-1 搜尋的基礎 10-2 循序搜尋法 – 未排序資料 10-3 已排序資料的搜尋法 10-4 雜湊搜尋法 10-5 雜湊函數的碰撞問題 10-1 搜尋的基礎-說明 「搜尋」(Searching)是在資料中找尋特定的值,這個值稱為「鍵值」(Key)。例如:在電話簿以姓名找尋朋友電話號碼,姓名就是鍵值,或在書局以書號的鍵值找尋喜愛的書。 搜尋的目的是為了確定資料中是否存在與鍵值相同的資料。 10-1 搜尋的基礎-範例 搜尋的目的是為了確定資料中是否存在與鍵值相同的資料。例如:學生連絡資料的記錄,如下圖所示: 在上述記錄欄位的【學號】是鍵值,例如:搜尋學號為S003的學生,經搜尋找到學生郭富成,因為有此鍵值的學號,接著就可以找到學生姓名和電話號碼,然後與學生連絡。 10-1 搜尋的基礎-種類 資料搜尋方法依照搜尋資料可以分成兩種,如下所示: 沒有排序的資料:針對沒有排序的資料執行搜尋,需要從資料的第1個元素開始比較,從頭到尾以確認資料是否存在,例如:線性搜尋法。 已經排序的資料:搜尋不需要從頭開始一個個比較。例如:在電話簿找電話,相信沒有人是從電話簿的第一頁開始找,而是直接從姓名出現的頁數開始找,這是因為電話簿已經依照姓名排序好。例如:二元搜尋法和插補搜尋法。 10-2 循序搜尋法 – 未排序資料(說明) 「循序搜尋法」(Sequential Search)是從循序結構的第1個元素開始走訪整個結構,以陣列來說,就是陣列走訪,從頭開始一個一個比較元素是否是搜尋值,因為需要走訪整個陣列,陣列資料是否已經排序就沒有什麼關係。 10-2 循序搜尋法 – 未排序資料(範例) 例如:在整數陣列data[]搜尋整數90的鍵值,程式需要從陣列索引值0開始比較,在經過索引值1、2和3後,才在索引值4找到整數90,一共比較5次。 同理,如果搜尋整數4的鍵值,需要從索引值0一直找到10,才能夠確定鍵值是否存在,結果比較11次發現鍵值4不存在。 10-2 循序搜尋法 – 未排序資料(執行效率) 如果元素個數為n,循序搜尋法的執行效率是與元素個數成正比的O(n)。 10-3 已排序資料的搜尋法 10-3-1 二元搜尋法 10-3-2 插補搜尋法 10-3-1 二元搜尋法-說明 「二元搜尋法」(Binary Search)是一種分割資料的搜尋方法,搜尋資料需要是已經排序好的資料。 二元搜尋法的操作是先檢查排序資料的中間元素,如果與鍵值相等就是找到,如果小於鍵值,表示資料位在前半段,否則位在後半段。然後繼續分割成二段資料重覆上述操作,直到找到或已經沒有資料可以分割為止。 10-3-1 二元搜尋法-方法 例如:陣列的上下範圍分別是low和high,中間元素的索引值是(low + high)/2。在執行二元搜尋時的比較,可以分成三種情況,如下所示: 搜尋鍵值小於陣列的中間元素:鍵值在資料陣列的前半部。 搜尋鍵值大於陣列的中間元素:鍵值在資料陣列的後半部。 搜尋鍵值等於陣列的中間元素:找到搜尋的鍵值。 10-3-1 二元搜尋法-過程1 在已經排序好的整數陣列data[]找尋整數81的鍵值,第一步和陣列中間元素索引值(0+10)/2 = 5的值33比較,因為81大於33,所以搜尋陣列的後半段,如下圖所示: 10-3-1 二元搜尋法-過程2 搜尋範圍已經縮小剩下後半段,中間元素索引值(6+10)/2 = 8,其值為74。因為81仍然大於74,所以繼續搜尋後半段,如下圖所示: 再度計算中間元素索引值(9+10)/2 = 9,找到搜尋值81。 10-3-1 二元搜尋法-搜尋過程 整個二元搜尋過程可以使用陣列索引值繪出執行過程的二元搜尋樹,節點內容為陣列索引值,如下圖所示: 10-3-1 二元搜尋法-執行效率 二元搜尋法的平均和最差的執行效率很容易算出,因為每次都分為二半,其執行效率為O(Log n)。 10-3-2 插補搜尋法-說明 循序和二元搜尋法都不是在電話簿或百科全書查閱資料的方法,因為我們通常是依照姓名或分類直接翻至相關章節或頁碼的前後,然後才決定是從前端、中間或後端開始搜尋,這種搜尋法稱為「插補搜尋法」(Interpolation Search)。 10-3-2 插補搜尋法-原理 插補搜尋法以資料分佈情況計算出可能位置的索引值,來縮小搜尋的範圍,而不像二元搜尋法固定分割一半來縮小範圍。例如:一個直角三角形,如下圖所示: 10-3-2 插補搜尋法-索引公式 將圖形標上座標,並且假設三角形是一個分佈平均的資料,我們可以推導出插補搜尋法計算可能位置的索引值公式,如下圖所示: 10-3-2 插補搜尋法-執行效率 插補搜尋法的執行效率是: O(Log(Log n))。 10-4 雜湊搜尋法 10-4-1
文档评论(0)