Chapter 10 搜尋(search).

Slides:



Advertisements
Similar presentations
办公室保健指南. 减少辐射篇 ❤显示器散发出的辐射多数不是来自它的正面,而是侧面和后面。因此,不要 把自己显示器的后面对着同事的后脑或者身体的侧面。 ❤常喝绿茶。茶叶中含有的茶多酚等活性物质,有助吸收放射性物质。 ❤尽量使用液晶显示器。
Advertisements

早自修課推動班級家長說故事及 經驗分享活動。 寒假親師生戶外參訪 ~ 原鄉文化、田園野趣學 習之旅 ~ 造訪鍾理和紀 念館、文學步道。親師生戶外參訪.
魏 饴. 处级干部培训班讲座 一、卓越干部的德行素质  常修为政之德、常思贪欲之害、常怀律己之心!  孔老夫子有个观点 “ 为政以德,譬如北辰居其所而众星拱之。 ”  司马光《资治通鉴》 “ 才者,德之资也;德者,才之帅也。 ” “ 德 ” 胜 “ 才 ” 谓之 “ 君子 ” , “ 才 ”
一、真愛密碼 二、尋求真愛 三、有自尊的愛. 。如果雙方對愛情產生 質疑、困惑時,則表示 彼此之間的愛情關係仍 有 待加強或釐清,千萬別 急著為自己的人生大事 下決定。 我是一個 16 歲的未婚媽媽,發現自 己懷孕時,已經五個月大了,我知 道自己沒能力照顧孩子,在驚訝之 於,大人們只好坦然接受,幫我找.
大地遊戲王 課程實錄.
旅 糾 紛 遊 與緊急事件處理 11 Chapter 旅遊費用.
基本概論 Basic concepts.
台北市立聯合醫院南軟門診部 皮膚科醫師簡介 溫素瑩醫師 學經歷: 中山醫學院醫學系畢業 台北醫學大學醫學資訊研究所碩士
加強水銀體溫計稽查管制及回收 回收作業須知及緊急應變措施
我征服了黃山 林達的黃山之旅 2006春.
少阳病和柴胡剂 郝万山(北京中医药大学).
第4章 分錄及日記簿 4-1 借貸法則 4-2 日記簿的格式及記錄方法 4-3 分錄的意義及記錄方法 4-4 常見分錄題型分析
说课课件 感悟工业革命力量,闪耀科技创新光辉 ----《走向整体的世界》教学设计及反思 爱迪生 西门子 卡尔·本茨 诺贝尔 学军中学 颜先辉.
資料結構 第9章 搜尋.
第 九 章 搜尋(Search) 課程名稱:資料結構 授課老師:_____________.
音乐中的数学之美 数学 张文博.
旅 糾 紛 遊 與緊急事件處理 16 Chapter 飯店問題.
请说出牛顿第一定律的内容。.
第十三屆 Step.1 我們的目標 Step.2 我們的角色 Step.4 權利與義務 義務 權利 年繳會費五百元整
301——隆重登场.
防制學生藥物濫用 高雄市教育局校外分會 林永興教官.
美国史 美利坚合众国创造了一个人类建国史的奇迹,在短短230年的时间从一个被英帝国奴役的殖民地到成为驾驭全世界的“超级大国”、“世界警察”,美国的探索为人类的发展提供了很宝贵的经验。
财务管理.
渤海商品交易所 丹东玉米交易中心 全国统一客服电话:
大家都来关注国家安全 南京市江宁中学 傅德柱.
第一章信託法 第一節 信託契約 第二節 信託財產 第三節 受益人 第四節 受託人 第五節 信託關係之消滅.
评价是为了促进 学生发展的评价。. 评价是为了促进 学生发展的评价。 语言有温度,字词知冷暖.
Performance Evaluation
植物保护 课程整体设计 汇报 申报省级精品资源共享课建设 植物保护课程组.
第五课 小设计师.
C语言实现俄罗斯方块 演示文稿.
政府扶持资金通览 技术改造篇.
2009年 初夏 某天 我 一個人 一輛車 計劃 沒有計劃 只想 漫無目的 到處亂晃 感覺夏天的散漫.
班級:夜師資一甲 指導老師:蘇國榮老師 姓名:929201林佑蓉 石依縈 李玉玫 桂秀媛
前不久看到了这样一则报道:某个大学校园里,一个大学生出寝室要给室友留一张字条,告诉他钥匙放在哪里。可是“钥匙”两个字他不会写,就问了其他寝室的同学,问了好几个,谁也不会写,没办法,只好用“KEY”来代替了。 请大家就此事发表一下自己看法。
長者日 每年 11月第三個星期日 表達對長者的敬意 宣傳關懷長者的訊息.
利用共同供應契約 辦理大量訂購流程說明.
Chapter 7 Search.
本科生医保资料的提交.
物件導向程式設計 (Object-Oriented rogramming)
Course 4 搜尋 Search.
第十章 排序與搜尋.
第 7 章 陣列 (Array).
第 1 章 演算法分析.
搜尋資料結構 Search Structures.
統計圖表的製作.
第12章 樹狀搜尋結構 (Search Trees)
Ch4.SQL Server 2005資料庫組成員元件介紹
樹 2 Michael Tsai 2013/3/26.
鄧姚文 資料結構 第一章:基本概念 鄧姚文
Week 2: 程式設計概念與 演算法的效能評估
《结构力学认知实验》(授课形式)的上课时间改为: 5月5日(周二)晚上18:00~19:30和19:30~21:00,
《结构力学认知实验》(授课形式)的上课时间改为: 5月7日(周四)晚上18:30~20:00和20:00~21:30,
Hash(雜湊) 授課者:李驕芸.
第8章 資料排序 資料結構設計與C++程式應用
飯店業的介紹.
Hashing Michael Tsai 2013/06/04.
畢業資格審查系統 操作步驟說明.
你没看到的开幕式 超越电视画面 来自现场的照片.
新制退休實務計算說明- 現職人員退休範例說明
兒童及少年保護、 家庭暴力及性侵害事件、 高風險家庭 宣導與通報
北一女中 資訊選手培訓營 遞迴、河內塔與merge sort Nan.
Hashing Michael Tsai 2017/4/25.
2009年 初夏 某天 我 一個人 一輛車 計劃 沒有計劃 只想 漫無目的 到處亂晃 感覺夏天的散漫 按鍵換頁--輕音樂欣賞.
106 學年度新生入學說明會 國立臺灣海洋大學 教務處簡介
學士學位畢業論文說明 逢 學 大 甲 土 理 管 地 2009/10/05.
高雄市97年度國民小學閱讀計畫創新教學-教案達人創新教學方案
本教學投影片係屬教科書著作之延伸,亦受著作權法之保護。
演講綱要 1. 簡介資料結構 2. Hashing (赫序) 模式 3. 如何存取小群的文字資料 4. 如何存取大群的文字資料
JAVA 程式設計與資料結構 第十七章 Tree.
Presentation transcript:

Chapter 10 搜尋(search)

何謂搜尋 從一些資料中找出一個特定的值 常用的資料搜尋方法 線性搜尋 二元搜尋 費氏搜尋 插補搜尋 雜湊搜尋 二元搜尋樹

線性搜尋可用在未經排序的資料搜尋 其他搜尋方法須先將資料排序完成才能進行搜尋工作

線性搜尋(Linear Search) 又稱循序式搜尋(Sequential Search) 從第一筆資料開始搜尋比對,如果找到則傳回該值或該位置,如果沒找到則往下一筆資料搜尋比對 例如,有一整數陣列的資料內容如下

如欲找出57,則: Step 1: 與陣列中第一筆資料比對,5713 Step 2: 與陣列中第一筆資料比對,5725

Best case時間複雜度為B(n)=1O(n),表示第一次就找到資料 Worst case時間複雜度為W(n)=nO(n),表示未找到資料或資料出現在最後一筆 Average case時間複雜度為A(n)=(1+2+…+n)/n=(n+1)/2O(n)

二元搜尋(Binary Search) 適用於已排序完成資料之搜尋 欲搜尋值(Key Value)先與該資料的中位數(middle)比較 假設資料的內容為Data[0]到Data[n],則middle = n / 2,左邊界left = 0,右邊界right = n,其原理可歸納如下

若key Value小於Data[middle] 表示Key Value出現在Data[middle]之前,故搜尋Data[0]到Data[middle-1]之間的資料,此時left=left,right=middle-1,middle=(left+right)/2 若Key Value大於Data[middle] 表示Key Value出現在Data[middle]之後,故搜尋Data[middle+1]到Data[n]之間的資料,此時left=middle+1,right=right,middle=(left+right)/2

重複執行上述三步驟直到left=right或是找到欲搜尋資料為止 例如,有一個整數陣列的資料內容如下 若Key Value等於Data[middle] 表示已搜尋到資料 重複執行上述三步驟直到left=right或是找到欲搜尋資料為止 例如,有一個整數陣列的資料內容如下

如欲找出25,此時left = 0,right = 11,middle = 11 / 2 = 5 ,Key Value = 25: Step 1: 25 < Data[5] = 37,left = 0,right = 4,middle = 2 Step 2: 25 > Data[3] = 12,left = 3,right = 4,middle = 3 Step 3: 25 = Data[3] = 25,表示找到資料

Best case時間複雜度為B(n)=1O(n),表示第一次即找到資料 Worst case時間複雜度為W(n)=log2n O(logn),表示未找到資料或資料出現在最後一次搜尋 Average case時間複雜度為O(logn)

費氏搜尋(Fibonacci Search) 二元搜尋法採用將資料範圍切半,運用到除法運算來減少搜尋範圍 費氏搜尋則利用加減運算來減少範圍 電腦處理加減運算的效率高於乘除運算,故費氏搜尋的效率會優於二元搜尋

費氏搜尋就是利用費氏數列來切割資料範圍的搜尋方法 費氏數列: 第1項為1,第2項為1 ,第3項之後的規則為「第n項為第n-1項和第n-2項的和」,亦即F1=1,F2=1,Fn=Fn-1+Fn-2 產生之費氏數列:1、1、2、3、5、8、13、21、34、55… 費氏搜尋就是利用費氏數列來切割資料範圍的搜尋方法

費氏搜尋樹 以費氏級數的特性建造的二元樹。 任一費氏樹的節點數加1等於費氏樹 分成根節點、左子樹及右子樹三部分 左子樹的節點數為F(n-1)-1 右子樹的節點數為F(n-2)-1 各子樹仍為n-1級和n-2級的費氏樹 父節點與子節點之差為一個費氏數

設有n筆已排序好之資料,每次搜尋時必須先找出其費氏樹的樹根和差值,原則如下 先計算費氏級數F(a),使得F(a)n+1,如上圖若資料有12筆,則F(a) 12+1=13, 故a=6 第一次搜尋費氏樹的樹根r,即r=F(a-1),s=F(a-2),t=F(a-3)

若搜尋值小於第F(a-1)筆資料的值 若搜尋值大於第F(a-1)筆資料的值

例如,有一個整數陣列的資料內容如下 若搜尋值等於第F(a-1)筆資料的值 重複直型上述三步驟直到找到欲搜尋資料或差值為0為止

如欲搜尋42,此時資料有12筆,F(k)-1=12,所以k=7 第一次搜尋樹根r=F(k-1)=F(6)=8,s=5,t=3 搜尋值42<r的鍵值49 若t=0,令r=0 若t0,令r=r-t=5,temp=s=5,s=t=3,t=temp-t=2,此時r的鍵值為38

搜尋值42>r的鍵值 搜尋值42<r的鍵值 搜尋值42=r的鍵值,搜尋成功 若s=1,令r=0 若s1,令r=r+t=7,s=s-t=1,t=t-s=1,此時r的鍵值等於47 搜尋值42<r的鍵值 t0,令r=r-t=6,temp=s=1,s=t=1,t=temp-t=0,此時r的鍵值等於42 搜尋值42=r的鍵值,搜尋成功

差補搜尋(Interpolation Search) 採用『各個擊破法』(Divide and Conquer)的方式來搜尋資料位置 與欲搜尋資料比對的不是資料的中間項,而是以內插法按照比例所選出的一項 假設資料分佈如圖所示

Low為資料範圍的左邊邊界(下限) ,High為資料範圍的右邊邊界(上限) ,KeyValue為欲搜尋值,Data[High]為右邊邊界資料值,Data[Low]為左邊邊界資料值,Middle為與搜尋值比對的資料位置

其公式為 首先先判斷算出來的Middle值是否小於Low,如果Middle小於Low,則令Middle等於Low;如果Middle大於High,則令Middle等於High

接著按下列規則運作 若搜尋值小於Data[Middle] 若搜尋值大於Data[Middle] 若左邊邊界Low小於右邊邊界High 表示資料在Data[Middle]之前,則須搜尋Data[Middle]之前的資料,High設為Middle-1 若搜尋值大於Data[Middle] 表示資料在Data[Middle]之後,則須搜尋Data[Middle]之後的資料,Low設為Middle+1 若左邊邊界Low小於右邊邊界High 表示未完成搜尋,重新計算Middle值;否則,Middle=Low

重複直型上述步驟直到找到欲搜尋資料或Low直大於High值為止 若Middle小於左邊邊界Low Middle=Low 若Middle大於右邊邊界High Middle=High 重複直型上述步驟直到找到欲搜尋資料或Low直大於High值為止

例如,有一個整數陣列的資料內容如下 現在想找出9,此時資料有12筆,Low=0,High=11,KeyValue=9,Data[Low]=1,Data[High]=33

Step 1: KeyValue=9>Data[Middle]=Data[2]=6 表示資料在Middle之後 所以Low=Middle+1=3

Step 2: KeyValue=9>Data[Middle]=Data[3]=7 表示資料在Middle之後 所以Low=Middle+1=4

如果想找出20,此時資料有12筆,Low=0,High=11,KeyValue=20,Data[Low]=1,Data[High]=33 Step 3: KeyValue=9=Data[Middle]=Data[4]=9 找到資料 如果想找出20,此時資料有12筆,Low=0,High=11,KeyValue=20,Data[Low]=1,Data[High]=33

Step 1: KeyValue=20>Data[Middle]=Data[6]=15 表示資料在Middle之後 所以Low=Middle+1=7

Step 2: KeyValue=20>Data[Middle]=Data[7]=18 表示資料在Middle之後 所以Low=Middle+1=8 此時Middle<Low,所以Middle=Low=8

Step 3: KeyValue=20<Data[Middle]=Data[8]=27 表示資料在Middle之前 所以High=Middle-1=7 因為此時High<Low,表示未能找到資料

插補搜尋法對於平均分佈的資料,其效率很高,其時間複雜度為O(log2log2n),比二元搜尋法好 對於分佈不平均的資料,其效率卻不好,worst case的時間複雜度為O(n)

加強型插補搜尋法 改良後的插補搜尋法,是取三數中的中間數做為Middle值

雜湊搜尋(Hash Search) 欲加速搜尋速度,減少資料比較次數是唯一方法 雜湊搜尋可將資料比較次數減少到每次搜尋只須一次 雜湊表中資料儲存位置是透過特定雜湊函數運算而來 進行雜湊搜尋時,只需將資料再透過雜湊函數的計算後,即可找到欲搜尋資料

在雜湊結構中,我們稱輸入資料的值為鍵值(Key) 例如,利用雜湊表儲存學生資料,其中學生的學號即為雜湊表的鍵值,運作過程大致如下

雜湊函數 直接法(Direct Method) 每一個鍵值對應一個儲存空間,而不經過任何數學運算動作 例如,公司有100個員工,員工編號介於1到100 ,直接法就是員工編號即為資料位置 直接法適用於鍵值較小的資料 例如,以身分證字號為鍵值,需要260億個儲存空間

雜湊法大部分是用在將數值範圍較大的鍵值,對映於少數的儲存空間,以加快搜尋速度,減少儲存空間的浪費

減去法(Subtraction Method) 資料鍵值減去一個特定的數值,以求得資料儲存的位置 例如,公司有100個員工,員工編號介於1001到1100 ,減去法就是員工編號減去1000即為資料儲存位置

餘數法(Modulo-Division Method) 將資料的鍵值除以陣列大小後,取其餘數做為資料儲存的位置 例如,公司有236個員工,而員工編號介於1000到9999 ,餘數法就是將員工編號除以資料個數減去236後,取餘數即為資料位置

數值抽出法(Digit-Extraction Method) 將資料的鍵值中的某幾位數取出後做為資料儲存的位置 例如,資料鍵值為一組六位數的號碼,假設以鍵值的第一位、第二位、第五位數做為資料位置的索引值

中間平方法(Midsquare Method) 將資料鍵值中的前幾位數取出後平方產生一新數值,再從新數值中取出中間某幾位數做為資料儲存位置 325483  325*325=105625  056 213457  213*213=045369  453 645875  645*645=427716  277 215875  215*215=046225  462

摺疊法(Folding Method) 將資料的鍵值分為多層,然後相加取其結果為資料儲存位置 移位摺疊法(Fold Shift) 各層資料直接相加,取其結果;例如鍵值為123456789 ,則

邊界摺疊法(Fold Boundary) 各層資料在相加之前,每隔一部分進行一次反轉,相加後取其結果;例如鍵值123456789 321 (反轉) 456 + 987 (反轉) ━━━━━━ 1764

旋轉法(Rotation Method) 將資料的鍵值進行旋轉,通常不直接做為雜湊函數,而是配合其他雜湊函數使用

偽亂數法(Pseudo-random Method) 將資料鍵值經由偽亂數法運算後的結果做為資料儲存位置 如鍵值為321547,陣列大小為107 ,取a=13、c=5 ,則

Y = (13 * 321547 + 5) % 107 = (4180111 + 5) % 107 = 4180116 % 107 = 54 取54做為資料儲存位置

雜湊碰撞解決法 利用雜湊函數產生資料位置時可能會發生資料位置已有一筆資料的情形,稱為雜湊碰撞(Hash Collision) 發生雜湊碰撞時,必須提供解決方法,讓資料有對映儲存位置,否則將造成資料流失或錯誤

線性開放定址法(Linear Open Addressing) 線性探索法(Linear Probe) 往下一筆資料位置尋找可用空間儲存資料 假設現有資料如下:654、638、214、357、376、854、652、392,採用數值抽出法,取出第二位,並將資料放入大小為10的雜湊表中

插入資料654,位置為5 插入資料638,位置為3

插入資料214,位置為1 插入資料357,位置為5,發生碰撞忘下一筆資料儲存空間尋找可用空間,位置為6

插入376,位置為7 插入854,位置為5,發生雜湊碰撞,往下一筆資料位置尋找可用空間,位置為8

插入資料662,位置為6,發生雜湊碰撞,往下一筆資料位置尋找可用空間,位置為9 插入資料392,位置為9,發生雜湊碰撞,往下一筆資料位置尋找可用空間,位置為0

二次方探索法(Quadratic Probe) 以現在的資料位址加上碰撞次數的平方數,當資料位址超出陣列大小時,則讓資料位址採循環方式處理(新資料位址對陣列大小取餘數) 假設第一次發生雜湊碰撞的位置在1,陣列大小為80,其運作方式如下

探索次數 雜湊碰撞位置 位置增加值 新資料位置 1 12=1 (1 + 1) % 80 = 2 2 22=4 (2 + 4) % 80 = 6 3 6 32=9 (6 + 9) % 80 = 15 4 15 42=16 (15 + 16) % 80 = 31 5 31 52=25 (31 + 25) % 80 = 56 56 62=36 (56 + 36) % 80 = 12 7 12 72=49 (12 + 49) % 80 = 61 8 61 82=64 (61 + 36) % 80 = 17

差值解決法(Offset Resolution) 以現在的資料位址加上一固定差值,當資料位址超出陣列大小時,讓位址以循環方式處理 假設現有資料如下:23、57、65、63、67、33,現採用餘數法,將資料放入大小為10的雜湊表,令差值為3

插入資料23,23%10=3,位置為3 插入資料57,57%10=7,位置為7

插入資料65,65%10=5,位置為5 插入63,位置為3,發生碰撞,新資料位置為3+3=6

插入67,位置為7,發生碰撞,新資料位置為7+3=1010%10=0 插入33,位置為3,發生碰撞,新資料位置為3+3=6,再發生碰撞,新位置為6+3=9

鏈結串列解決法 (Linked List Resolution) 以現在的資料位置再串連一個新的鏈結串列來儲存資料

分桶雜湊法(Bucket Hashing) 將資料分為幾大類,稱之為「桶」,每個大類可放置相同大類的資料多筆 經雜湊函數運算後屬同一大類的資料,即放在同一大類中,直到這一大類的資料全填滿才往下一大類儲存 Bucket的結構,可用多維陣列來製作

資料位置 分桶編號 資料編號 資料內容 Data[0] Bucket 0 880335 Alan Data[1] Bucket 1 871054 Jeff 881564 Kevin 831572 Poe Data[2] Bucket 2 872087 Peter 841098 Bob …… Data[9] Bucket 9 849035 Ketty

二元搜尋樹 二元搜尋樹的規則為左子節點的值小於或等於其父節點的值,而右子節點的值大於其父節點的值 基於二元搜尋樹的規則,欲搜尋某個數值時,只要先比較其根部父節點,如果搜尋值小於父節點值則往左子樹搜尋;反之則往右子樹搜尋