数据结构与STL_第7章_查找
数据结构-第三部分
e、g:二叉查找树
122
99 110
250
200
300
105
230
216
L
C E
N
M
P
Y
30
二叉查找树
• 二叉查找树的定义 • 二叉查找树的操作 • 二叉查找树的性能 • 二叉查找树类的实现
31
二叉查找树的操作
• 特定节点在树上是否存在 • 插入一个节点 • 删除一个节点
由于树是递归定义的,因此这些操作往往也用递 归实现。因为二叉树的平均高度为logN,这些操 作的时间复杂度也是O(logN)
二叉查找树
二叉查找树是二叉树在查找方面的重要应用。二叉 查找树或者为空,或者具有如下性质:对任意一个 结点p而言
• 如果p的左子树若非空,则左子树上的所有结 点的关键字值均小于p结点的关键字值。
• 如果p的右子树若非空,则右子树上的所有结 点的关键字值均大于p结点的关键字值。
• 结点p的左右子树同样是二叉查找树。
if (binary_search(v.begin(), v.end(),13))
cout << "13 存在\n";
else cout << "13 不存在\n";
itr = find(v.begin(), v.end(),13);
cout << *itr << endl;
return 0;
}
25
• 能保持二查查找树的有序性
45
删除操作
• 删除叶结点 • 删除有一个儿子的结点 • 删除有两个儿子的结点
46
被删结点有两个儿子
删除这个结点会使其他结点从树上脱离。
实用数据结构(C++描述)(第二版)第7章
/*函数返回被查找元素x在线性表中的序号, 如果在线性表中不存在元素值x,则返回-1 */ int serch(v,n,x) int n; ET v[],x; /*ET为线性表数据类型*/ { int k; k=0; while ((k<n)&&(v[k]≠x)) k=k+1; if (k==n) k=-1; return(k); }
第7章 查找技术
7.1 7.2 7.3 7.4 7.5
顺序查找 有序表的对分查找 分块查找 二叉排序树查找 多层索引树查找
查找(Searching)又称检索,就是从一个数据 元素集合中找出某个特定的数据元素。它是数据 处理中经常使用的一种重要操作,尤其是当所涉 及的数据量较大时,查找算法的优劣对整个软件 系统的效率影响是很大的。好的查找方法可以极 大地提高程序的运行速度。
struct node { ET d; struct node *next; }; /*函数返回被查找元素x所在结点的存储地址, 如果在线性链表中不存在元素值为x的结点,则返回NULL*/ struct node *lserch(head,x) struct node *head; ET x; /*ET为线性链表中值域的数据类型*/ { struct node k; k=head; while ((k≠NULL)&&(k->d≠x)) k=k->next; return(k); }
int bserch(v,n,x) /*函数返回被查找元素x在线性表中的序号 如果在线性表中不存在元素值x,则返回-1 */ int n; ET x,v[]; { int i,j,k; i=1; j=n; while (i<=j) { k=(i+j)/2; if (v[k-1]==x) return(k-1); if (v[k-1]>x) j=k-1; else i=k+1; } return(-1); }
数据结构:第七章 集合与搜索
用位向量实现集合抽象数据类型
当集合是全集合{ 0, 1, 2, …, n }的一个子集, 且 n是不大的整数时,可用位(0, 1)向量来实现 集合。 当全集合是由有限的可枚举的成员组成的集 合时,可建立全集合成员与整数 0, 1, 2, …的一 一对应关系,用位向量来表示该集合的子集。
集合的位向量(bit Vector)类的定义
for ( int i = 0; i < MaxSize; i++ ) bitVector[i] = 0; }
int Set :: Addmember ( const int x ) { assert ( x >= 0 && x < MaxSize ); if ( ! bitVector[x] ) { bitVector[x] = 1; return 1; } return 0;
colour = { red, orange, yellow, green, black, blue, purple, white } name = { “An”, “Cao”, “Liu”, “Ma”, “Peng”, “Wang”, “zhang” }
集合中的成员一般是无序的,没有先后次序关 系。但在表示它时,常常写在一个序列里。
temp = temp→link; if (temp != NULL && temp→data == x)
}
int Set :: Contains ( const int x ) { assert ( x >= 0 && x < MaxSize ); return bitVector[x];
}
int Set :: operator == ( Set & right ) { assert ( MaxSize == right.MaxSize ); for ( int i = 0; i < MaxSize; i++) if ( bitVector[i] != right.bitVector[i] ) return 0; return 1;
数据结构与算法-查找
数据结构与算法-查找目录一、查找的定义二、线性表的查找 2.1 、顺序查找 2.2、二分查找 2.3、分块查找三、树表查找 3.1 、二叉排序树 3.2 、平衡二叉树一、查找的定义查找又称检索,是数据处理中经常使用的一种重要运算。
采用何种查找方法,首先取决于使用哪种数据结构来表示“表”,及表中的数据元素按何种方式组织。
查找有内查找和外查找之分。
若整个查找过程都在内存进行,则称为内查找;反之,若查找过程需要访问外存,则称为外查找。
关键字是指数据元素(记录)中一些项或组合项的值,用它可以标识一个数据元素(记录)。
能唯一确定一个数据元素(记录)的关键字,称为主关键字;而不能唯一确定一个数据元素(记录)的关键字,称为次关键字。
查找表是指由具有同一类型(属性)的数据元素(记录)组成的集合。
分为静态查表和动态查找表。
静态查找是指仅对查找表进行查找操作,而不改变查找表中的数据元素。
动态查找是指除进行查找操作外,可能还要进行向表中插入或删除数据元素的操作。
平均查找长度二、线性表的查找2.1 、顺序查找顺序查找( Sequential Search) 是一种最基本也是最简单的查找方法。
它的基本思想是蛮力法,从表的一端开始,顺序扫描线性表,逐个进行结点关键字值与给定的值k相比较,若当前扫描到的结点关键字与k相等,则查找成功;若扫描整个表后,仍未找到关键字与给定值k相等的结点,则查找失败。
顺序查找方法既适用于线性表的顺序存储结构,也适用于线性表的链式存储结构。
使用单链表作存储结构时,查找必须从头指针开始,因此只能进行顺序查找。
顺序查找代码如下:顺序查找算法的时间复杂度为O(n)。
顺序查找的优点是算法简单,且对表的结构无任何要求,无论用顺序表还是链表来存放结点,也无论结点是否按关键字有序,都同样适用。
顺序查找的缺点是查找效率低,当n 较大时,不宜采用顺序查找。
对于线性链表,只能进行顺序查找。
2.2 、二分查找二分查找( Binary Search)又称折半查找,是一种效率较高的查找方法。
数据结构7 查找
折半法算法分析
假设:查找关键字为0-6的数据
查找的过程形成二叉判定树
3
5 2 4 6
ASL=1/7(1+2×2+4×3)
1
=2.43
0
假设:有序表长度为n,且n≤2h-1 二叉判定树 若n=2h-1 则:查找过程为一棵深度为h的满二叉树,
2014-7-4 第7章 查找 18
则满二叉树的第 i 层有2i-1个结点。
分块[17,8,21,19],[31,33,25,22], [43,37,35,40], [61,73,78,55] 索引表:21 33 43 78
数据表
17 8 21 19 31 33 25 22 43 37 35 40 61 73 78 55 … … … … … … … … … … … … … … … …
(2)key与R[mid].key比较
若key=R[mid].key则查找成功; 若key<R[mid].key ,则high=mid-1,转(3)。 若key>R[mid].key ,则low=mid+1,转(3)。 (3)若low≤high, 则重复(1) 否则:查找不成功,结束。
2014-7-4
关键字 地址 21 33 43 78
2014-7-4
第7章 查找
22
表结构说明:
typedef struct {KeyType key; int link; } indextype; indextype Lr[m] typedef struct {char name[10]; KeyType key; } DataType; DataType r[Max];
ASL=∑[(1/n)×2i-1 ×i]
王道数据结构 第七章 查找思维导图-高清脑图模板
每次调整的对象都是“最小不平衡子树”
插入操作
在插入操作,只要将最小不平衡子树调整平衡,则其他祖先结点都会恢复平衡
在A的左孩子的左子树中插入导致不平衡
由于在结点A的左孩子(L)的左子树(L)上插入了新结点,A的平衡因子由1增
至2,导致以A为根的子树失去平衡,需要一次向右的旋转操作。
LL
将A的左孩子B向右上旋转代替A成为根节点 将A结点向右下旋转成为B的右子树的根结点
RR平衡旋转(左单旋转)
而B的原左子树则作为A结点的右子树
在A的左孩子的右子树中插入导致不平衡
由于在结点A的左孩子(L)的右子树(R)上插入了新结点,A的平衡因子由1增
LR
至2,导致以A为根的子树失去平衡,需要两次旋转操作,先左旋转再右旋转。
将A的左孩子B的右子树的根结点C向左上旋转提升至B结点的位置
本质:永远保证 子树0<关键字1<子树1<关键字2<子树2<...
当左兄弟很宽裕时,用当前结点的前驱、前驱的前驱来填补空缺 当右兄弟很宽裕时,用当前结点的后继、后继的后继来填补空缺
兄弟够借。若被删除关键字所在结点删除前的关键字个数低于下限,且与此结点 右(或左)兄弟结点的关键字还很宽裕,则需要调整该结点、右(或左)兄弟结 点及其双亲结点及其双亲结点(父子换位法)
LL平衡旋转(右单旋转)
而B的原右子树则作为A结点的左子树
在A的右孩子的右子树中插入导致不平衡
由于在结点A的右孩子(R)的右子树(R)上插入了新结点,A的平衡因子由-1
减至-2,导致以A为根的子树失去平衡,需要一次向左的旋转操作。
RR
将A的右孩子B向左上旋转代替A成为根节点 将A结点向左下旋转成为B的左子树的根结点
数据结构第七章参考答案
习题71.填空题(1)由10000个结点构成的二叉排序树,在等概率查找的条件下,查找成功时的平均查找长度的最大值可能达到(___________)。
答案:5000.5(2)长度为11的有序序列:1,12,13,24,35,36,47,58,59,69,71进行等概率查找,如果采用顺序查找,则平均查找长度为(___________),如果采用二分查找,则平均查找长度为(___________),如果采用哈希查找,哈希表长为15,哈希函数为H(key)=key%13,采用线性探测解决地址冲突,即d i=(H(key)+i)%15,则平均查找长度为(保留1位小数)(___________)。
答案:6,3,1.6(3)在折半查找中,查找终止的条件为(___________)。
答案:找到匹配元素或者low>high?(4)某索引顺序表共有元素275个,平均分成5块。
若先对索引表采用顺序查找,再对块元素进行顺序查找,则等概率情况下,分块查找成功的平均查找长度是(___________)。
答案:31(5)高度为8的平衡二叉树的结点数至少是(___________)。
答案: 54 计算公式:F(n)=F(n-1)+F(n-2)+1(6)对于这个序列{25,43,62,31,48,56},采用的散列函数为H(k)=k%7,则元素48的同义词是(___________)。
答案:62(7)在各种查找方法中,平均查找长度与结点个数无关的查找方法是(___________)。
答案:散列查找(8)一个按元素值排好的顺序表(长度大于2),分别用顺序查找和折半查找与给定值相等的元素,平均比较次数分别是s和b,在查找成功的情况下,s和b的关系是(___________);在查找不成功的情况下,s和b的关系是(___________)。
答案:(1)(2s-1)b=2s([log2(2s-1)]+1)-2[log2(2s-1)]+1+1(2)分两种情况考虑,见解答。
数据结构-查找
数据结构-查找写在前⾯:这些内容是以考研的⾓度去学习和理解的,很多考试中需要⽤到的内容在实际应⽤中可能⽤不上,⽐如其中的计算问题,但是如果掌握这些东西会帮你更好的理解这些内容。
这篇关于查找的博客也只是⽤来记录以便于后续复习的,所以很多地⽅只是浅谈,并没有代码的实现如果有缘发现这篇⽂章想要深⼊了解或者因为作者表达能⼒差⽽看不懂以及有错的地⽅,欢迎留⾔指出来,我会尽快去完善的,期待有缘⼈内容多和杂,如果有机会我进⼀步进⾏梳理,将其重新梳理⼀⽚⽂章(会更注重于代码)本来只是想简单写⼀下的,但是不⼩⼼就get不到重点了本来打算等逐步完善和优化后再发出来的,但那样继续往前总感觉有所顾及,所以就先给这⼏天查找的复习暂时告⼀段落吧。
导学概览总体(⼀)概念查找:在数据集合中查找特定元素的过程查找表(查找结构):同⼀类型数据元素构成的集合静态查找表:只涉及查找,不存在修改适⽤:顺序查找,折半查找,散列查找等动态查找表:动态插⼊和删除,对查找表进⾏修改适⽤:⼆叉排序树,散列查找等所有数据结构都可以看作是查找表,对于折半查找和顺序查找这些都属于查找算法关键字:数据元素中唯⼀标识该元素的某数据项的值主关键字:此关键字能唯⼀表⽰⼀个数据元素次关键字:此关键字⽤以识别若⼲记录(⼀对多)说明:在查找表中每个数据元素就相当于⼀条记录,包含有不同的数据项,例如拿学⽣为例,⼀个学⽣作为数据元素,那么学号,⾝⾼,姓名就是这个元素中的数据项,每个学⽣都有特定的学号,因此学号可以作为关键字。
(当然如果数据项包含⾝份证号,你⽤⾝份证号⾛位关键字也可以)0x01平均查找长度(重点注意:作为查找算法效率衡量的主要指标,那么查找算法的性能分析肯定是重点分析平均查找长度的,因此必须熟练掌握。
提⼀嘴,算法效率的度量前⾯学过时间和空间复杂度,但是算法效率的度量不是只取决于时间和空间复杂度,针对不同的算法还可能会有其他⼀些辅助度量,如查找算法中的平均查找长度。
数据结构:第七章 查找
索引表
22 48 86 1 7 13
查38
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 57 86 53
查找方法比较
ASL 表结构 存储结构
顺序查找 最大
折半查找 最小
关键字输入顺序:45,24,53,12,28,90
45
24
53
12
28
90
9.4 哈希查找
基本思想:在记录的存储地址和它的关键字之间建立一 个确定的对应关系(函数关系);这样,不经过比较, 直接通过计算就能得到所查元素。
一、定义
❖哈希函数——在记录的关键字与记录的存储地址之间 建立的一种对应关系叫哈希函数。
high low
1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
6
56
3
9
19
80
1
4
7
10
5 21 64 88
比较1次 比较2次 比较3次
2
13
5
8
37 75
11
92
比较4次
判定树(二叉排序树):描 述查找过程的二叉树
把当前查找区间的中间位 置上的结点作为根,左子表 和右子表中的结点分别作 为根的左子树和右子树
适用条件:采用顺序存储结构的有序表。 算法实现
❖设表长为n,low、high 和 mid分别指向待查元素所 在区间的上界、下界和中点,k为给定值
❖初始时,令low=1, high=n, mid=(low+high)/2 ❖让k与mid指向的记录比较
数据结构与STL_第7章_查找
动态查找
有时在查询之后,还需要将“查询”结果为 “不在查找表中”的数据元素插入到查找表中; 或者,从查找表中删除其“查询”结果为“在查 找表中”的数据元素。
2015/11/16
《数据结构与STL》
5
1.概述
查找结构
为了提高查找效率,专门为查找操作设置的数据 结构。
2015/11/16
《数据结构与STL》
13
经典的顺序查找
基本思想:
设置顺序表的第一个存储单元为 “哨兵”,依次 从序列尾进行比较,直到比较相等。
2015/11/16
《数据结构与STL》
14
查找方向
a[]
0 1 2 3 4 5 6 7
i
i
8 9 10 11 n
64 21 37 88 19 92 05 64 56 80 75 13
kval = 64
2.二叉排序树的建立
通常,可取二叉链表作为二叉排序树的存储结构 template<class T> class Node { public: T data; Node<T> *lch; Node<T> *rch; Node():lch(NULL),rch(NULL) { }; };
2015/11/16 《数据结构与STL》 38
2015/11/16 《数据结构与STL》 28
…
3.分块查找
分块查找按照索引表分块有序,即前一个子表 内的所有关键字均小于后一个子表内的关键字。
基本思想
首先根据索引表确定待查记录的区间; 然后在确定的主表区间内采用顺序查找或折半查 找。
2015/11/16
《数据结构与STL》
29
数据结构第七章课后习题答案 (1)
7_1对于图题7.1(P235)的无向图,给出:(1)表示该图的邻接矩阵。
(2)表示该图的邻接表。
(3)图中每个顶点的度。
解:(1)邻接矩阵:0111000100110010010101110111010100100110010001110(2)邻接表:1:2----3----4----NULL;2: 1----4----5----NULL;3: 1----4----6----NULL;4: 1----2----3----5----6----7----NULL;5: 2----4----7----NULL;6: 3----4----7----NULL;7: 4----5----6----NULL;(3)图中每个顶点的度分别为:3,3,3,6,3,3,3。
7_2对于图题7.1的无向图,给出:(1)从顶点1出发,按深度优先搜索法遍历图时所得到的顶点序(2)从顶点1出发,按广度优先法搜索法遍历图时所得到的顶点序列。
(1)DFS法:存储结构:本题采用邻接表作为图的存储结构,邻接表中的各个链表的结点形式由类型L_NODE规定,而各个链表的头指针存放在数组head中。
数组e中的元素e[0],e[1],…..,e[m-1]给出图中的m条边,e中结点形式由类型E_NODE规定。
visit[i]数组用来表示顶点i是否被访问过。
遍历前置visit各元素为0,若顶点i被访问过,则置visit[i]为1.算法分析:首先访问出发顶点v.接着,选择一个与v相邻接且未被访问过的的顶点w访问之,再从w 开始进行深度优先搜索。
每当到达一个其所有相邻接的顶点都被访问过的顶点,就从最后访问的顶点开始,依次退回到尚有邻接顶点未曾访问过的顶点u,并从u开始进行深度优先搜索。
这个过程进行到所有顶点都被访问过,或从任何一个已访问过的顶点出发,再也无法到达未曾访问过的顶点,则搜索过程就结束。
另一方面,先建立一个相应的具有n个顶点,m条边的无向图的邻接表。
数据结构-查找
查找
定义
查找是对数据进行处理时经常用到的一种操作。查找是指在 一个数据元素集合中查找出关键字等于某个给点关键字的数据 元素。
应用背景
主要应用于数据处理方面或计算机系统之中,如一般的数据查 找、操作系统的文件查找、应用软件的文字查找(例如,word 、excel等)、数据库系统的查找等。
键树
键树可以用来处理字符串,它是一个多叉树,树中的每一个 结点并不代表一个关键字或元素,而只是代表字符串中的一个 字符。以下面字符串为例,
{a, and, are, be, but, for, from, had, have, her, here}
哈希表
如果能在数据元素的存储位置和其关键字之间建立一个确 定的对应关系h,把具有关键字key的数据元素存储在h(key) 处,那么在查找时,只要集合中存在关键字和key相等的数据 元素,则一定在h(key)的匀称的二叉排序树。其任意结点的左、右子 树的高度大致相同,平衡二叉树的严格定义是平衡二叉树或者 是空树,或者是任何结点的左子树和右子树高度相差最多为1 的二叉树。
平衡二叉树
AVL树
每当插入一个结点时,首先检查是否因插入而破坏了树 的平衡性,如果是,则找出其中最小不平衡子树,在保持 排序树特性的同时,调整最小不平衡子树各结点之间的连 接关系,以达到新的平衡。调整子树的四种方式。 LL型调整
静态查找表
顺序表的查找
从表的一端开始扫描线性表,依次将扫描到的数据元素 和给定的关键字比较,若相等,则查找成功;若直到扫描 结束仍未找到,则查找失败。
有序表的查找
在一个循环过程中,将查找区间中心位置上的数据元素 和给定关键字进行比较,若两者相等,则查找成功;否则 如果前者大于给定关键字,则将查找区域改变成原查找区 的前半段,否则改为原查找区的后半段,然后继续这个过 程,一直持续到查找区间的上界小于查找区间的下界为止。
数据结构第7章查找
于等于根结点的值; (3)其左右子树本身又各是一棵二叉排序树
2021年7月21日
练习
下列图形中,哪个不是二叉排序树 ?
2021年7月21日
练习
中序遍历二叉排序 树后的结果有什么 规律?
45 12
3
37
24 3,12,24,37,45,53,61,78,90,100
• 重复上述操作,直至low>high时,查找失败
2021年7月21日
折半查找(递归算法)
int Search_Bin (SSTable ST, keyType key, int low, int high) { if(low>high) return 0; //查找不到时返回0 mid=(low+high)/2; if(key与ST.elem[mid].key) return mid; else if(key小于ST.elem[mid].key)
……..//递归 else……. //递归 }
2021年7月21日
折半查找的性能分析-判定树
1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
6 < => 3
1
4
7
1 2 9
10 内结点
-1 2 3-4 5 6-7 8 9-10 11 h
1-2 2-3
4-5 5-6
7-8 8-9 10-11 11-
外结点
查找成功时比较次数:为该结点在判定树上的层次数,不超过树 的深度 d = log2 n + 1
查找不成功的过程就是走了一条从根结点到外部结点的路径d或 d-1。
《数据结构实用教程(C语言版)》第7章查找.
返回到本节首页
返回到本节首页
2.折半查找的算法
(1)折半查找的算法如算法7.3所示。 算法7.3 int BinSearch(LineList r[], int n, KeyType k) { int low,high,mid; low=1; high=n; /*置区间初值 */ while(low<=high) /*查找区间 不为空时*/ { mid=(low+high)/2;
数据结构实用教程(C语言版)
中国水利水电出版社
第7章 查找
本章主要介绍以下内容: 静态查找方法,主要介绍顺序查找、折半查找和 分块查找 动态查找方法,主要介绍二叉排序树查找 哈希表查找
本章目录
1 2 3 4 5
7.1 基本概念
7.2 静态查找
7.3 二叉排序树查找
7.4 哈希表查找
7.5 小结
结束
7.1 基本概念
1.查找表 用于查找的数据元素集合称为查找表。查找表 由同一类型的数据元素构成。 2.静态查找表 在查找过程中查找表本身不发生变化,称为静 态查找表。对静态表的查找称为静态查找。 3.动态查找表 若在查找过程中可以将查找表中不存在的数据 元素插入,或者从查找表中删除某个数据元 素,则称这类查找表为动态查找表。对动态 查找表进行的查找称为动态查找。
返回到本节首页
7.2 静态查找
静态查找主要有顺序查找、折半查找、分块 查找三种。 7.2.1顺序查找
7.2.2 折半查找
7.2.3 分块查找
返回到总目录
7.2.1顺序查找
1.顺序查找的主要思想 顺序查找是一种最简单的查找方法,它的基本 思路是:从表的一端开始,用所给定的关键 字依次与顺序表中各记录的关键字逐个比较, 若找到相同的,查找成功;否则查找失败。
数据结构课件第7章 查找技术
//设置查找区间
while (low<=high) //当区间存在时
{
int mid=(low+high)/2;
if (k<r[mid]) high=mid-1; //左半区
else if (k>r[mid]) low=mid+1; //右半区
else return mid;
//查找成功,返回元素序号
i--; return i; }
这个算法可否改进呢?
改进的顺序查找
7.2 基于线性表的查找
基本思想:设置“哨兵”。哨兵就是待查值,将它放 在查找方向的尽头处,免去了在查找过程中每一次比 较后都要判断查找位置是否越界,从而提高查找速度 。例:查找k=35
01 2 3 4 5 6 7 8 9
35 10 15 24 6 12 35 40 98 55
但是,如果调整一下顺序(c, a, b),则
–顺序查找算法的平均查找长度为 0.5×1+0.4×2+0.1×3 = 1.6 <2.1
7.2 基于线性表的查找
一、顺序查找 (Sequential Search)
基本思想:从线性表的一端向另一端逐个将关键码与 给定值进行比较,若相等,则查找成功,给出该记录 在表中的位置;若整个表检测完仍未找到与给定值相 等的关键码,则查找失败,给出失败信息。
折半查找判定树
7.2 基于线性表的查找
折半查找的过程可以用二叉树来描述,树中的每个结 点对应有序表中的一个记录,结点的值为该记录在表 中的位置。通常称这个描述折半查找过程的二叉树为 折半查找判定树,简称判定树。
判定树的构造方法
7.2 基于线性表的查找
⑴ 当n=0时,折半查找判定树为空;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
90
88
不 是二叉排序树
2013-7-26 《数据结构与STL》 36
例:{ 63, 90, 70, 55, 67, 42, 98}
63 63 63 63
90
63
90
70
55
90
70
63
90
63
90 55 42 90 70 67 98
37
55
55
42 67
70
67
2013-7-26
70
《数据结构与STL》
《数据结构与STL》
12
分析程序耗时的关键点
int search(int a[], int n, int key) { 二次比较 for (int i=0; i<n; i++) if(a[i]==key) return i+1; return 0; 1. 训练思维方式? }
2013-7-26
《数据结构与STL》
2013-7-26
《数据结构与STL》
9
第七章 查找
学习内容: 1. 概述 2. 线性表的查找技术 3. 树表的查找技术 4. 散列表的查找技术 5. 查找的应用 6. STL中的相关模版类
《数据结构与STL》 10
顺序查找
题目:
已知有n个整数的序列,查找指定数值key是否在 该序列中,如果存在,找出该数值在序列中的位 置。
2.二叉排序树的插入
Key = 48 Key = 22
P R P R 30 P R
20
10
P R
35
40
R
P R 25 R 23
《数据结构与STL》
2013-7-26
39
2.二叉排序树的插入
如何构造一棵二叉排序树?
若当前结点=NULL,则直接插入;否则将给定 值与当前结点进行比较 若<当前结点,与其左孩子比较 否则,与其右孩子比较 反复执行,直到插入。
a[]
i
i
2 3 4 5 6
《数据结构与STL》
60 21 37 88 19 92 05 64 56 80 75 13
0 1
2013-7-26
7 8
9 10 11 n
15
kval = 60
经典的顺序查找
int search(int a[], int n, int key) { 哨兵 a[0] = key; for (int i=n; a[i]!=key ; i--); return i; 从后向前 查找 }
索引表采用顺序查找
索引采用折半查找
2013-7-26
《数据结构与STL》
30
3.分块查找
优点
插入或删除比较容易
缺点
辅助数组 初始表分块排序
2013-7-26
《数据结构与STL》
31
第七章 查找
学习内容: 1. 概述 2. 线性表的查找技术 3. 树表的查找技术 4. 散列表的查找技术 5. 查找的应用 6. STL中的相关模版类
在 n>50 时,可得近似结果
ASL log2 (n 1) 1 bs
《数据结构与STL》
2013-7-26
25
性能分析:1. 查找不成功
假设 n=2h-1 并且查找概率相等, 则 ASL = h+1 = log2n+1
2013-7-26
《数据结构与STL》
26
2 折半查找
int BinSearch (int r[], int low, int high, int k) { if(low<high) { int mid = (low+high)/2; if(r[min]==k) return mid; else if(r[min]<k) return BinSearch(r, low, mid-1,k); else return BinSearch(r, mid+1, high,k); } }
《数据结构与STL》 32
树表的查找技术
主要内容
二叉排序树 平衡二叉树
2013-7-26
33
二叉排序树
主要内容
1.二叉排序树的定义 2.二叉排序树的建立 3.二叉排序树的查找 4.二叉排序树的删除
2013-7-26
《数据结构与STL》
34
1.二叉排序树的定义
定义 二叉排序树或者是一棵空树;或者是具有如 下特性的二叉树:
2013-7-26
《数据结构与STL》
18
顺序查找(单链表)
first
a1 p
… ai-1
ai p
…
an
p
p
p = first->next; j=1; p = p->next; j++;
2013-7-26 《数据结构与STL》 19
顺序查找(单链表)
template <class T> int SeqSearch(LinkList<T> A, T key) { Node<T> *p=A.first->next; int j=1; while (p!=NULL && p->data!=key) { p= p->next; j++; } if (p==NULL) return 0; else return j; }
2013-7-26 41
《数据结构与STL》
2.二叉排序树的建立
void Create(BiNode<int> *R, int r[], int n) { for (int i=0; i<n; i++) { BiNode<int> * s=new BiNode<int> ; s->data=r[i]; s->lch=s->rch=NULL; InsertBST(R, s); } }
2013-7-26
《数据结构与STL》
23
性能分析:平均查找长度
i 1 2 3 4 5 6 7 8 9 10 11 Ci 3 4 2 3 4 1 3 4 2 3 4 判定树 6
3
1 4 7
9
10
2
2013-7-26
5
《数据结构与STL》
8
11
24
性能分析:1. 查找成功
一般情况下,表长为n的折半查找的判定树的 深度和含有n个结点的完全二叉树的深度相同. 因此 假设 n=2h-1 并且查找概率相等, 则 1 n 1 h n 1 j 1 ASLbs Ci j 2 log2 (n 1) 1 n i 1 n j 1 n
6
1.概述
本章讨论的查找结构 :
⑴ 线性表:适用于静态查找,主要采用顺序查 找技术. 折半查找技术。 ⑵ 树表:适用于动态查找,主要采用二叉排序 树的查找技术。 ⑶ 散列表:静态查找和动态查找均适用,主要 采用散列技术。
2013-7-26
《数据结构与STL》
7
2 查找算法的性能
如何评价一个查找算法的优劣?
动态查找
有时在查询之后,还需要将“查询”结果为 “不在查找表中”的数据元素插入到查找表中; 或者,从查找表中删除其“查询”结果为“在查 找表中”的数据元素。
2013-7-26
《数据结构与STL》
5
1.概述
查找结构
为了提高查找效率,专门为查找操作设置的数据 结构。
2013-7-26
《数据结构与STL》
2013-7-26 《数据结构与STL》 28
…
3.分块查找
基本思想
首先根据索引表确定待查记录的区间; 然后在确定的主表区间内采用顺序查找。
2013-7-26
《数据结构与STL》
29
3.分块查找
性能分析
• 一般情况下,将长度为n的主表分成b块,每块含有s条 记录,即b≈n/s;假设查找概率相等,则每块查找的概率 为1/b,块中每条记录查找的概率为1/s。
《数据结构与STL》
第七章 查找
北京邮电大学 信息与通信工程学院
第七章 查找
学习内容: 1. 概述 1. 概述 2. 线性表的查找技术 3. 树表的查找技术 4. 散列表的查找技术 5. 查找的应用 6. STL中的相关模版类
2013-7-26 《数据结构与STL》 2
1.概述
基本概念
关键码
• 用以标识一个记录的某个数据项。如果该关键码可以 唯一的标识一条记录,称为主关键码;反之为次关键码。
2013-7-26
《数据结构与STL》
3
1.概述
查找
在具有相同类型的记录集中找出满足给定条件 的记录。
在查找集中找到匹配的记录,称为查找成功; 否则,称为查找不成功。一般情况下,查找需要 返回记录的位置。
查找结果
2013-7-26
《数据结构与STL》
4
1.概述
静态查找
不涉及插入和删除操作的查找
2.二叉排序树的建立
通常,可取二叉链表作为二叉排序树的存储结 构 template<class T> class Node { public: T data; Node<T> *lch; Node<T> *rch; Node():lch(NULL),rch(NULL) { }; 38 《数据结构与STL》 };2013-7-26
1. 若它的左子树不空,则左子树上所有结点的 值均小于根结点的值; 2. 若它的右子树不空,则右子树上所有结点的 值均大于根结点的值; 3. 它的左. 右子树也都分别是二叉排序树。