chapter4 数据集合上的搜(Searching)算法共94页
人工智能原理 北京大学 3 PartIISearchingChapter3SolvingPr (3.3.1)

Searching for SolutionsSchool of Electronic and Computer EngineeringPeking UniversityWang WenminContents☐3.3.1 Shortest Path Problem by Graph Search ☐3.3.2 Shortest Path Problem by Tree SearchA sequence of search paths generated by a graph search on the Romania map.通过图搜索在该罗马尼亚地图上生成一系列搜索路径。
Stage 2OradeaLugoj RimnicuVilceaFagarasStage 1Arad TimisoaraZerindSibiuStage 3BucharestMehadiaCraiova Pitesti Each path has been extended at each stage by one step. Notice that at 3rd stage,the northernmost city (Oradea) has become a dead end.每个路径在每个阶段通过每一步加以扩展扩展。
注意在第3阶段,最北部城市(Oradea)已成为死胡同。
Use search trees to find a route Arad to Bucharest .用搜索树来寻找一条从Arad 到Bucharest 的路径。
(a) The initial state Arad Sibiu Zerind Fagaras Timisoara Oradea Rimnicu Vilcea Lugoj OradeaMehadia Craiova Pitesti BucharestAradShaded Arad Outlined in bold Sibiu Faint dashed lines Shaded : the nodes that have been expanded.阴影:表示该节点已被扩展。
数据结构最基础的十大算法

数据结构最基础的十大算法数据结构是计算机科学中的重要分支,它研究如何组织和存储数据以便于访问和修改。
在数据结构中,算法是解决问题的关键。
下面将介绍数据结构中最基础的十大算法。
1. 线性搜索算法线性搜索算法是最简单的算法之一,它的作用是在一个列表中查找一个特定的元素。
该算法的时间复杂度为O(n),其中n是列表中元素的数量。
2. 二分搜索算法二分搜索算法是一种更高效的搜索算法,它的时间复杂度为O(log n)。
该算法要求列表必须是有序的,它通过将列表分成两半来查找元素,直到找到目标元素为止。
3. 冒泡排序算法冒泡排序算法是一种简单的排序算法,它的时间复杂度为O(n^2)。
该算法通过比较相邻的元素并交换它们的位置来排序列表。
4. 快速排序算法快速排序算法是一种更高效的排序算法,它的时间复杂度为O(nlog n)。
该算法通过选择一个基准元素并将列表分成两部分来排序列表。
5. 插入排序算法插入排序算法是一种简单的排序算法,它的时间复杂度为O(n^2)。
该算法通过将每个元素插入到已排序的列表中来排序列表。
6. 选择排序算法选择排序算法是一种简单的排序算法,它的时间复杂度为O(n^2)。
该算法通过选择最小的元素并将其放在列表的开头来排序列表。
7. 堆排序算法堆排序算法是一种更高效的排序算法,它的时间复杂度为O(n log n)。
该算法通过将列表转换为堆并进行排序来排序列表。
8. 归并排序算法归并排序算法是一种更高效的排序算法,它的时间复杂度为O(n log n)。
该算法通过将列表分成两部分并将它们合并来排序列表。
9. 哈希表算法哈希表算法是一种高效的数据结构,它的时间复杂度为O(1)。
该算法通过将键映射到哈希表中的位置来存储和访问值。
10. 树算法树算法是一种重要的数据结构,它的时间复杂度取决于树的深度。
树算法包括二叉树、AVL树、红黑树等。
以上是数据结构中最基础的十大算法,它们在计算机科学中有着广泛的应用。
查找 数据结构讲义

ASL blk
s1 s ASL bn ASL sq log 2 (h 1) 1 log 2 (n / s 1) 2 2
若以顺序查找确定块,则分块查找成功时的平 均查找长度为:
ASL ASL bn ASL sq blk
b 1 s 1 s 2s n 2 2 2s
low=0 high=3 第2次比较: 2 4 7 9 10 14 18
mid=(0+3)/2=1 26 32 40
low=2
第3次比较: 2 4 7
high=3
9 10 14 18 26
mid=(2+3)/2=2
32 40
R[2].key=7 查找成功,返回序号2
其算法如下(在有序表R[0..n-1]中进行二分查找, 成功时返回记录的位置,失败时返回-1):
二分查找过程可用二叉树来描述,我们
把当前查找区间的中间位置上的记录作为根,
左子表和右子表中的记录分别作为根的左子
树和右子树,由此得到的二叉树,称为描述
二分查找的判定树或比较树。
<
5 =
>
< 0 = > 1 < = >
2 =
> 3 < = >
2~3
8 < =
6 < = >
5~6
> 9 < = > 10 < = >
采用二分查找索引表的分块查找算法如下(索引表I的长度 为m):
int IdxSearch(IDX I, int m, SeqList R, int n, KeyType k)
{
int low=0,high=m-1,mid,i;
静态查找

查找的基本方法
基于线性表的查找法 ——顺序查找法、折半查找法、分块查找法 比较式查找法 基于树的查找法 —— ——二叉排序树、平衡二叉排序树、B树 B
顺序查找的算法
//不设置监视哨 int seqsearch(l, k) RecordList l; keytype k; { i=l.length; while(i>=1&&l.r[i].key!=k) i--; if(i>=1) return i; else return 0; }
监视哨: 监视哨:l.r[0],起 , 防止越界的作用
基本概念
关键字:数据元素的某个数据项的值。 关键字:数据元素的某个数据项的值。
主关键字: 主关键字:一个关键字可以唯一标识列表中的 一个元素 注意:如果数据元素只有一个数据项时, 注意:如果数据元素只有一个数据项时,数据 元素的值就是关键字
查找的基本概念
列表): (1)查找表 列表 :由同一类型的数据元素(或记录) )查找表(列表 由同一类型的数据元素(或记录) 构成的集合。 构成的集合。 如图的学生招生录取登记表。 如图的学生招生录取登记表。
数据元素( (5)关键字(Key)——数据元素(或记 )关键字( ) 数据元素 中某个数据项的值, 录)中某个数据项的值,用它可以标识数 据元素(或记录)。 据元素(或记录)。 (6)主关键字(Primary Key)——可以 )主关键字( ) 可以 唯一地标识一个记录的关键字称为主关键 如图的“学号” 字。如图的“学号”。
基本概念
数据结构查找表

如何进行查找
在一个结构中查找某个数据元素的过程,依赖于数据 元素在结构中的地位,即依赖于数据元素的组织关系 (人为的)。
在计算机中进行查找的方法随数据结构不同而不同。 即随查找表的不同而不同。
9.1 静态查找表
顺序表的查找 有序表的查找 静态树表的查找
查找表的结构 查找过程描述 查找性能分析 查找方法比较
n ASLbs log 2 ( 1) 1 s
9.2 动态查找表
动态查找表的ADT
动态查找表的特点是,表结构本身是在查找过程中动态生成的。即, 对于给定值key,若表中存在其关键字等于key的记录,则查找成 功返回;否则,插入关键字等于key的记录。
P226: SearchDSTable(DT,key ); InsertDSTable(&DT,e ); DeleteDSTable(&DT, e );
给定值进行比较的关键字个数最多也不超过log2 n 1
折半查找的ASL
假设有序表的长度为n=2h-1,则描述折半查找的判定树是深度 为h的满二叉树。 该树中层次为1的结点有1个,层次为2的结点有2个,…,层次 为h的结点有2h-1个。 假设有序表中每个记录的查找概率相等(Pi = 1/n)。
05 low 13 19 21 37 56 64 75 80 88 92 high
mid
high low
mid (low high) / 2
例子
给定值key = 21的查找过程: 给定值key = 85的查找过程:
下界low>上界high,查找不成功。
int Search_Bin( SSTable ST,KeyType key ){ low = 1; high = ST.length; while( low <= high ){ mid = ( low + high ) /2; if EQ( key , ST.elem[mid].key ) return mid; else if LT( key , ST.elem[mid].key ) high = mid-1; else low = mid +1; } return 0; }
数据结构查找与排序

第二部分 排序
• 各种排序算法的特性
– 时间性能(最好、最坏、平均情况) – 空间复杂度 – 稳定性
• 常见排序算法
– 堆排序-堆的定义,创建堆,堆排序(厦大3次,南航2次,南大3次) – 快速排序 – 基数排序 – 插入排序 – 希尔排序 – 冒泡排序 – 简单选择排序 – 归并排序
一、基于选择的排序
• 快速排序算法关键字的比较和交换也是跳跃式进行的,所以快速排序 算法也是一种不稳定的排序方法。
• 由于进行了递归调用,需要一定数量的栈O(log2n)作为辅助空间
例如
1、快速排序算法在 数据元素按关键字有序的 情况下最不利于发挥其长处。
2、设关键字序列为:49,38,66,80,70,15,22,欲对该序列进行从小到大排序。 采用待排序列的第一个关键字作为枢轴,写出快速排序法的一趟和二趟排序之 后的状态
49
49
38
66
38
10
90
75
10
20
90
75
66
20
10
38
20
90
75
66
49
2.序列是堆的是( C )。 A.{75, 65, 30, 15, 25, 45, 20, 10} B.{75, 65, 45, 10, 30, 25, 20, 15} C.{75, 45, 65, 30, 15, 25, 20, 10} D.{75, 45, 65, 10, 25, 30, 20, 15}
➢ 依靠“筛选”的过程
➢ 在线性时间复杂度下创建堆。具体分两步进行: 第一步,将N个元素按输入顺序存入二叉树中,这一步只要求满 足完全二叉树的结构特性,而不管其有序性。
第二步,按照完全二叉树的层次遍历的反序,找到第一个非叶子结点, 从该结点开始“筛选”,调整各结点元素,然后按照反序,依次做筛选,直到做 完根结点元素,此时即构成一个堆。
9¥-nine
2024/11/23
5
9.1 静态查找表
➢ 抽象数据类型静态查找表的定义:
ADT StaticSearchTable{ 数据对象D: D是具有相同属性的数据 元素的集合。 数据关系R:数据元素同属一个集合。 基本操作P: Create(&ST,n); Destroy(&ST);
Search(ST,key);Traverse(ST,Visit());
ASL=Lb+Lw 查 查其找找中长长Lb度度为,。查找Lw索为引在表块确中定查所找在元块素的的平平均均 ➢ 若将长度为n的表均匀地分成b块,每块 含有 s个记录,即b=n/s; 又假定表中每 个记录的查找概率相等,则每块查找的 概率为1/b,块中每个记录的查找概率为1/s.
2024/11/23
26
2024/11/23
7
➢ 顺序查找的线性表定义如下: #define MAXITEM 100 /*最多项数*/
struct element
{
keytype key;
Elemtype data;
};
typedef struct sqlist[MAXITEM]; 这里keytype和ElemType可以是任何相应的 数据类型,如int、float或char等,在算法 中我们规定它们缺省是int类型。
➢ 在计算机中,被查找的数据对象是由同 一类型的记录构成的集合,可称之为查 找表(search table)。
➢ 在实际应用问题中,每个记录一般包含 有多个数据域,查找是根据其中某一个 指定的域进行的,这个作为查找依据的 域称为关键字(key)。
2024/11/23
2
➢ 对于给定的关键字的值,如果在表中经过查 找能找到相应的记录,则称查找成功,一般 可输出该记录的有关信息或指示该记录在查 找表中的位置。若表中不存在相应的记录, 则称查找不成功,此时应该给出不成功的信 息。
查找-数据结构
平均查找长度:为确定记录在查找表中 的位置,需和给定值进行比较的关键字 个数的期望值称为查找算法在查找成功 时的平均查找长度,简称ASL。
对于含有n个记录的表,查找成功时的平 均查找长度为: n ASL PiCi i 1
其找到中表:中Pi为其查关找键表字中与第给i定个值记相录等的的概第率,i个C记i为 录时和给定值已进行过比较的关键字个数。
(1)若*p 为叶子结点,直接删除即可。
45
45
12
3
37
53
f
100
24
p
61
60
90
12
53
3
删除24
f->lchild = null; delete p;
37
100
61
60
90
78
78
(2)若*p结点只有左子树PL或只有右子树PR,此 时只要令PL或PR直接成为*f的左子树即可
f
F
f
F
p
P
p
二叉排序树的插入
基本思想:
若二叉排序树为空,则待插结点作为根结点插入 到空树中;
若待插结点的关键字值和根结点的关键字值相等, 则说明树中已有此结点,无需插入;
若待插结点的关键字值小于根结点的关键字值, 则将待插结点插入到根的左子树中;
若待插结点的关键字值大于根结点的关键字值, 则将待插结点插入到根的右子树中;
mid low
mid low
mid low
mid low
mid
mid
mid
mid
6
3
9
1
47
10
2
58
11
由此可见,二分查找过程恰好是走了一条从判 定树的根到被查结点的路径,比较的关键字个 数恰为该结点在判定树中的层数。
信息学奥赛一本通 第4章 第5节 并查集(C++版)
具体程序如下:
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 20001
int father[maxn];
int m,n,i,x,y,q;
/*
int find(int x)
/用非递归的实现
{
while (father[x] != x) x = father[x];
并查集的基本思想
优化的具体程序如下:
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 20001
int father[maxn];
int m,n,i,x,y,q;
/*
int find(int x)
//用非递归的实现
路径压缩实际上是在找完根结点之后,在递归回来的时候顺便把路径上元素的 父亲指针都指向根结点。
这就是说,我们在“合并5和3”的时候,不是简单地将5的父亲指向3,而是直 接指向根节点1,如图:
1
2
3
5
4
由此我们得到了一个复杂度几乎为常数的算法。
【程序清单】 (1)初始化:
for (i = 1; i <= n; i++) father[i] = i; 因为每个元素属于单独的一个集合,所以每个元素以自己作为根结点。
并查集的基本思想
(2)寻找根结点编号并压缩路径: int find (int x) { if (father[x] != x) father[x] = find (father[x]); return father[x]; }
计算机领域常用算法列表
计算机领域常用算法列表在计算机科学领域,算法是解决问题的基础工具。
各种算法的应用领域广泛,包括数据处理、搜索、排序、图形处理、机器学习等。
本文将介绍计算机领域常用的一些算法,以帮助读者了解和熟悉这些算法的基本原理和应用。
一、搜索算法1. 顺序搜索算法顺序搜索算法是最简单的搜索算法之一,其基本思想是按顺序逐个比较目标元素和列表中的元素,直到找到匹配项或搜索完整个列表。
顺序搜索算法适用于未排序的列表。
2. 二分搜索算法二分搜索算法也称为折半搜索算法,适用于已排序的列表。
其基本思想是将列表从中间切分,然后将目标元素与中间元素进行比较,根据比较结果缩小搜索范围,以达到快速搜索的目的。
3. 广度优先搜索算法广度优先搜索算法是一种图遍历算法,用于搜索图或树的结构。
它从起始节点开始,按照广度优先的方式依次访问与当前节点相邻的节点,直到找到目标节点或访问完整个图。
二、排序算法1. 冒泡排序算法冒泡排序算法是一种简单且常用的排序算法。
它通过不断比较相邻的元素并交换位置,将最大或最小的元素逐步“冒泡”到正确的位置,直到整个列表有序。
2. 快速排序算法快速排序算法是一种高效的排序算法。
它通过选择一个基准元素,将列表划分为两个子列表,其中一个子列表的元素都小于基准元素,另一个子列表的元素都大于基准元素。
然后对子列表递归地应用快速排序算法,最终得到有序列表。
3. 归并排序算法归并排序算法是一种稳定的排序算法。
它将列表划分为多个子列表,然后逐个合并子列表,直到得到完全排序的列表。
归并排序算法的核心思想是分治法,将大问题拆分为小问题并解决。
三、图算法1. 最短路径算法最短路径算法用于求解两个节点之间的最短路径。
著名的最短路径算法有迪杰斯特拉算法和弗洛伊德算法。
迪杰斯特拉算法适用于单源最短路径问题,而弗洛伊德算法适用于所有节点对之间的最短路径问题。
2. 最小生成树算法最小生成树算法用于求解连通图的最小生成树。
其中,普里姆算法和克鲁斯卡尔算法是两种常用的最小生成树算法。