数据结构第八章查找

合集下载

数据结构课件第八章查找优秀课件

数据结构课件第八章查找优秀课件

low
mid
high
1 2 3 4 5 6 7 8 9 10 11
5 13 19 21 37 56 64 75 80 88 92
low mid high 1 2 3 4 5 6 7 8 9 10 11 5 13 19 21 37 56 64 75 80 88 92
查找第i个元素: n+1-i
查找失败:
n+1
iii 比较次数=5
顺序查找方法的ASL
n
对含 n个 有记录的 AS表 L , pici i1
设表中每个元 概素 率的 相 pi查 等 1n找
n
则AS L
i1
pici
1 n i ni1
1n(n1) n2
n1 2
7.2.2 折半查找
1. 折半查找的基本思想 折半查找要求查找表用顺序存储结构存放且各数 据元素按关键字有序(升序或降序)排列,也就是说 折半查找只适用于对有序顺序表进行查找。
查找——也叫检索,是根据给定的某个值,在表中确定一 个关键字等于给定值的记录或数据元素
关键字——是数据元素中某个数据项的值,它可以标识一 个数据元素
查找方法评价
查找速度
占用存储空间多少
算法本身复杂程度
平均查找长度ASL(Average Search Length):为确定记 录在表中的位置,需和给定值进行比较的关键字的个 数的期望值叫查找算法的~
7.2 静态查找
正如本章第一节所述:静态查找是指在静态查找 表上进行的查找操作,在查找表中查找满足条件的数 据元素的存储位置或各种属性。本节将讨论以线性结 构表示的静态查找表及相应的查找算法。
7.2.1 顺序查找
1. 顺序查找的基本思想

数据结构 第8章 查找

数据结构 第8章 查找

2
5
8
11
注:判定树的形态只与表记录个数n有关,与记录的内容无关。
2013-7-28
int BinSearch(JD r[],int n,KeyType k) { int low,high,mid,found; low=1; high=n; found=0; while ((low<=high) && (found==0)) { mid=(low+high)/2; if(k>r[mid].key) low=mid+1; else if(k<r[mid].key) high=mid-1; else found=1; } if(found==1) return(mid); else return(0); }
2013-7-28
– 插入算法
例 {10, 18, 3, 8, 12, 2, 7, 3}
10
10
10
10
10
18
3
18
3 8
18
3
18
8 12
10 3 2 18 8 12 2 7 3
10 18 8 12 2 7 3 3
10 18 8 12
中序遍历二叉排序树可得到一个关键字的有序序列
2013-7-28
A[3]
A[6]
A[9]
A[12]
A[14]
A[17]
A[20]
A[4]
A[7]
A[10]
A[15]
A[18]
A[21]
2013-7-28
int BinSearch(JD r[], int low, int high, KeyType k) { int mid; if (low>hith) return -1; else { mid=(low+high)/2; if (k==r[mid].key) return mid; else if (k>r[mid].key) return (BinSearch(r,mid+1,high,k)); else return (BinSearch(r,low,mid-1,k)); } }

数据结构(八)查找

数据结构(八)查找
122
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

数据结构第8章查找

数据结构第8章查找

动态查找表
1 二叉排序树和平衡二叉树 二叉排序树或者是一颗空树,或者是具 有如下性质的二叉树: (1)若它的左子树非空,则左子树上所有 结点的值均小于根结点的值; (2)若它的右子树非空,则右子树上所有 结点的值均大于根结点的值; (3)其左右子树也是一颗二叉排序树。
43
33
37 37 51 43 33 41 67 40 67
int SearchBin(Seqlist S ,KeyType t) { int mid,low=0,high=S.size-1; while(low<=high) { mid=(low+high)/2; if(t.key==S.list[mid].key) return mid; else if(t.key>S.list[mid].key) low=mid+1; else high=mid-1; } return -1; }
1 43
2
23
37
1
51
1
20
1
30
1
41
1
49
1
67
B-树上的结点可以含有m-1个关键字和m 个指针,查找过程:将数据元素关键字 和跟结点的若干个关键字逐个进行比较, 如果相等,则查找成功返回;否则,将 沿着指针继续查找下层结点。
B-树的生成从空树开始,逐个插入关键 字得到。 根据B-树的特点,其关键字的个数必须 至少为m /2-1,但又不能超过m-1。 每次插入时总是根据其大小在最底层某 个叶子结点上添加一个关键字,如果该 结点的关键字个数小于m-1,则直接插 入,如果发现新插入关键字后,关键字 总数超过m-1,则该结点必须分裂 。
二叉排序树的插入过程: 若二叉排序树非空,先将给定关键字和 根结点关键字进行比较,如果相等,则 停止插入操作并返回;否则,如果小于 根结点关键字,则在左子树上搜得合适 位置插入该元素;如果大于根结点关键 字,则在右子树上搜得合适位置插入该 元素。

数据结构-查找分析

数据结构-查找分析

第八章查找一、填空题1.线性有序表(a1,a2,a3,…,a256)是从小到大排列的,对一个给定的值k,用二分法检索表中与k相等的元素,在查找不成功的情况下,最多需要检索次。

设有100个结点,用二分法查找时,最大比较次数是。

2.折半查找有序表(4,6,12,20,28,38,50,70,88,100),若查找表中元素20,它将依次与表中元素比较大小。

3. 在各种查找方法中,平均查找长度与结点个数n无关的查找方法是。

4、对线性表进行二分查找时,要求线性表必须以方式存储,且结点按关键字排列。

5.顺序查找n个元素的顺序表,若查找成功,则比较关键字的次数最多为_ __次;当使用监视哨时,若查找失败,则比较关键字的次数为__ 。

6.在有序表A[1..12]中,采用二分查找算法查等于A[12]的元素,所比较的元素下标依次为____ _____。

7. 在有序表A[1..20]中,按二分查找方法进行查找,查找长度为5的元素个数是_8. 已知二叉排序树的左右子树均不为空,则_______上所有结点的值均小于它的根结点值,________上所有结点的值均大于它的根结点的值。

9、中序遍历二叉排序树得到的序列是序列(填有序或无序)。

10、从有序表(10,16,25,40,61,28,80,93)中依次二分查找40和61元素时,其查找长度分别为和。

二、单项选择题()1.在表长为n的链表中进行顺序查找,它的平均查找长度为A. ASL=n; B. ASL=(n+1)/2;C. ASL=n+1; D. ASL≈log2(n+1)-1()2.折半查找有序表(4,6,10,12,20,30,50,70,88,100)。

若查找表中元素58,则它将依次与表中比较大小,查找结果是失败。

A.20,70,30,50 B.30,88,70,50C.20,50 D.30,88,50()3.对22个记录的有序表作折半查找,当查找失败时,至少需要比较次关键字。

数据结构之查找课件PPT课件

数据结构之查找课件PPT课件

索引表的定义
struct indexterm {
keytype key; int low, high; }; typedef struct indexterm index[MAXITEM]; 这里的keytype可以是任何相应的数据类型, 如int、float、或char等,在算法中,我们规 定keytype缺省是int类型。
int blksearch (sqlist r, index idx, int k, bn)
{
/*bn为块的个数*/
int i, j, mid, low=1, high=bn, find=0;
while (low<=high && !find)
{
➢ 顺序查找的优点是算法简单、适应面广,且 不要求表中数据有序。缺点是平均查找长度 较大,特别是当n较大时,查找效率较低, 不宜采用。
2.折半查找
➢ 折半查找又称二分查找(Birary search)。 ➢ 假设记录在查找表R[1…n]中按关键字排列有
序。首先用k与查找表中间元素的关键字比 较,。。。。。。
➢ 在实际应用问题中,每个记录一般包含 有多个数据域,查找是根据其中某一个 指定的域进行的,这个作为查找依据的 域称为关键字(key)。
➢ 顺序查找的线性表定义如下:
Typedef struct rectype {
keytype key; itemtype item1 …… }rectype;
➢ 比较结果有三种可能:
⑴ 如果r[m].key>k,说明如果存在欲查找的元素, 该元素一定在数组的前半部分,查找范围缩小了 一半,修改查找范围的的上界high=m-1,继续对 数组的前半部分进行二分查找;

数据结构 第08章 查找

数据结构 第08章  查找

8.2.1 顺序查找
1. 2.
3.
顺序表的顺序查找 单链表的顺序查找 顺序查找算法分析
1 n 1 n(n 1) n 1 ( pi ci ) i O ( n) n i 1 n 2 2 i 1
n
ASL成功
ASL不成功
1 ( pi ci ) ( n) n O(n) i 1 i 1 n
《数据结构(Java版)(第2版)》
n
n
8.2.2 基于有序顺序表的折半查找
1. 2.
折半查找算法描述 折半查找算法实现
《数据结构(Java版)(第2版)》
3.折半查找算法分析
1 21 ASL 成功 (1 2 2 3 3 3 3 4) 2.625 8 8
《数据结构(Java版)(第2版)》
8.2.3 基于索引顺序表的分块查找
1. 2.
索引 分块查找

字典的 分块查 找
《数据结构(Java版)(第2版)》
例8.1 判断一个字符串是否为Java关键字。
《数据结构(Java版)(第2版)》
(2)支持插入和删除操作的索引结构 及其分块查找
《数据结构(Java版)(第2版)》
《数据结构(Java版)(第2Βιβλιοθήκη )》8.1 查找的基本概念
1.
2.
3.
查找操作和查找结果 查找算法 查找算法性能评价
ASL ( pi ci )
i 1 n
《数据结构(Java版)(第2版)》
8.2 基于线性表的查找
8.2.1 顺序查找 8.2.2 基于有序顺序表的折半查找 8.2.3 基于索引顺序表的分块查找
《数据结构(Java版)(第2版)》

数据结构chapter 8 查找.ppt

数据结构chapter 8 查找.ppt

21-Jan-20
20
二叉判定树
折半查找过程可以用一棵二叉树来表示。 树中的每个结点表示查找表中的一个记录 结点的值表示该记录在查找表中的位置 通常情况下称这个描述查找过程的二叉树为二叉判定树。
6
3 1
2
4 5
9 7
8
10 11
21-Jan-20
21
二叉判定树分析(查找成功)
由二叉判定树可见,成功查找结点的过程就是从根结点到树中某 个结点的路径,比较的次数是该结点在二叉判定树上的层次。
折半查找法在查找不成功时和给定值进行比较的次数最多为
log
n 2


1
6
3
9
1
4
7
10
-1
2
3-4
5
6-7
8
9-10
11
1-2
2-3
4-5
5-6
7-8
8-9
10-11
11-
21-Jan-20
23
折半查找的平均查找长度
假定有序表的长度为 n,n=2h-1,h为树的最大深度
由于第j层上的节点数目为 2j-1,这些节点只需要比较j 次
动态查找表的突出特征在于:表的内容本身就是在查 找过程中动态生成的。
对于给定的值key,如果在表中存在关键字等于key记 录,则查找成功,否则就插入关键字等于key的记录。
21-Jan-20
21-Jan-20
4
如何进行查找?
查找过程依赖于数据元素在查找表中的位置。 具体采用什么样的查找方法完全取决于查找表中数据
元素是根据何种关系来组织的。
21-Jan-20

数据结构第八章 查找和排序

数据结构第八章 查找和排序
第八章 查找和排序
本章教学内容
8.1 静态查找表 8.2 动态查找表-二叉排序树 9.2 插入排序
9.2.1 直接插入排序 9.2.3 希尔排序
8.1 静态查找表
查找表(Search Table)是由同一类型的数据元素(或记录)构成的集合。由 于“集合”中的数据元素之间存在着松散的关系,因此查找表是一种应用灵 便的结构。
• ma,5,25,8,50,30,40,20};
• int i,j,x;
• for(i=1;i<8;++i)
• { if (a[i]<a[i-1] )
•{
• x=a[i];

for(j=i-1; x<a[j] ;--j)

; // 记录后移

• a[j+1] =x; // 插入到正确位置
else return SearchBST(T->rchild,key); //在右子树中继续查找
} // SearchBST
二叉排序树的操作-插入 若二叉排序树为空,则插入结点应为根结点 否则,继续在其左、右子树上查找 ✓树中已有,不再插入 ✓树中没有,查找直至某个叶子结点的左 子树或右子树为空为止,则插入结点应 为该叶子结点的左孩子或右孩子
r[i] 初态:
0 1 2 3 4 5 6 7 8 9 10 49 38 65 97 76 13 27 49* 55 04
第1趟 (dk=5)
4193 3287 4695* 9575 7064 1439 2378 4695* 5957 0746
第2趟 (dk=3)
13 2074 49* 5358 0247 49 3585 65 97 76
(2) 若 *p是单支结点

数据结构-第8章-查找(作业)PPT课件

数据结构-第8章-查找(作业)PPT课件

-
25
第8章 查找
40 -1
25 -1
60 -1
0
0
30 50
70 -1
0 80
(a) 一棵平衡二叉排序树
40 -1
25 0
50 -2
0
0
20
30
60 1
58 0 (b) 一棵失去平衡的二叉排序树
图8.7 平衡与不平衡的二叉排序树
-
26
第8章 查找
已知一棵平衡二叉排序树如图8.9(a)所示。在A的左子树 的左子树上插入15后,导致失衡,如图8.9(b)所示。为恢复 平衡并保持二叉排序树的特性,可将A改为B的右子,B原来 的右子改为A的左子,如图8.9(c)所示。这相当于以B为轴, 对A做了一次顺时针旋转。
图8.2 分块查找法示意图
-
11
第8章 查找
分块查找的基本过程如下:
(1) 首先将待查关键字K与索引表中的关键字进行比较, 以确定待查记录所在的块。具体的可用顺序查找法或折半查 找法进行。
(2) 用顺序查找法在相应块内查找关键字为K的元素。
例如,在上述索引顺序表中查找36。首先,将36与索引
表中的关键字进行比较,因为25<36≤58,所以36在第二个块
顺序查找法的过程是:从表中最后一个记录开始,逐个进 行记录的关键字和给定值的比较,若某个记录的关键字和给定 值比较相等,则查找成功,否则查找失败。存储结构通常为顺 序结构,也可为链式结构。
-
4
第8章 查找
//静态查找表的顺序存储结构 typedef struct {
ElemType *elem; //数据元素存储空间基址,建 //表时按实际长度分配,0号单元留空
-

数据结构第八章查找

数据结构第八章查找

第八章查找
一、画出对长度为10的有序表进行折半查找的判定树,并求其等概率时查找成功的平均查找长度。

二、已知如下所示长度为12的表(Jan,Feb,Mar,Apr,May,June,July,Aug,Sep,Oct ,Nov,Dec)。

(1)试按表中元素的顺序依次插入一棵初始为空的二叉排序树,画出插入完成之后的二叉排序树,并求其在等概率的情况下查找成功的平均查找长度。

(2)若对表中元素先进行排序构成有序表,求在等概率的情况下对此有序表进行折半查找时查找成功的平均查找长度。

三、设有一组关键码{1,77,78,5,57,13,12,17},需插入到表长为10的散列表中,散列函数为H(K)=KMOD11。

(1)用H(K)将上述关键码插入散列表,画出建好的散列表结构(假定用链表法解决冲突);
(2)求该散列表的装填因子;
(3) 等概率下,查找成功的平均查找长度为多少?
ASL成功=(1+2*2+4*3+3*4)/10 
=2.9
散列表的装填因子=8/10=0.8
查找成功的平均 查找长度=(5+2*2+3)/ 8 =1.5。

数据结构-查找

数据结构-查找
等,Ci为查找第i个元素所用到的比较次数。
8.2.1 顺序查找
8.2 线性表的查找
1.顺序查找的基本思想
顺序查找是一种最简单的查找方法,它的基本思想是: 从表的一端开始,顺序扫描线性表,依次将扫描到的结点关 键字和待找的值K相比较,若相等,则查找成功,若整个表 扫描完毕,仍末找到关键字等于K的元素,则查找失败。
if (array[mid].key>k)
hig=mid-1;
//在左子区间中查找
else low=mid+1; }
//在右子区间中查找
return(-1); }
//查找失败
例如,假设给定有序表中关键字为 05,13,19,21,37,56,64,74,80,88,92 将 查 找 K=21 和 K=85 的 情况描述为图8-1及图8-2形式。
顺序查找既适用于顺序表,也适用于链表。若用顺序表, 查找可从前往后扫描,也可从后往前扫描,但若采用单链表, 则只能从前往后扫描。另外,顺序查找的表中元素可以是无 序的。
下面以顺序表的形式来描述算法。
2.顺序查找算法实现
struct node
{ …;
int key;
//key为关键字,类型设定为整型
例如,要找关键字为k的元素,则只需求出函数值H(k), H(k)为给定的哈希函数,代表关键字k在存贮区中的地址, 而存贮区为一块连续的内存单元,可用一个一维数组(或链表) 来表示。
例,假设有一批关键字序列18,75,60,43,54,90,46,给定哈希函 数H(k)=k%13,存贮区的内存地址从0到15,则可以得到每 个关键字的散列地址为:
typedef struct
{ int key;
…;
} NODE;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

太原科技大学计算机学院
对以上几种查找方法做出比较: (1)平均查找长度:折半查找最小,分块查找 次之,顺序查找最大; (2)表的结构:顺序查找对有序表、无序表均 适用;折半查找仅适用于有序表;分块查找要 求表中元素是逐段有序的,就是块与块之间的 记录按关键字有序; (3)存储结构:顺序查找和分块查找对向量和 线性链表结构均适用;折半查找只适用于向量 存储结构的表,因而要求表中元素基本不变, 而在需要插入或删除运算时,要移动元素,才 能保持表的有序性,所以影响了查找效率。
太原科技大学计算机学院
8.1.3 索引顺序表的查找
在处理线性表时,如果既希望能够快速查找, 又要经常动态变化,则可以采用索引顺序查找分 块查找方法。索引顺序查找又称分块查找,要求 将待查的元素均匀的分成块,块间按大小排序, 块内不排序。因此需要建立一个块的最大(或最 小)关键字表,称之为“索引表”。 具体而言,假设我们按结点元素关键字升序方 式组织表中各块,则要求第一块中任一结点的关 键字值都小于第二块中所有结点的关键字值;第 二块中任一结点的关键字值都小于第三块中所有 结点的关键字值;如此类推。然后选择每块中的 最大(或最小)关键字值组成索引表。换言之, 索引表中的结点个数等于线性表被分割的块数。
太原科技大学计算机学院 采用折半查找,当查找成功时,最 少比较次数为一次,如在上例中查找关 键字值为18的结点,只需一次比较。最 多经过log2n次比较之后,待查找子表要 么为空,要么只剩下一个结点,所以要 确定查找失败需要log2n次或log2n+1次比 较。可以证明,折半查找的平均查找长 度是: ASL=(n+1)/n log2(n+1) -1
太原科技大学计算机学院 从折半查找的平均查找长度ASL来看, 当表的长度n很大时,该方法尤其能显示 出其时间效率。但由于折半查找的表仍 是线性表,若经常要进行插入、删除操 作,则元素排列费时太多,因此折半查 找比较适合于一经建立就很少改动而又 需要经常查找的线性表,较少查找而又 经常需要改动的线性表可以采用链接存 储,使用顺序查找。
2
3 4 5 6 7 8 9
38
60
17 29 38
H(38-1) mod 11 = 4
H(38+3) mod 11 = 8 : 伪随机
10
太原科技大学计算机学院 (2)链地址法 链地址法解决冲突的方法:把具有相同散 列地址的键值存放在同一个链表中,称为同义 词链表。
(m为表长, 设m=11) 若发生冲突,设发生冲突的地址为 p , 则沿着一个 探查序列逐个探查,那么,探查的地址序列为
P+1, P+2, P+3 ,…, m-1 , 0, 1, …, P-1.
太原科技大学计算机学院
3、 处理冲突的方法 (1) 开放定址法:二次探测法和伪随机探测法
设散列函数 H(K)=K MOD m (m为表长)
若 k<r[mid].key, 则high=mid―1,重复(1); 若k>r[mid].key, 则low=mid+1,重复(1); 直到成功或不成功(此时low>high)。
太原科技大学计算机学院
具体算法如下: Void binsrch(struct node r[ ],int n,int k) { int mid,low,high,find; low=1; high=n;find=0; /*置区间初值*/ while ((low<=high) && (!find)) { mid=(low+high)/2; /*求中点*/ if (k= = r[mid].key) find=1; /*已查到*/ else if(k>r[mid].key ) low=mid+1; /*在后半区间查找*/ else high=mid-1; /*在前半区间查找*/ } if (find) return (mid); /*查找成功,返回找到元素的位置*/ else return (0); /*查找不成功,返回0标记*/ }
{ int i=n;
ST.elem[0].key=key;
while(ST.elem[i].key!=key) i- -;
return i;
/*从表尾往前查*/
}
太原科技大学计算机学院
顺序查找的性能分析: 查找成功时的平均查找次数为:
ASL=
=(1+2+3+4+……+n)/n=(n+1)/2
n i 1
太原科技大学计算机学院
每进行一次比较,要么找到要查找的元素,要么 将查找的范围缩小一半。如此递推,直到查找成 功或把要查找的范围缩小为空(查找失败)。 设表的长度为n,表的被查找部分的头为low, 尾为high,初始时,low=1,high=n,k为关键字的 值。
( 2)若k=r[功时的比较次数为: Pi Ci =
1 n (n 1) n i 1
=n+1
则顺序查找的平均查找长度为:
ASL=((n+1)/2+n+1)/2=(n+1)3/4
太原科技大学计算机学院
8.1.2 有序表的查找 折半查找又称二分查找,是针对有序表进行查找 的简单、有效而又较常用的方法。所谓有序表,即 要求表中的各元素按关键字的值有序(升序或降序) 存放。 折半查找不像顺序查找那样,从第一个记录开始 逐个顺序搜索,其基本思想是:首先选取表中间位 置的记录,将其关键字与给定关键字k进行比较,若 相等,则查找成功;否则,若k值比该关键字值大, 则要找的元素一定在表的后半部分(或称右子表), 则继续对右子表进行折半查找;若k值比该关键字值 小,则要找的元素一定在表的前半部分(左子表), 同样应继续对左子表进行折半查找。
太原科技大学计算机学院
第 八章 查找
8.1 静态查找表 8.1.1 顺序表的查找 8.1.2 有序表的查找 8.1.3 索引顺序表的查找 8.2 动态查找表 8.2.1 二叉排序树查找 8.3 哈希表 8.3.1 什么是哈希表 8.3.2 哈希函数的构造方法 8.3.3 处理冲突的方法
太原科技大学计算机学院
太原科技大学计算机学院
8.3 哈希表
8.3.1 什么是哈希表 哈希法又名散列法,因其英文单词Hash而得名,是 一种完全不同的查找方法。前面我们所介绍的三种查 找方法的共同特点在于:通过对关键字的一系列比较, 逐步缩小查找范围,直到确定结点的存储位置或确定 查找失败。 哈希法则希望不经过任何比较,一次存取就能得 到所查元素,因此必须在记录的存储位置和它的关键 字之间建立一个确定的对应关系,使得每个关键字和 结构中一个唯一的存储位置相对应,这样查找时只需 对结点的关键字进行某种运算就能确定结点在表中的 位置。我们称这个对应关系为哈希函数,按这个思想 建立的表为哈希表。
太原科技大学计算机学院 8.3.2 哈希函数的构造方法
一个好的哈希函数应使函数值均匀的分布在存储空 间的有效地址范围内,以尽可能减少冲突。但鉴于 实际问题中关键字的不同,没法构造出统一的哈希 函数。因此,构造哈希函数的方法多种多样,这里 介绍一些常用的、计算较为简便的方法。
(1) 直接定址法——取关键字或关键字的某个线性 函数值为散列地址,即 H(K)=K 或 H(K) =A*K+B;(其中A、B为常数) 例如上例中,建立的哈希函数H(学号)=学号-9900采 用的就是这样的方法。但这种函数只适用于给定的 一组关键字为关键字集合中的全体元素的情况,故 不常用。
太原科技大学计算机学院
顺序查找数据结构: typedef struct{
int key;
float info;
}ElemType;
Typedef struct{
ElemType *elem;
int length;
}SSTable;
太原科技大学计算机学院 顺序查找的算法:
int Search_seq(SSTable ST[ ], int n, int key)
设散列函数 H(k)=k MOD 11,求: 60、17、29、 38在散列表中的位置。 H(60)= 60 mod 11 = 5 H(17)= 17 mod 11 = 6 H(29)= 29 mod 11 = 7 H(38)= 38 mod 11 = 5,H(38+1) mod 11 = 6
0 1
太原科技大学计算机学院
假定某教室有35个座位,如果不加限定让学 生任意就座,则要找某个学生时就要将待找学 生与当前座位上的学生一一做比较,这就是我 们前面所介绍的查找方法的大致思路。而哈希 法则要限定学生所坐的位置,比如可规定学生 座位的编号应与其学号的末两位相同,则学号 为993605的学生应坐编号为5的座位。这样我 们要找某个学生时只需根据其学号的末两位到 相应座位上去找即可,不必一一比较了。在这 个例子里,学生好比记录,学号则为关键字, 对关键字进行的操作则是取其末两位,用以确 定记录的位置。
太原科技大学计算机学院
例如要找关键字为k的元素,则先用折半查找法由索 引表查出k所在的块,再用顺序查找法在对应的块中找 出k。若要找关键字值为41的元素,则先由索引表查出 41在第二块中(29<41<64),再在第二块中找到41。 由此我们可以总结:分块查找分两步进行,第一步 确定要查找结点在表中的哪一块,第二步在确定的块 中找到该结点。 分块查找的平均查找长度为: ASL=ASLb+ASLe 其中ASLb是折半查找的平均查找长度,ASLe是用顺 序查找法查块内元素的平均查找长度。设每块中有s个 元素,可以近似的得到: ASL=(n/s+s)/2+1 可以看出分块查找的平均查找长度位于顺序查找和折 半查找之间。
太原科技大学计算机学院
8.2 动态查找表
8.2.1 二叉排序树查找
二叉排序树的概念: 二叉排序树或者是一棵空树;或者是具有以下性 质的二叉树: (1)若它的左子树不空,则左子树上所有结点的 值均小于它的根结点的值; (2)若它的右子树不空,则右子树上所有结点的 值均大于它的根结点的值; (3)它的左子树、也分别为二叉排序树。
相关文档
最新文档