数据结构查找技术1-静态查找表
c语言数据结构查找算法大全

printf("This number does not exist in this array.\n");
else
printf("a[%d]=%d\n",p,x);
}
9.2.2 折半查找(二分查找)
使用折半查找必须具备两个前提条件:
(1)要求查找表中的记录按关键字有序(设,从小到大有序) (2)只能适用于顺序存储结构
}
※折半查找算法性能分析:
在折半查找的过程中,每经过一次比较,查找范围都要缩小一半,所 以折半查找的最大查找长度为
MSL=[log2 n]+1
当n足够大时,可近似的表示为log2(n)。可见在查找速度上,折半查找 比顺序查找速度要快的多,这是它的主要优点。
结论:折半查找要求查找表按关键字有序,而排序是一 种很费时的运算;另外,折半查找要求表是顺序存储的,为 保持表的有序性,在进行插入和删除操作时,都必须移动大 量记录。因此,折半查找的高查找效率是以牺牲排序为代价 的,它特别适合于一经建立就很少移动、而又经常需要查找 的线性表。
查找技术分为: 1 静态查找表技术 顺序查找、折半查找、索引顺序查找 2 动态查找表技术 二叉查找树 3哈希表技术 哈希表技术
※查找算法的衡量指标
在查找一个记录时所做的主要操作是关键字的比较, 所以通常把查找过程中对关键字的平均比较次数作为衡量 一个查找算法效率优劣的标准,并称平均比较次数为平均 查找长度(Average Search Length)。平均查找长度的 定义为:
high2=N-1;
/*N为查找表的长度,high2为块在表中的末地址*/
else
high2=ID[low1+1].addr-1;
最新静态查找表动态查找表哈希查找表

ST.elem[i]. Key <= ST.elem[i+1]. Key; i= 1, 2 ,…n-1 查找范围 :low(低下标)= 1;
high(高下标)= 7 (初始时为最大下标 n ); 比较对象:中点元素,其下标地址为
mid = (low+high)/ 2 =4
二分法思想: (1)用给定的k与有序表的中间位置mid上的结 点的关键字比较,若相等,查完 (2)若r[mid].key < k,则在左子表中继续进行 二分查找;若(r[mid].key > k),则执行(3 ) (3)在右子表中继续进行二分查找。
有序表的查找
查找 key = 9 的结点所在的数组元素的下标地址。
有序表的查找
mid= 4
4 8 9 10 11 13 19
0 1 23
low=1
4 5 67
high=7
mid= 4
4 8 9 10 11 13 19 20
0 1 23
low=1
4 5 678
high=8
有序表的查找
性能分析
1、最坏情况分析:
定理:在最坏情况下,二分查找法的查找有序表的最大的比较次数为
<
5 <> 45
>
7 <> 6
8
<>
78
有序表的查找
性能分析
2、平均情况分析(在成功查找的情况下):设每个 结点的查找概率相同 都为1/n。为了简单起见,设结点个数为 n = 2t -1 (t = 1,2,3 …… )。 ∴ 经过 1 次比较确定的结点个数为 1 = 20 个 ,红色标识的结点。 经过 2 次比较确定的结点个数为 2 = 21 个 ,绿色标识的结点。 经过 3 次比较确定的结点个数为 4 = 22 个 ,灰色标识的结点。
静态查找

查找的基本方法
基于线性表的查找法 ——顺序查找法、折半查找法、分块查找法 比较式查找法 基于树的查找法 —— ——二叉排序树、平衡二叉排序树、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)——可以 )主关键字( ) 可以 唯一地标识一个记录的关键字称为主关键 如图的“学号” 字。如图的“学号”。
基本概念
数据结构_查找原理及典型的查找算法

3.对非线性(树)结构如何进行折半查找? 可借助二叉排序树来查找(属动态查找表形式)。
9.1.2 有序表的查找
折半查找过程可以描述为一棵二叉树
折半查找的判定树 如:(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
总之:
二叉排序树既有类似于折半查找的特性,又采用了链 表存储,它是动态查找表的一种适宜表示。
一、二叉排序树
(3)构造过程: 例:输入序列{45,12,37,3,53,100,24}
45
12
53
3
37
100
24
一、二叉排序树
(2)非递归查找过程 BiTree SearchBST(BiTree T,KeyType key){
CH9 查找
查找的基本概念 9.1 静态查找表
9.1.1 顺序查找 9.1.2 有序表的查找 9.1.3 索引顺序表的查找
9.2 动态查找表
9.2.1 二叉排序树和平衡二叉树 9.2.2 B-和B+树
9.3 哈希表
查找的基本概念
1.查找表 2.查找
关键字 主关键字 次关键字
}
9.2.1 二叉排序树和平衡二叉树
一、二叉排序树 二、平衡二叉树
一、二叉排序树
1.定义、特点、构造过程
(1)定义 二叉排序树或者是一棵空树,或是具有下列性质的二叉树:
若左子树非空,则左子树上所有结点的值均小于它的 根结点的值。
若右子树非空,则右子树上所有结点的值均大于它的 根结点的值。
有序/无序表 有序表
顺序/链式存 储
顺序存储
分块查找 介于二者之间 表中元素逐段有序 顺序/链式存储
数据结构(三十七)查找的基本概念

数据结构(三⼗七)查找的基本概念 ⼀、查找的基本概念 1.查找(Searching):就是在由⼀组记录组成的集合中寻找关键字值等于给定值的某个记录,或是寻找属性值符合特定条件的某些记录。
若表中存在这样⼀个记录,则称查找是成功的,此时查找的结果给出整个记录的信息,或指⽰该记录在查找表中的位置。
若表中不存在关键字等于给定值的记录,则称查找不成功,此时查找的结果可以给出⼀个“空”记录或者“空”指针。
2.查找表(Search Table):是⼀种以同⼀类型的记录构成的集合为逻辑结构,以查找为核⼼运算的数据结构。
3.关键字(Key):是数据元素中某个数据项的值,⼜称为键值,⽤它可以标识⼀个数据元素,也可以标识⼀个记录的某个数据项(字段)。
4.主关键字(Primaty Key):可以惟⼀地标识⼀个记录的关键字。
对于那些可以标识多个数据元素(或记录)的关键字,称为次关键字(Secondary Key)。
⼆、查找表的分类 1.静态查找表(Static Search Table):只作查找操作的查找表。
主要操作有:查询某个“特定的”数据元素是否在查找表中检索某个“特定的”数据元素和各种属性。
2.动态查找表(Dynamic Search Table):动态表的特点是表结构本⾝是在查找过程中动态⽣成的。
同时在查找过程中同时插⼊查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素。
主要操作有:查找时插⼊数据元素查找时删除数据元素 三、静态表和动态表的代表 静态表:顺序查找、⼆分查找、插值查找、斐波那契查找、线性索引查找 动态表:⼆叉排序树、平衡⼆叉树、B树、散列表。
数据结构查找表

如何进行查找
在一个结构中查找某个数据元素的过程,依赖于数据 元素在结构中的地位,即依赖于数据元素的组织关系 (人为的)。
在计算机中进行查找的方法随数据结构不同而不同。 即随查找表的不同而不同。
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; }
查找表结构——精选推荐

查找表结构查找表介绍在⽇常⽣活中,⼏乎每天都要进⾏⼀些查找的⼯作,在电话簿中查阅某个⼈的电话号码;在电脑的⽂件夹中查找某个具体的⽂件等等。
本节主要介绍⽤于查找操作的数据结构——查找表。
查找表是由同⼀类型的数据元素构成的集合。
例如电话号码簿和字典都可以看作是⼀张查找表。
⼀般对于查找表有以下⼏种操作:在查找表中查找某个具体的数据元素;在查找表中插⼊数据元素;从查找表中删除数据元素;静态查找表和动态查找表在查找表中只做查找操作,⽽不改动表中数据元素,称此类查找表为静态查找表;反之,在查找表中做查找操作的同时进⾏插⼊数据或者删除数据的操作,称此类表为动态查找表。
关键字在查找表查找某个特定元素时,前提是需要知道这个元素的⼀些属性。
例如,每个⼈上学的时候都会有⾃⼰唯⼀的学号,因为你的姓名、年龄都有可能和其他⼈是重复的,唯独学号不会重复。
⽽学⽣具有的这些属性(学号、姓名、年龄等)都可以称为关键字。
关键字⼜细分为主关键字和次关键字。
若某个关键字可以唯⼀地识别⼀个数据元素时,称这个关键字为主关键字,例如学⽣的学号就具有唯⼀性;反之,像学⽣姓名、年龄这类的关键字,由于不具有唯⼀性,称为次关键字。
如何进⾏查找?不同的查找表,其使⽤的查找⽅法是不同的。
例如每个⼈都有属于⾃⼰的朋友圈,都有⾃⼰的电话簿,电话簿中数据的排序⽅式是多种多样的,有的是按照姓名的⾸字母进⾏排序,这种情况在查找时,就可以根据被查找元素的⾸字母进⾏顺序查找;有的是按照类别(亲朋好友)进⾏排序。
在查找时,就需要根据被查找元素本⾝的类别关键字进⾏排序。
具体的查找⽅法需要根据实际应⽤中具体情况⽽定。
顺序查找算法(C++)静态查找表既可以使⽤顺序表表⽰,也可以使⽤链表结构表⽰。
虽然⼀个是数组、⼀个链表,但两者在做查找操作时,基本上⼤同⼩异。
顺序查找的实现静态查找表⽤顺序存储结构表⽰时,顺序查找的查找过程为:从表中的最后⼀个数据元素开始,逐个同记录的关键字做⽐较,如果匹配成功,则查找成功;反之,如果直到表中第⼀个关键字查找完也没有成功匹配,则查找失败。
数据结构(八)查找

99
250
110
300
280
类C程序实现: void InsertBST(*&t,key) //在二叉排序树中插入查找关键字key { if(t= = NULL){ t=new BiTree; t->lchild=t->rchild=NULL; t->data=key; return; } if(key<t->data ) InsertBST(t->lchild,key); else InsertBST (t->rchild, key ); } void CreateBiTree(tree,d[ ],n) //n个数据在数组d中,tree为二叉排序树根 { tree=NULL; for(i=0;i<n;i++) InsertBST(tree,d[i]); }
p q
void delete(*&p) { if(p->rchild = = NULL) { q=p; p=p->lchild; delete q; } else if(p->lchild= =NULL) { q=p; p=p->rchild; delete q; } else { q=p; s=p->lchild; while(s->rchild!=NULL) {q=s; s=s->rchild;} p->data=s->data; if(q!=p) q->rchild=s->lchild; else q->lchild=s->lchild; } delete s; }
在xL中选值最大的代替x,该数据按二叉排序树的性质应在 最右边。
f x f s c
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
灵便的结构。
整理ppt
3
对查找表经常进行的操作:
• 1)查询某个“特定的”数据元素是 否在查找表中;
• 2)检索某个“特定的”数据元素的 各种属性;
• 3)在查找表中插入一个数据元素;
• 4)从查找表中删去某个数据元素。
整理ppt
4
查找的基本概念
静态查找表 不涉及插入和删除操作的查找 。 动态查找表 涉及插入和删除操作的查找。
整理ppt
11
9.1 静态查找表
整理ppt
12
ADT StaticSearchTable {
数据对象D:D是具有相同特性的数
据元素的集合。每个数 据元素含有类型相同的 关键字,可唯一标识数 据元素。
数据关系R:数据元素同属一个集合。
整理ppt
13
基本操作 P:
Create(&ST, n);
Destroy(&ST);
i+&turn i;
else return 0;
}
整理ppt
24
改进的顺序查找
基本思想:设置“哨兵”。哨兵就是待查值,将它放 在查找方向的尽头处,免去了在查找过程中每一次比 较后都要判断查找位置是否越界,从而提高查找速度 。例:查找key=35
01 2 3 4 5 6 7 8 9
整理ppt
7
查找
根据给定的某个值,在查找表中确定一个 其关键字等于给定值的数据元素或(记录)。
若查找表中存在这样一个记录,则称
“查找成功”。查找结果给出整个记录的
信息,或指示该记录在查找表中的位置;
否则称“查找不成功”。查找结果给出
“空记录”或“空指针”。
整理ppt
8
如何进行查找?
查找的方法取决于查找表的结构。
int length; // 表的长度
} SSTable;
整理ppt
19
数据元素类型的定义为:
typedef struct { keyType key; // 关键字域
……
// 其它属性域
} ElemType ;, TElemType ;
整理ppt
20
一、顺序查找表 二、有序查找表 三、索引顺序表
整理ppt
21
一、顺序查找表
以顺序表或线性链表 表示静态查找表
整理ppt
22
顺序查找 (线性查找)
基本思想:从线性表的一端向另一端逐个将关键码与 给定值进行比较,若相等,则查找成功,给出该记录 在表中的位置;若整个表检测完仍未找到与给定值相 等的关键码,则查找失败,给出失败信息。
例:查找key=35
01 2 3 4 5 6 7 8 9
10 15 24 6 12 35 40 98 55
i ii ii i
整理ppt
23
顺序查找 (线性查找)
int SeqSearch1(int r[ ], int n, int key)
//数组r[1] ~ r[n]存放查找集合
{
i = 1; while (i<=n&& r[i] != key)
静态查找适用于:查找集合一经生成,便只对其进行 查找,而不进行插入和删除操作,或经过一段时间的 查找之后,集中地进行插入和删除等修改操作;
动态查找适用于:查找与插入和删除操作在同一个阶 段进行,例如当查找成功时,要删除查找到的记录, 当查找不成功时,要插入被查找的记录。
整理ppt
5
关键字
是数据元素(或记录)中某个数据项 的值,用以标识(识别)一个数据元 素(或记录)。
35 10 15 24 6 12 35 40 98 55
哨兵
ii i i
查找方向
整理ppt
25
改进的顺序查找
初始条件:静态查找表ST存在,Visit
是对元素操作的应用函数;
操作结果:按某种次序对ST的每个元
素调用函数Visit()一次且仅 一次,一旦Visit()失败,则 操作失败。
整理ppt
18
假设静态查找表的顺序存储结构为
typedef struct {
ElemType *elem;
// 数据元素存储空间基址,建表时 // 按实际长度分配,0号单元留空
Search(ST, key);
Traverse(ST, Visit());
} ADT StaticSearchTable
整理ppt
14
Create(&ST, n);
操作结果:构造一个含n个数据元素
的静态查找表ST。
整理ppt
15
Destroy(&ST); 初始条件:静态查找表ST存在; 操作结果:销毁表ST。
由于查找表中的数据元素之间不存在明
显的组织规律,因此不便于查找。
为了提高查找的效率, 需要在查找表中
的元素之间人为地 附加某种确定的关系,
换句话说, 用另外一种结构来表示查找表。
整理ppt
9
9.1 静态查找表
主要采用顺序查找技术和折半查找技术。
9.2 动态查找树表
主要采用二叉排序树的查找技术。
9.3 哈希表
静态查找和动态查找均适用, 主要采用散列技术。
整理ppt
10
查找算法的性能
查找算法时间性能通过关键码的比较次数来度量。
关键码的比较次数与哪些因素有关呢?
平均查找长度:将查找算法进行的关键码的比较次数
的数学期望值定义为平均查找长度,即:
n
ASL
=
i =1
pi
ci
ci取决于算法;pi与算法无关,取决于具体应用。如果pi 是已知的,则平均查找长度只是问题规模的函数。
若此关键字可以识别唯一的一个记 录,则称之谓“主关键字”。
若此关键字能识别若干记录,则称
之谓“次关键字”。
整理ppt
6
职工号 0001 0002 0003 0004 0005
姓名 王刚 张亮 刘楠 齐梅 李爽
性别 男 男 女 女 女
年龄 38 25 47 25 50
工作时间 1990.4 2003.7 1979.9 2003.7 1972.9
第九章 查找
整理ppt
1
本章的主要内容是:
➢查找的基本概念(难度系数*) ➢静态查找表(难度系数**) ➢动态查找表(难度系数****) ➢哈希表(难度系数***)
整理ppt
2
查找的基本概念
何谓查找表 ?
查找表是由同一类型的数据元素 (或记录)构成的集合。
由于“集合”中的数据元素之间存在
着松散的关系,因此查找表是一种应用
整理ppt
16
Search(ST, key);
初始条件:静态查找表ST存在,key 为
和查找表中元素的关键字类 型相同的给定值;
操作结果:若 ST 中存在其关键字等于
key 的数据元素,则函数值 为该元素的值或在表中的位
置,否则为“空”。
整理ppt
17
Traverse(ST, Visit());