資料結構與演算法 課程教學投影片.

Slides:



Advertisements
Similar presentations
A A A.
Advertisements

张 玉 凤 一个值得同情和尊敬的人 资料图片来自网络 编制:dmn.
Chapter 10 搜尋(search).
政府採購法規概要 報告人:杜國正 行政院公共工程委員會企劃處.
Introduction 基本概念 授課老師:蕭志明
小班早期阅读讲座.
資料結構 第9章 搜尋.
第 九 章 搜尋(Search) 課程名稱:資料結構 授課老師:_____________.
算法设计与分析 李清勇 教授 办公室:第九教学楼北201.
天府欧城“星光儿童乐园” ---项目计划书 此为机密文件。 天府欧城.
之 魔 析 妖 鬼 解 怪 大 沈家仪小组出品.
主讲:计算机工程学院 李兰 答疑地点:主教学楼B区213
“风神初振”的初唐诗 俞冰沁.
AI人工智慧報告 黑白棋 班級:資工四乙 學號:498G0009 姓名:盧冠妤.
评价是为了促进 学生发展的评价。. 评价是为了促进 学生发展的评价。 语言有温度,字词知冷暖.
Performance Evaluation
第十九课 南吕•一枝花 不 伏 老 关汉卿.
第九章 长期资产及摊销 2017/3/21.
9.1 概述 9.2 插入排序 9.3 交换排序 9.4 选择排序 9.5 归并排序 9.6 基数排序 9.7 各种内部排序的比较
第八章 查找.
孔东梅 资料来自网络 PPT制作dmn.
第8章 查找 数据结构(C++描述).
第8章 字串與陣列 8-1 字串處理 8-2 一維陣列的處理 8-3 建立多維陣列 8-4 不規則陣列與參數傳遞 8-5 陣列排序與搜尋.
前不久看到了这样一则报道:某个大学校园里,一个大学生出寝室要给室友留一张字条,告诉他钥匙放在哪里。可是“钥匙”两个字他不会写,就问了其他寝室的同学,问了好几个,谁也不会写,没办法,只好用“KEY”来代替了。 请大家就此事发表一下自己看法。
糖尿病肾病的护理 陈佳莉.
利用共同供應契約 辦理大量訂購流程說明.
高级语言程序设计 主讲人:陈玉华.
第11章 查找 主要知识点 查找的基本概念 静态查找表 动态查找表 哈希表.
东北林业大学 陈宇 ACM程序设计 东北林业大学 陈宇
Course 4 搜尋 Search.
第9章 排序.
第十章 排序與搜尋.
第 1 章 演算法分析.
搜尋資料結構 Search Structures.
第七章 搜索结构 静态搜索结构 二叉搜索树 AVL树.
習作2-1 題目+解答 紐約港 紐約中央公園 格陵蘭島.
第12章 樹狀搜尋結構 (Search Trees)
程序设计期末复习 黎金宁
第九章 查找 2018/12/9.
数据结构 -Maple Related- 牟克典 数学科学学院信息科学系 2012秋季 1/16/2019.
第9章 内部排序 9.1 概述 9.2 插入排序 9.3 快速排序 9.4 选择排序 9.5 归并排序 9.6 基数排序
第二部分 免疫系统与免疫活性分子 第二章 免疫系统 第三章 免疫球蛋白 第二 部分 第五章 细胞因子 第四章 补体系统.
第九章 查找表 9.1静态查找表 9.2动态查找表 9.3哈希表及其查找.
数据结构 Data Structure CSU 主讲人:王国军,郑瑾 中南大学信息院计科系
第九章 查找 2019/2/16.
数据结构与数据库 习题课(2) 2016年11月25日.
数据结构 第八章 查找.
書名 Java於資料結構與演算法之實習應用
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
國立豐原高級中學 104學年度家長代表大會 主持人:張健家會長 時間:104年10月3日(星期六)上午10時0分 地點:行政樓二樓會議室.
试乘试驾团购执行方案(模板) 单 位:经销商名称 时 间:
鄧姚文 資料結構 第一章:基本概念 鄧姚文
鄧姚文 資料結構 第五章:遞迴 鄧姚文
資料結構與C++程式設計進階 排序與搜尋 講師:林業峻 CSIE, NTU 6/ 14, 2010.
计算机算法基础 周中成 苏州科技学院应用数学系 2019/4/18.
Chap7 Recursive.
第一单元:分数乘法 分数乘小数 浙江省诸暨市直埠镇第五完小 章麒鹤.
9.1 基本概念 9.2 线性表的查找 9.3 树表的查找 9.4 哈希表的查找 9.5 各种查找方法的比较
Lucene 算法介绍 IR-Lab 胡晓光.
Ch.9 查找 §9.1 基本概念 查找和排序是两个重要的运算
演算法時間複雜度 (The Complexity of Algorithms)
算法导论第一次习题课.
二分查找的应用 ——李江贝, 郝琰 2017年9月28日.
兒童及少年保護、 家庭暴力及性侵害事件、 高風險家庭 宣導與通報
复杂度和测试数据 吴章昊.
顺序查找与二分查找复习.
顺序查找与二分查找复习.
05 债务重组.
習作2-1 題目+解答 紐約港 紐約中央公園 格陵蘭島.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
Presentation transcript:

資料結構與演算法 課程教學投影片

第五章–搜尋演算法 本章各段大綱 5-1 搜尋演算法概觀 5-2 線性搜尋法 5-3 二元搜尋法 5-4 插補搜尋法

5-1 搜尋演算法概觀 搜尋(search)是指在資料序列中找尋符合特定條件的資料 篩選功能只是搜尋方法的延伸 作搜尋時,主要是以要搜尋的資料(稱為鍵值[key value])與資料序列中的資料作比較 搜尋根據運作過程中資料的儲存方式分類 內部搜尋:如果要搜尋的資料可以全部載入記憶體中後再進行搜尋稱為「內部搜尋」 外部搜尋:如果搜尋的資料量太大,無法全部載入記憶體中,必須藉助儲存設備(例如硬碟或磁帶)的空間再進行搜尋,稱為「外部搜尋」

5-1 搜尋演算法概觀 分類名稱 方法 線性搜尋法(Linear Search) 資料不用先排序,依指定次序逐一比較。 二元搜尋法(Binary Search) 資料一定要先排序好,利用二分法方法,每次搜尋資料範圍的中間位置比較,且調整要搜尋的資料範圍。 插補搜尋法(Interpolation Search) 資料一定要先排序好,利用內插法,每次找到更適合的位置比較,且調整要搜尋的資料範圍。插補搜尋法是改進二元搜尋法每次找中間點的缺點,可更快速完成搜尋。 雜湊搜尋法 (Hasing Search) 先將原資料利用雜湊函數建立雜湊表,將要搜尋的資料用同樣雜湊函數運算出位址值,比較此位址的值是否為要搜尋的資料(進一步還需處理碰撞和溢位問題)。 費氏搜尋法(Fibonacci Search) 利用費氏搜尋二元樹的特性,依樹的走訪順序來搜尋資料。

5-1 搜尋演算法概觀 搜尋法 平均時間 線性搜尋法 O(n) 二元搜尋法 O(log n) 插補搜尋法 雜湊搜尋法 O(1) 費伯那西搜尋法

5-2 線性搜尋法 線性搜尋法(Linear Search,或稱循序搜尋法)是最簡單的搜尋方法 想法: 最佳時間是O(1) 利用線性掃瞄方式(一個資料以一定的順序接著一個資料的方式)掃瞄一定範圍的資料,逐一比較。 如果要搜尋的資料與比較資料di相同時,則搜尋程序結束,否則取下一個di+1值,繼續比較。 最佳時間是O(1) 平均時間是O(n) 最差時間是O(n)

5-2 線性搜尋法-操作步驟

5-2 線性搜尋法-演算法 01 02 03 04 05 06 07 08 09 10 11 12 /* 演算法名稱:線性搜尋法 */ /* 輸入:整數陣列資料,要搜尋的鍵值 */ /* 輸出:整數陣列資料中搜尋鍵值的位置 */   int linear_search(int A[],int n,int key) { int i=0; while (i<=n-1) if (A[i]==key) return i; /* 搜尋成功 */ else i++; return -1; /* 搜尋失敗 */ }

5-2 線性搜尋法-演算法 複雜度 最佳狀況: 一次就找到, 複雜度 O(1) 最差狀況: 找遍所有資料, 比較n 次, 複雜度 O(n) 範例:5_2.cpp 資料存於A陣列,尋找的資料 key=77 A[20]={1,21,0,47,60,15,84,65,77,88,99,93,8,17,36,5,24,63,72,20}

5-3 二元搜尋法 二元搜尋法要搜尋的資料必須先排序過 想法: 假設有n筆資料以陣列A存放,且資料已由小到大排序好了,要搜尋資料的範圍其下界註標是low,上界註標是upper,key是我們要找的資料,可以先由資料的中間位置mid開始搜尋。 key和A[mid]比較有三種情況: 如果key=A[mid],則搜尋成功,傳回mid。 如果key>A[mid],代表有可能找到的資料位於mid+1和upper之間。 如果key<A[mid],代表有可能找到的資料位於low和mid-1之間。 如果不是上述(a)的情況,只要調整要搜尋資料的範圍,即情況(b)的low=mid+1,upper不變;情況(c)的upper=mid-1,low不變。如果upper<low時,代表資料已搜尋完畢,且搜尋失敗;否則再計算出mid位置,再回到步驟2繼續搜尋。

5-3 二元搜尋法 x key<x key>x x x 0 1 . . . mid n-1 x key<x key>x (課本有錯) 0 1 . . . mid n-1 0 1 . . . mid n-1 x x 此段才有可能 此段才有可能 平均時間是O(log n) ,最佳時間是O(1),最差時間是O(log n) 1024筆資料只要比10次即可決定是否搜尋成功 n=1024=210,log2 n = log2 210 = 10

5-3 二元搜尋法-操作步驟

5-3 二元搜尋法 -演算法及程式 假設陣列A已存放由小到大的資料。資料量n筆,則起始upper=n-1,low=0,mid=(low+upper)/2=n/2,要搜尋的資料為key。 key和A[mid]比較有三種狀況: 如果key=A[mid] ,則搜尋成功,傳回mid。 如果key>A[mid] ,low=mid+1。 如果key<A[mid] ,upper=mid-1。 如果low<upper,則回步驟2繼續;否則搜尋失敗。 步驟2及3可以設計一個不定迴圈while來檢查。

5-3 二元搜尋法-演算法 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 /* 演算法名稱:二元搜尋法 */ /* 輸入:整數陣列資料,要搜尋的鍵值 */ /* 輸出:整數陣列資料中搜尋鍵值的位置 */   int binary_search(int *A,int key,int low,int upper) { int mid=0; while(low<upper) mid=(int)((low+upper)/2); if(key==A[mid]) return mid; /* 搜尋成功 */ else if(key>A[mid]) low=mid+1; else upper=mid-1; } return -1; /* 搜尋失敗 */

5-3 二元搜尋法- 複雜度 n筆資料的搜尋時間 最佳狀況: 一次成功,複雜度O(1) 最差狀況: While迴圈皆執行過,直至最後一次,共需O(log n) ,推演如下: 第1次: n=1024時,n/2=512=29 第2次: n=512時,n/2=256=28 ... 第9次: n=4時,n/2=2=21 第10次: n=2時,n/2=1=20 所以當n=2k時,最多要搜尋k次,k=log n 範例 5-3.cpp

5-4 插補搜尋法 類似二分搜尋法 將已排序好的資料以內插法找出更合適的搜尋範圍 改進二分搜尋法的另一種搜尋方法 複雜度 最佳時間是O(1) 平均時間是O(log n) 最差時間是O(log n) 適用情況: 資料分佈均勻時,搜尋速度極快

5-4 插補搜尋法-理論 (A數列) 10,15,21,26,31,37,43,49,54 (B數列) 10,11,13,25,31,32,34,36,38,40 (A)數列兩兩差距為5或6,即很接近,近似均勻分佈 (B)數列兩差距有1,2,6,12,資料集中在31~40範圍,為不均勻分佈。 均勻分佈的資料有一個等差的特性,即用除法的比率來看 以數列(A)為例:  (d2-d1)≈(d3-d2) ≈ (d4-d3) ≈………≈(d9-d8)=k  則d9-d1≈(d9-d8)+(d8-d7)+………+(d2-d1) ≈(9-1)*(d2-d1)  所以d2-d1≈(d9-d1)/(9-1)---------(1) d1 d2 d3 . d8 d9

5-4 插補搜尋法-理論 所以di-d1≈(di-di-1)+(di-1-di-2)+………+(d2-d1)=(x-1)(d2-d1) di-d1=(d9-d1)/(9-1)*(i-1)或者 di=d1+(d9-d1)/(9-1)*(i-1) 其中(di-d1)/(d9-d1) ≈(i-1)/(9-1)即為內差公式,假如符合內插特性的資料,可以由起始點(如d1)和終止點(如d9)來求得其中di的值,且約為下列公式 di≈d1+(dn-d1)/(n-1)*(i-1)---------(3) d1 d2 d3 . di d8 d9

5-4 插補搜尋法-理論 di≈d1+(dn-d1)/(n-1)*(i-1)---------(3) 插補搜尋法即假設di是我們要搜尋的值,約符合上述式子(3),而反過來i的值以式子(3)調整如下: i=1+(di-d1)/(dn-d1)*(n-1)---------(4) 如果不是以d1和dn作內插法,而是dm和dn作內插法,同樣可得: i=m+(di-dm)/(dn-dm)*(n-m)---------(5) 設定搜尋控制變數為upper,low和mid分別代表搜尋範圍的上界註標,下界註標和要搜尋的註標,x表示要搜尋的值。 例如下述A陣列的值,low=0,upper=8,代入上式, 得第一次要搜尋的位置mid=0+[(21-10)*(8-0)]/(54-10)=88/44=2 A[2]即等於21,一次即搜尋成功,但注意這是資料分佈的很均勻,才會有這麼好的效果,但只要資料有點均勻,也是可得到比二分搜尋法好的效果。 d1 d2 dn . di dm d9

5-4 插補搜尋法-理論 由步驟推演得知 mid=low+(x-A[low])*(upper-low)/(A[upper]-A[low]) 其中upper,lower是目前要搜尋範圍的上界和下界註標,A[low],A[upper]是資料值,x是欲搜尋的資料,mid則是建議你搜尋的位置。 決定mid位置時,用A[mid]和x比較,有下列三種情況: A[mid]=x,搜尋成功 A[mid]>x:表示欲搜尋的x必定在mid位置之前,所以調整上界範圍為mid-1,即upper=mid-1。 A[mid]<x:表示欲搜尋的x必定在mid位置之後,所以調整下界範圍為mid+1,即low=mid+1。

5-4 插補搜尋法-演算法 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /* 演算法名稱:插補搜尋演算法 */ /* 輸入:整數陣列資料,要搜尋的鍵值 */ /* 輸出:整數陣列資料中搜尋鍵值的位置 */   int search(int x) { int low=o,upper=max-1,mid; /*max是陣列宣稱的維數*/ mid=low+(x=A[low])*(upper-low)/(A[upper]-A[low]); if(mid<low) mid=low; in(mid>upper) mid=upper; while(low<=upper) if(x=A[mid]) return 1; /*搜尋成功*/ else if(x<A[mid]) upper=mid-1; else if(x>A[mid]) low=mid+1; if(low<upper) mid=low+(x-A[low])*(upper-low)/(A[upper]-A[low]) if(mid>upper) } return 0; /*搜尋失敗*/

5-4 插補搜尋法-範例 範例: 5_4.cpp 利用差補搜尋法,對下列資料搜尋50 low=0,upper=9 由mid=low+(x-A[low])*(upper-low)/(A[upper]-A[low]) 得知mid=0+(50-1)*(9-0)/(100-1)=40*9/99 ≒ 4 所以mid=4,A[4]=38/50 所以low=mid+1=4+1=5 low=5,upper=9 所以mid=5+(50-44)*(9-5)/(100-44)=5+6*4/54 ≒ 5 比較A[5]=44<50 所以low=mid+1=6 (3) low=6,upper=9 所以mid=6+(50-46)*(9-6)/(100-46) ≒6 比較A[6]=46<50 所以low=mid+1=6+1=7 (7) low=7,upper=9 所以mid=7+(50-50)*(9-7)/(100-50) ≒7 比較A[7]=50, 所以搜尋成功, 序列A中,A[7]=50 1 2 3 4 5 6 7 8 9 15 27 38 44 46 50 58 100 範例: 5_4.cpp