典型查找算法PPT课件
合集下载
高中信息技术浙教版:数据查找教学课件(共19张PPT)
⑤如果中值不是查找键,则判定下一个查找范围应该在左 半部分还是在右半部分。注意i和j的控制。
if f==True:
⑥输出查找结果:f=True,mid中存储的即为查找键
print("查找成功!下标为"+str(mid)) Key在数组 d中的位置,f=False表示查找键key在数
else:
组d中不存在。
对分查找——算法演示
d[3] 4 d[4] 5 d[5] 6
第3次查找:
范围为__d_[_3_]_~_d[_5_]_,i=____3____,
←i ←mid
j=__5___,mid=____(_3+_5_)_/_/_2_=4。 d[mid]=__d_[_4_]_=5____。
←j d[mid]_=_=___key=5?
←i 第2次查找: 范围为__d_[_0_]_~_d[_5_]_,i=_____0___,
←mid j=__5___,mid=____(_0+_5_)_/_/_2_=2。 d[mid]=__d_[_2_]_=_3___。
←j d[mid]_<____key=5?
:后续查找的范围应该是 _______d_[_3_]_~_d[_5_]_。
查找成功,结束查找。
对分查找——流程图描述
开始
i=0,j=12
i<=j Y
mid =(i+j)//2
Y
d[mid]=key?
N
N
查找成功
Y
d[mid]<ke y?
N
i=mid+1
j=mid-1
结束
查找失败
对分查找——程序实现
key=int(input());f=False;i=0 #所有数据(升序)存储在数组d中
查找算法课件
查找算法
顺序查找 对分查找
查找算法
查找是一种查询数据的技术,其目标是能 以比较少的步聚和较短的时间找到所需的 对象。
顺序查找的基本思想 是从第一个数据开始,按数据的顺序逐
个将数据与给定的值进行比较。若某个数 据和给定的值相等,则查找成功,找到所 查数据的位置;反之,查找不成功。
顺序查找
从数组d的第1个元素d(1) 开始,依次判断各元素的
Else
序
i=m+1
End If
else
Print m
Exit Do
End If
Loop
If i>j Then Print “0”
练习题
1、数据320,340,347,349,362,382,423,454 ,使用对分查找,设定查找键key,若第一个 被访问到的数据是349,小于key值,则第二 个被访问到的数据是 ( )
16
下标 元素
下标 元素
I1=1
1
2
2
3
第1次3 比第较2次:比较第:3次比较:
4
Key4>dK(mey)<d(mK)ey=d(m)
5
查找5范查围找应范该围找应到该了!
6
变成6d(变9)成~dd(1(96))~d(11)
7
7
M8 =fix((i+j)/2) 8=8
J不变9,I=M+1=9 I9=9
I=9
10
10
M=fix((i+j)/2)
11
I不变1,1J=M-1=11
=10 J=11
12
M12=fix((i+j)/2) =12
13
13
14
顺序查找 对分查找
查找算法
查找是一种查询数据的技术,其目标是能 以比较少的步聚和较短的时间找到所需的 对象。
顺序查找的基本思想 是从第一个数据开始,按数据的顺序逐
个将数据与给定的值进行比较。若某个数 据和给定的值相等,则查找成功,找到所 查数据的位置;反之,查找不成功。
顺序查找
从数组d的第1个元素d(1) 开始,依次判断各元素的
Else
序
i=m+1
End If
else
Print m
Exit Do
End If
Loop
If i>j Then Print “0”
练习题
1、数据320,340,347,349,362,382,423,454 ,使用对分查找,设定查找键key,若第一个 被访问到的数据是349,小于key值,则第二 个被访问到的数据是 ( )
16
下标 元素
下标 元素
I1=1
1
2
2
3
第1次3 比第较2次:比较第:3次比较:
4
Key4>dK(mey)<d(mK)ey=d(m)
5
查找5范查围找应范该围找应到该了!
6
变成6d(变9)成~dd(1(96))~d(11)
7
7
M8 =fix((i+j)/2) 8=8
J不变9,I=M+1=9 I9=9
I=9
10
10
M=fix((i+j)/2)
11
I不变1,1J=M-1=11
=10 J=11
12
M12=fix((i+j)/2) =12
13
13
14
搜索算法 PPT
• 这种以“深度优先”的方式系统地搜索问题地 解的算法称为回溯法。
28
深度优先搜索 DFS
• 深度优先搜索就是在搜索树的每一层始 终先只扩展一个子节点,不断地向纵深 前进直到不能再前进(到达叶子节点或 受到深度限制)时,才从当前节点返回 到上一级节点,从其它子节点处继续扩 展前进。
• 这种方法的搜索树是从树根开始一枝一 枝逐渐形成的。英语中用Depth-FirstSearch表示,所以我们也把深度优先搜 索法简称为DFS。
29
1
2
3
4
5
6
7
8
30
1
2
3
4
5
6
7
8
31
1
2
3
4
5
6
7
8
32
1
2
3
4
5
6
7
8
33
1
2
3
4
5
6
7
8
34
1
2
3
4
5
6
7
8
35
1
2
3
4
5
6
7
பைடு நூலகம்
8
36
1
2
3
4
5
6
7
8
37
1
2
3
4
5
6
7
8
38
每次搜索指定点,对于其所有未 访问过的近邻,每搜索到一个则先 去搜索其近邻,待对其近邻的 DFS完以后再搜索剩下的那些近 邻。
• 问题的一个可行解就是一条从起始节点 出发到目标状态集合中任意一个节点的 路径。
13
28
深度优先搜索 DFS
• 深度优先搜索就是在搜索树的每一层始 终先只扩展一个子节点,不断地向纵深 前进直到不能再前进(到达叶子节点或 受到深度限制)时,才从当前节点返回 到上一级节点,从其它子节点处继续扩 展前进。
• 这种方法的搜索树是从树根开始一枝一 枝逐渐形成的。英语中用Depth-FirstSearch表示,所以我们也把深度优先搜 索法简称为DFS。
29
1
2
3
4
5
6
7
8
30
1
2
3
4
5
6
7
8
31
1
2
3
4
5
6
7
8
32
1
2
3
4
5
6
7
8
33
1
2
3
4
5
6
7
8
34
1
2
3
4
5
6
7
8
35
1
2
3
4
5
6
7
பைடு நூலகம்
8
36
1
2
3
4
5
6
7
8
37
1
2
3
4
5
6
7
8
38
每次搜索指定点,对于其所有未 访问过的近邻,每搜索到一个则先 去搜索其近邻,待对其近邻的 DFS完以后再搜索剩下的那些近 邻。
• 问题的一个可行解就是一条从起始节点 出发到目标状态集合中任意一个节点的 路径。
13
浙教版信息技术选修12.4查找课件(20张ppt)
End sub
Private sub command1_click()
dim I as integer,bot as integer,top as
integer,m as integer
for i=1 to 300 For i=1 to 100
bot =1:top=300
do while bot <= top
if a(i)=x then
__P_=_t_r_u_e__
pos=i end if i=i+1 Loop ....
1
2
3
4
5
6
7
8
9
1、找出中间的一位同学:m=(1+9)\2 结论:小明身高大于5号同学
1
2
3
4
5
6
7
8
9
2、找出剩余学生中中间的一位同学:m=(6+9)\2 结论:小明身高等于7号同学
6
7
8
9
对分查找
对分查找的前提是数据已经有序(以递 增为例),然后把待查找的数据与数组 中间位置的数比较,如果比中间位置的 数大,在数组的后半部分继续查找,否 则在数组的前半部分查找,继续对分查 找,直到找到待查找的数在数组中的位 置或数组已无法对分
所有身高都存储在数组d中,若找到相同的身高则在标签 label1中输出是第几位同学,若没找到在label1中则显示“不 存在该同学”,请你编写一段对分查找语句来实现查找过程
m=fix((bot+top)/2)
if a(m)=b(i) then
list3.additem a(m):exit do
elseif a(m)>d(i) then
Private sub command1_click()
dim I as integer,bot as integer,top as
integer,m as integer
for i=1 to 300 For i=1 to 100
bot =1:top=300
do while bot <= top
if a(i)=x then
__P_=_t_r_u_e__
pos=i end if i=i+1 Loop ....
1
2
3
4
5
6
7
8
9
1、找出中间的一位同学:m=(1+9)\2 结论:小明身高大于5号同学
1
2
3
4
5
6
7
8
9
2、找出剩余学生中中间的一位同学:m=(6+9)\2 结论:小明身高等于7号同学
6
7
8
9
对分查找
对分查找的前提是数据已经有序(以递 增为例),然后把待查找的数据与数组 中间位置的数比较,如果比中间位置的 数大,在数组的后半部分继续查找,否 则在数组的前半部分查找,继续对分查 找,直到找到待查找的数在数组中的位 置或数组已无法对分
所有身高都存储在数组d中,若找到相同的身高则在标签 label1中输出是第几位同学,若没找到在label1中则显示“不 存在该同学”,请你编写一段对分查找语句来实现查找过程
m=fix((bot+top)/2)
if a(m)=b(i) then
list3.additem a(m):exit do
elseif a(m)>d(i) then
专题搜索算法1PPT课件
m0 3 c0 3 B0 1
1.搜索问题
由此,可以看出这类问 题的解,就是一个合法形状 的序列,其中序列中第一个 形状是问题的初始形状,而 最后一个形状那么是问题的 终了形状。如下图即搜索问 题的表示图:
S0
解途径 搜索空间 全形状空间
Sg
2.搜索方法分类
不可撤回方法
试探性方法
回溯方法 图搜索方法
1.搜索问题
对这类问题,普通我们都转换为形状空间的搜索问题。 如传教士和野人问题,可用在河左岸的传教士人数、野 人人数和船的情况来表示。即,初始时形状为〔3,3,1〕, 终了形状为〔0,0,0〕,而中间形状可表示为〔2,2,0〕、 〔3,2,1〕等等。
初始形状 LR
m3 0 c3 0 B1 0
终了形状 LR
2.数据构造 采用链表构造,结点是生成的形状,当前结点在链表头。结点
中包含形状信息和程序需求的相关控制信息。新扩展生成的结点放 在链表头,回溯时删除头结点并挪动头指针。当找到一种过河方案 时,当前链表中的一切结点就是按顺序生成的形状结点,只需遍历 链表输出形状就可以得到该种方法经过的形状和所用的操作。
3. 回溯方法
()
((1,1))
((1,2))
Q Q
Q
((1,1) (2,3)) ((1,1) (2,4)) ((1,2) (2,4))
((1,1) (2,4) (3.2))
((1,2) (2,4) (3,1))
3. 回溯方法
()
((1,1))
((1,2))
Q Q
Q
((1,1) (2,3)) ((1,1) (2,4)) ((1,2) (2,4))
3. 回溯方法
回溯方法,属于盲目搜索的一种,它是这样一种战略: 首先将规那么给出一个固定的排序,在搜索时,对当前形状 依次检测每一条规那么,在当前形状未运用过的规那么中找 到第一条可运用规那么,运用于当前形状,得到的新形状重 新设置为当前形状,并反复以上搜索。假设当前形状无规那 么可用,或者一切规那么曾经被试探过仍未找到问题的解, 那么将当前形状的前一个形状〔即直接生成该形状的形状〕 设置为当前形状。反复以上搜索,直到找到问题的解,或已 试探过一切能够仍找不到问题的解为止。
1.搜索问题
由此,可以看出这类问 题的解,就是一个合法形状 的序列,其中序列中第一个 形状是问题的初始形状,而 最后一个形状那么是问题的 终了形状。如下图即搜索问 题的表示图:
S0
解途径 搜索空间 全形状空间
Sg
2.搜索方法分类
不可撤回方法
试探性方法
回溯方法 图搜索方法
1.搜索问题
对这类问题,普通我们都转换为形状空间的搜索问题。 如传教士和野人问题,可用在河左岸的传教士人数、野 人人数和船的情况来表示。即,初始时形状为〔3,3,1〕, 终了形状为〔0,0,0〕,而中间形状可表示为〔2,2,0〕、 〔3,2,1〕等等。
初始形状 LR
m3 0 c3 0 B1 0
终了形状 LR
2.数据构造 采用链表构造,结点是生成的形状,当前结点在链表头。结点
中包含形状信息和程序需求的相关控制信息。新扩展生成的结点放 在链表头,回溯时删除头结点并挪动头指针。当找到一种过河方案 时,当前链表中的一切结点就是按顺序生成的形状结点,只需遍历 链表输出形状就可以得到该种方法经过的形状和所用的操作。
3. 回溯方法
()
((1,1))
((1,2))
Q Q
Q
((1,1) (2,3)) ((1,1) (2,4)) ((1,2) (2,4))
((1,1) (2,4) (3.2))
((1,2) (2,4) (3,1))
3. 回溯方法
()
((1,1))
((1,2))
Q Q
Q
((1,1) (2,3)) ((1,1) (2,4)) ((1,2) (2,4))
3. 回溯方法
回溯方法,属于盲目搜索的一种,它是这样一种战略: 首先将规那么给出一个固定的排序,在搜索时,对当前形状 依次检测每一条规那么,在当前形状未运用过的规那么中找 到第一条可运用规那么,运用于当前形状,得到的新形状重 新设置为当前形状,并反复以上搜索。假设当前形状无规那 么可用,或者一切规那么曾经被试探过仍未找到问题的解, 那么将当前形状的前一个形状〔即直接生成该形状的形状〕 设置为当前形状。反复以上搜索,直到找到问题的解,或已 试探过一切能够仍找不到问题的解为止。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//从表尾开始向后扫描
return i;
//返回下标
}
2020/4/12
15
▪ 算法中监视哨R[0]的作用是为了在for 循环中省去判定防止下标越界的条件 i>0, 从而节省比较的时间。
▪ 顺序查找的平均查找长度为:
ASLsqi n1pici 1 ni n1i(n1)/2
▪ 有时,表中各结点的查找概率并不相等。因 此若事先知道表中各结点查找概率的分布情 况,则可将表中结点按查找概率从大到小排 列,以便提高顺序查找的效率。
2020/4/12
21
9.2.3 分块查找
分块查找(索引顺序查找) 基本思想:
首先把一个线性表(即主表)按照一定的函数关系或条 件划分成若干个逻辑子表,为每个子表分别建立一个索引 项,由所有子表的索引项构成一个索引表。当进行分块查 找时,先根据所给的关键字查找索引表,从中查找出给定 值K刚好小于等于索引值的那个索引项,找到待查块,然 后再到主表中查找该块,从中查找待查的记录。
// 表示座号 // 表示学号 // 表示姓名
};
struct list
{
Student stu[size]; //保存学生记录
Int
len;
//学生人数
};
2020/4/12
6
查找学生的方法:
从第一个学生开始,依次与查找的学生进 行比较。在查找过程中,若某个学生的记录与 所查找学生记录相等,则查找成功,返回该学 生在表中位置;若全部比较完毕,没有符合条 件的学生记录,则查找不成功,返回-1。
if (K==ST.R[mid].key) return mid;
if (K<ST.R[mid].key) high=mid-1;
else low=mid+1;
}
return -1;
//查找失败
}
2020/4/12
20
算法分析
虽然折半查找的效率较高,但它要求被查找 序列事先按关键字排好序,而排序本身是一种很 费时的运算;另外,折半查找只适用于顺序存储 结构,因此,折半查找特别适用于那种一经建立 就很少改动、而又需要经常查找的线性表。
▪ 顺序查找的特点:算法简单,但查找效率低。
2020/4/12
16
9.2.2 折半查找
▪ 折半查找又称为二分查找。
▪ 折半要求查找表是有序的。
▪ 折半查找的基本思想是:
▪首先将待查的K值与有序表R[0]到R[n-1]的中间
位置mid上的结点的关键字进行比较,若相等,
则查找完成;
▪否则,若R[mid].key>K,则说明待查找的结点
9
查找运算的主要操作是关键字的比较,所以, 通常把查找过程中对关键字需要执行的平均比 较次数(也称为平均查找长度)作为衡量一个 查找算法效率优劣的标准。
平均查找长度定义为:
n
ASL pici i 1
其中,n是结点的个数;pi 是查找第i个结 点的概率,ci 是找到第i个结点所需要的比
较次数
2020/4/12
ib 1s b 1s 11n
A SLj i ( s) 1 bj 1 si 1 2 2 2s
若用二分查找确定所在块,则分块查找成功时的平均查找长度为 :
ASLlo2g(ns1)2s
2020/4/12
28
9.3 动态查找
• 9.3.1 二叉排序树查找 • 9.3.2 二叉平衡树
动态查找表特点:表结构本身是在查找过程中 动态生成的,即对于给定值key,若表中存 在关键字等于key的记录,则查找成功;否 则插入关键字为key的元素。
2020/4/12
19
折半查找算法(low和high分别表示当前查找区
间的下界和上界)
int BINSEARCH(SSTable ST,keytype K)
{ int low,mid,high;
low=0; high=n-1;
while (low<=high)
{ mid=(low+high)/2; //整除
int IdxSerch(SeqList A[],IdxType index[],int b,KeyType k,int n) { //分块查找关键字为k的记录,索引表为index[0..b-1]
int low=0,high=b-1,mid,i;
int s=n/b;
//每块记录个数
while(low<=high) { //在索引表中进行二分查找,找到的位置放在low中
KeyType key;
int addr(link);
}IdxType;
在这种结构下,查找过程要分为两步:首先查找索 引表。因为索引表是有序表,所以可采用二分查找或顺 序查找,以确定给定值所在的块。因为块中的记录可以 是任意排列的,所以再在已确定的块中进行顺序查找。
2020/4/12
26
分块查找算法如下:
2020/4/12
4
9.1.2 问题的分析
用计算机来解决查找学生问题,通常需要做 以下工作:
第一,学生信息以什么形式表示和存储; 第二,查找的具体实现方法(算法)。
2020/4/12
5
学生信息的存储方式:
struct student
{
int
int
char ┆
num1; num2; name[12];
return -1;
}
return -1;
}
2020/4/12
27
算法分析
由于分块查找实际上是两次查找过程,所以分块查找的平均查找 长度是:查找索引表确定给定值所在块内的平均查找长度ASLb与 在块的查找关键值的平均查找长度ASLk之和。即ASL=ASLb+ASLk。
若用顺序查找确定所在块,则分块查找成功时的平均查找长 度为:
datatype other; } DataNode;
Typedef struct { DataNode R[maxsize]; int length; }SSTable;
2020/4/12
typedef struct
{ int number;
char name[10];
float score;
} DataNode; Typedef struct
2020/4/12
8
9.1.4 基本概念
▪ 查找表:由同一类型的数据元素构成的集合。 ▪ 静态查找表:只做查找操作的查找表。 ▪ 动态查找表:在查找过程中做插入和删除操作的查
找表。 ▪ 关键字、主关键字、次关键字 ▪ 查找:根据给定的某个值,在查找表中确定一个其
关键字等于给定值的记录或数据元素。
2020/4/12
2020/4/12
29
9.3.1 二叉排序树查找
二叉排序树(二叉搜索树、二叉查找树) : 或者是一棵空树,或是一棵有如下特性的非空二叉树: l 若它的左子树非空,则左子树上所有结点的关键字 均小于根结点的关键字。 l 若它的右子树非空,则右子树上所有结点的关键字 均大于等于根结点的关键字。 l 左、右子树本身又各是一棵二叉搜索树。
2020/4/12
7
9.1.3 实现算法
int search ( List &L , int s ) //从表L.stu[0],L.stu[1],……L.stu[n-1]的n个元 素中查找关键字为S的元素,若查找成功返回该生学号, 否则返回-1
{ int i; for (i=0; i<L.len; i++) if ( L.stu[i]==s) break; if (i<L.len) return L.stu[i].num2; else return -1; }
{ DataNode R[maxsize]; int length; }SSTable;
14
顺序查找算法:
int SEQSEARCH(SSTable ST,keytype K)
{ int i;
ST.R[0].key=K; //设置监视哨
for(i=ST.length ; ST.R[i].key!=K ; --i) ;
low
9m2id]
high
05 13 19 21 37 56 [64 75 80 88
92] low
mid
high
05 13 19 21 37 56 64 75 80 [88
92]
mid high
low
05 13 19 21 37 56 64 75 80] [88
92
high low
查找K=85的过程(查找失败)
2020/4/12
2
9.1 实例:学生分配座位
• 9.1.1 问题描述 • 9.1.2 问题的分析 • 9.1.3 实现算法 • 9.1.4 基本概念
2020/4/12
3
9.1.1 问题描述
教室中的学生座位分配是一个最简单 的例子。假定某教室有35个座位,如果 不加限定任意就坐或按某种规律就座,则 要查找某学生时就要将待查找的学生与当 前座位上的学生进行比较。
查找表定义为顺序存储的线性表,数据类型定义如下:
struct Elemtype //数据元素类型定义
{keytype key; //关键字项
┆
};
#define maxlen maxsize //分配的存储单元个数
struct ListSq
{ Elemtype e [maxsize];
int
len;
结论:二叉排序树中序遍历得到的必是一个有序序列。
2020/4/12
30
•
由图9.4可以看出,对二叉排序树进行中序遍历
,便可得到一个按关键码有序的序列,因此,一个无序