数据结构“查找表”分析

合集下载

数据结构教案第9章 查找

数据结构教案第9章 查找

●性能分析 定义:为了确定记录在查找表中的位置,需和给定值进行比 较的关键字个数的期望值称为查找算法在查找成功时的平均查找 长度。
ASL = ∑ Pi C i
i =1
n
其中:Pi为查找表中第i个记录的概率;Ci为找到第i个记 录的比较次数; 查找成功的平均查找长度:
1 n n +1 ASL = ∑ (n − i + 1) = 2 n i =1
索引表 最大关键字 起始地址
22 48 86 1 7 13
22 12 13 8 9 20 33 42 44 38 24 48 60 58 74 49 86 53
9.2动态查找表 特点:表结构本身是在查找过程中动态生 成的,即对于给定值key,若表中存在其关键 字等于key的记录,则查找成功返回;否则插 入关键字等于key的记录。
10 10 9 15 9 17 17 15
a
16
作业:(P55)9.9, 9. 33
9.3哈希表 9.3.1什么是哈希表 哈希函数:在记录的关键字和它的存储位置之间建立 一个确定的对应关系f,使每个关键字和结构中一个 唯一的存储位置相对应,称对应关系f为哈希(Hash) 函数。 哈希表:按哈希函数建立的表称为哈希表。
void Delete(BiTree &p){ if(!p->rchild) { q=p; p=p->lchild; free(q); } else if(!p->lchild) { q=p; p=p->rchild; free(q); } else{ q=p; s=p->lchild; while(s->rchild) {q=s; s=s->rchild;} p->data=s->data; if(q!=p) q->rchild=s->lchild; \*q!=p正常情况 else q->lchile= s->lchild; \* q=p意外者,p的左子树的根没有右子树 free(s); }\\else }

数据结构_查找原理及典型的查找算法

数据结构_查找原理及典型的查找算法
无法实现!因全部元素的定位只能从头指针head开 始,是一种非随机存取结构。
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)定义 二叉排序树或者是一棵空树,或是具有下列性质的二叉树:
若左子树非空,则左子树上所有结点的值均小于它的 根结点的值。
若右子树非空,则右子树上所有结点的值均大于它的 根结点的值。
有序/无序表 有序表
顺序/链式存 储
顺序存储
分块查找 介于二者之间 表中元素逐段有序 顺序/链式存储

查找表的名词解释

查找表的名词解释

查找表的名词解释查找表(Lookup Table),也称为查询表或索引表,是一种数据结构,用于快速查找和访问数据。

在计算机科学领域,查找表被广泛应用于数据检索、算法优化和数据库管理等方面。

一、查找表的定义和组成查找表是由键-值(Key-Value)对组成的数据结构,其中键是数据的唯一标识符,而值则是与键相关联的数据项。

通过在查找表中根据给定键的搜索,可以快速找到与之对应的值。

查找表可以使用不同的数据结构来实现,如数组、哈希表和二叉搜索树等。

二、查找表的作用和优势查找表允许快速访问和更新数据,因此在很多应用中都发挥着关键作用。

以下是一些查找表的常见应用和优势:1. 数据检索:查找表是一种高效的数据检索结构,可以在大量数据中快速地查找所需信息。

通过将数据存储在查找表中,可以避免遍历整个数据集的复杂性。

2. 索引优化:在数据库管理中,查找表常用于优化数据的索引操作。

通过构建适当的查找表,可以大大减少数据库查询的时间复杂度,提高系统性能。

3. 稀疏矩阵:查找表可用于表示稀疏矩阵,即大部分元素为零的矩阵。

通过将非零元素的位置和值存储在查找表中,可以节省存储空间并提高矩阵运算效率。

4. 字符串匹配:查找表被广泛应用于字符串匹配算法,如AC自动机和Trie树。

这些算法利用查找表来快速搜索和匹配输入的字符串。

三、查找表的实现方式查找表可以通过不同的数据结构来实现,每种实现方式都有其适用的场景和特点。

1. 数组实现:数组是实现查找表最简单和常见的方式之一。

通过将键和值分别存储在两个数组中,可以通过键的索引快速访问对应的值。

然而,数组实现的查找表通常要求键是整数或可映射到整数的类型。

2. 哈希表实现:哈希表是一种基于散列函数的查找表实现方式。

通过将键映射到哈希表的槽位,可以快速访问对应的值。

哈希表实现的查找表具有良好的平均查找时间,但在处理冲突和维护散列函数方面需要额外的操作。

3. 二叉搜索树实现:二叉搜索树是一种有序的查找表实现方式。

数据结构查找表

数据结构查找表

如何进行查找

在一个结构中查找某个数据元素的过程,依赖于数据 元素在结构中的地位,即依赖于数据元素的组织关系 (人为的)。
在计算机中进行查找的方法随数据结构不同而不同。 即随查找表的不同而不同。
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++)静态查找表既可以使⽤顺序表表⽰,也可以使⽤链表结构表⽰。

虽然⼀个是数组、⼀个链表,但两者在做查找操作时,基本上⼤同⼩异。

顺序查找的实现静态查找表⽤顺序存储结构表⽰时,顺序查找的查找过程为:从表中的最后⼀个数据元素开始,逐个同记录的关键字做⽐较,如果匹配成功,则查找成功;反之,如果直到表中第⼀个关键字查找完也没有成功匹配,则查找失败。

大学数据结构课件--第9章 查找

大学数据结构课件--第9章 查找
——这种既查找又插入的过程称为动态查找。
二叉排序树既有类似于折半查找的特性,又采用了链表存储,它是动态 查找表的一种适宜表示。
注:若数据元素的输入顺序不同,则得到的二叉排序树形态 也不同!
17
二、二叉树的插入和删除操作
1、二叉排序树的插入和查找操作
例:输入待查找的关键字序列=(45,24,53,12,90)
折半查找举例:
已知如下11个元素的有序表:
(05 13 19 21 37 56 64 75 80 88 92), 请查找关键字为21和85的数据元素。
Low指向待查元 素所在区间的下 界
mid指向待查元素所在 high指向待查元素所
区间的中间位置
在区间的上界
8
9.1.2 折半查找(又称二分查找或对分查找)
balance。这样,可以得到AVL树的其它性质:
❖ 任一结点的平衡因子只能取:-1、0 或 1;如果树中任 意一个结点的平衡因子的绝对值大于1,则这棵二叉树 就失去平衡,不再是AVL树;
24
三、平衡二叉树
例:判断下列二叉树是否AVL树?
-1
1
-1
0
0
1
0
(a) 平衡树
2
-1
0
0
1
0
(b) 不是平衡树
(1)p为叶子结点,只需修改p双亲f的指针f->lchild=NULL或 f->rchild=NULL
(2)P只有左子树或右子树 ❖ P只有左子树,用P的左孩子代替P ❖ P只有右子树,用P的右孩子代替P
(3)P左、右子树均非空 (P左子树的根C的右子树分支找到S,S的右子树为空) ❖ P的左子树成为双亲f的左子树,P的右子树成为S的右子树 ❖ S的左子树成为S的双亲Q的右子树,用S取代p; 若C无右子树,用C取代p

数据结构(八)查找

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

数据结构中的查找算法总结

数据结构中的查找算法总结

数据结构中的查找算法总结静态查找是数据集合稳定不需要添加删除元素的查找包括:1. 顺序查找2. 折半查找3. Fibonacci4. 分块查找静态查找可以⽤线性表结构组织数据,这样可以使⽤顺序查找算法,再对关键字进⾏排序就可以使⽤折半查找或斐波那契查找等算法提⾼查找效率,平均查找长度:折半查找最⼩,分块次之,顺序查找最⼤。

顺序查找对有序⽆序表均适⽤,折半查找适⽤于有序表,分块查找要求表中元素是块与块之间的记录按关键字有序动态查找是数据集合需要添加删除元素的查找包括: 1. ⼆叉排序树 2. 平衡⼆叉树 3. 散列表 顺序查找适合于存储结构为顺序存储或链接存储的线性表。

顺序查找属于⽆序查找算法。

从数据结构线形表的⼀端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相⽐较,若相等则表⽰查找成功 查找成功时的平均查找长度为: ASL = 1/n(1+2+3+…+n) = (n+1)/2 ; 顺序查找的时间复杂度为O(n)。

元素必须是有序的,如果是⽆序的则要先进⾏排序操作。

⼆分查找即折半查找,属于有序查找算法。

⽤给定值value与中间结点mid的关键字⽐较,若相等则查找成功;若不相等,再根据value 与该中间结点关键字的⽐较结果确定下⼀步查找的⼦表 将数组的查找过程绘制成⼀棵⼆叉树排序树,如果查找的关键字不是中间记录的话,折半查找等于是把静态有序查找表分成了两棵⼦树,即查找结果只需要找其中的⼀半数据记录即可,等于⼯作量少了⼀半,然后继续折半查找,效率⾼。

根据⼆叉树的性质,具有n个结点的完全⼆叉树的深度为[log2n]+1。

尽管折半查找判定⼆叉树并不是完全⼆叉树,但同样相同的推导可以得出,最坏情况是查找到关键字或查找失败的次数为[log2n]+1,最好的情况是1次。

时间复杂度为O(log2n); 折半计算mid的公式 mid = (low+high)/2;if(a[mid]==value)return mid;if(a[mid]>value)high = mid-1;if(a[mid]<value)low = mid+1; 折半查找判定数中的结点都是查找成功的情况,将每个结点的空指针指向⼀个实际上不存在的结点——外结点,所有外界点都是查找不成功的情况,如图所⽰。

数据结构-查找

数据结构-查找

数据结构-查找写在前⾯:这些内容是以考研的⾓度去学习和理解的,很多考试中需要⽤到的内容在实际应⽤中可能⽤不上,⽐如其中的计算问题,但是如果掌握这些东西会帮你更好的理解这些内容。

这篇关于查找的博客也只是⽤来记录以便于后续复习的,所以很多地⽅只是浅谈,并没有代码的实现如果有缘发现这篇⽂章想要深⼊了解或者因为作者表达能⼒差⽽看不懂以及有错的地⽅,欢迎留⾔指出来,我会尽快去完善的,期待有缘⼈内容多和杂,如果有机会我进⼀步进⾏梳理,将其重新梳理⼀⽚⽂章(会更注重于代码)本来只是想简单写⼀下的,但是不⼩⼼就get不到重点了本来打算等逐步完善和优化后再发出来的,但那样继续往前总感觉有所顾及,所以就先给这⼏天查找的复习暂时告⼀段落吧。

导学概览总体(⼀)概念查找:在数据集合中查找特定元素的过程查找表(查找结构):同⼀类型数据元素构成的集合静态查找表:只涉及查找,不存在修改适⽤:顺序查找,折半查找,散列查找等动态查找表:动态插⼊和删除,对查找表进⾏修改适⽤:⼆叉排序树,散列查找等所有数据结构都可以看作是查找表,对于折半查找和顺序查找这些都属于查找算法关键字:数据元素中唯⼀标识该元素的某数据项的值主关键字:此关键字能唯⼀表⽰⼀个数据元素次关键字:此关键字⽤以识别若⼲记录(⼀对多)说明:在查找表中每个数据元素就相当于⼀条记录,包含有不同的数据项,例如拿学⽣为例,⼀个学⽣作为数据元素,那么学号,⾝⾼,姓名就是这个元素中的数据项,每个学⽣都有特定的学号,因此学号可以作为关键字。

(当然如果数据项包含⾝份证号,你⽤⾝份证号⾛位关键字也可以)0x01平均查找长度(重点注意:作为查找算法效率衡量的主要指标,那么查找算法的性能分析肯定是重点分析平均查找长度的,因此必须熟练掌握。

提⼀嘴,算法效率的度量前⾯学过时间和空间复杂度,但是算法效率的度量不是只取决于时间和空间复杂度,针对不同的算法还可能会有其他⼀些辅助度量,如查找算法中的平均查找长度。

数据结构-查找分析

数据结构-查找分析

第八章查找一、填空题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个记录的有序表作折半查找,当查找失败时,至少需要比较次关键字。

数据结构——第五章查找:01静态查找表和动态查找表

数据结构——第五章查找:01静态查找表和动态查找表

数据结构——第五章查找:01静态查找表和动态查找表1.查找表可分为两类:(1)静态查找表:仅做查询和检索操作的查找表。

(2)动态查找表:在查询之后,还需要将查询结果为不在查找表中的数据元素插⼊到查找表中;或者,从查找表中删除其查询结果为在查找表中的数据元素。

2.查找的⽅法取决于查找表的结构:由于查找表中的数据元素之间不存在明显的组织规律,因此不便于查找。

为了提⾼查找效率,需要在查找表中的元素之间⼈为地附加某种确定的关系,⽤另外⼀种结构来表⽰查找表。

3.顺序查找表:以顺序表或线性链表表⽰静态查找表,假设数组0号单元留空。

算法如下:int location(SqList L, ElemType &elem){ i = 1; p = L.elem; while (i <= L.length && *(p++)!= e) { i++; } if (i <= L.length) { return i; } else { return 0; }}此算法每次循环都要判断数组下标是否越界,改进⽅法:加⼊哨兵,将⽬标值赋给数组下标为0的元素,并从后向前查找。

改进后算法如下:int Search_Seq(SSTable ST, KeyType kval) //在顺序表ST中顺序查找其关键字等于key的数据元素。

若找到,则函数值为该元素在表中的位置,否则为0。

{ ST.elem[0].key = kval; //设置哨兵 for (i = ST.length; ST.elem[i].key != kval; i--) //从后往前找,找不到则返回0 { } return 0;}4.顺序表查找的平均查找长度为:(n+1)/2。

5.上述顺序查找表的查找算法简单,但平均查找长度较⼤,不适⽤于表长较⼤的查找表。

若以有序表表⽰静态查找表,则查找过程可以基于折半进⾏。

算法如下:int Search_Bin(SSTable ST, KeyType kval){ low = 1; high = ST.length; //置区间初值 while (low <= high) { mid = (low + high) / 2; if (kval == ST.elem[mid].key) { return mid; //找到待查元素 } else if (kval < ST.elem[mid].key) { high = mid - 1; //继续在前半区间查找 } else { low = mid + 1; //继续在后半区间查找 } } return 0; //顺序表中不存在待查元素} //表长为n的折半查找的判定树的深度和含有n个结点的完全⼆叉树的深度相同6.⼏种查找表的时间复杂度:(1)从查找性能看,最好情况能达到O(logn),此时要求表有序;(2)从插⼊和删除性能看,最好情况能达到O(1),此时要求存储结构是链表。

查找表原理

查找表原理

查找表原理一、概述查找表(Lookup T able)是一种常用的数据结构和算法,用于快速查找和获取特定键值对应的数据。

它通过建立一个映射关系,将键值与数据进行绑定,方便根据键值快速定位和获取相应的数据,提高数据查询的效率。

二、原理查找表的原理可以简单描述为以下几个步骤:1. 构建查找表:首先,需要根据具体的需求和数据结构,构建一个查找表。

查找表可以采用数组、哈希表、树等数据结构来实现,根据数据规模和查询效率要求进行选择。

2. 建立映射关系:将键值与数据进行映射关系的建立,将键值作为索引或关键字,将数据存储在相应的位置或节点中。

这样,当需要查询某个键值对应的数据时,可以通过查找表快速定位到相应的位置。

3. 查询数据:根据需要查询的键值,通过查找表进行快速定位和获取对应的数据。

具体的查询算法和过程根据不同的查找表实现方式而有所不同,但核心思想都是通过查找表建立的映射关系来实现快速查询。

三、应用场景查找表在计算机科学和信息技术领域有着广泛的应用,以下是一些常见的应用场景:1. 数据库查询:数据库系统中经常使用查找表来实现高效的数据库查询操作。

通过将索引字段与数据建立映射关系,可以快速定位和检索满足查询条件的数据记录。

2. 字典查询:字典是一种常见的查找表应用,通过将单词作为键值,将释义或翻译作为数据进行存储和查询,方便用户根据单词快速查找到相应的释义信息。

3. 编译器优化:编译器在进行代码优化和生成目标代码的过程中,常常需要根据指令或变量名等标识符进行查找和处理。

查找表可以帮助编译器快速定位和处理标识符相关的信息。

4. 网络路由:在路由器和交换机等网络设备中,查找表被广泛应用于路由选择和数据转发的过程中。

通过建立IP地址与路由表的映射关系,可以实现快速的路由查找和数据包转发。

5. 图像处理:在图像处理和计算机视觉领域,查找表可以用于快速的像素值转换和颜色映射。

通过建立像素值与颜色表的映射关系,可以实现图像的快速处理和渲染。

数据结构 第9章 查找4-哈希表

数据结构 第9章 查找4-哈希表

7、随机数法 Hash(key) = random ( key ) (random为伪随机函数)
适用于:关键字长度不等的情况。造表和查找都很方便。
小结:构造哈希函数的原则:
① ② ③ ④ ⑤ 执行速度(即计算哈希函数所需时间); 关键字的长度; 哈希表的大小; 关键字的分布情况; 查找频率。
三、冲突处理方法
14 H(14)=14%7=0
6个元素用7个 地址应该足够!
1
2
23 9
3
4
39 25 11
5
6
H(25)=25%7=4 H(11)=11%7=4
有冲突!
在哈希查找方法中,冲突是不可能避免的,只能 尽可能减少。
所以,哈希方法必须解决以下两个问题:
1)构造好的哈希函数
(a)所选函数尽可能简单,以便提高转换速度; (b)所选函数对关键码计算出的地址,应在哈希地址集中 大致均匀分布,以减少空间浪费。
讨论:如何进行散列查找?
根据存储时用到的散列函数H(k)表达式,迅即可查到结果! 例如,查找key=9,则访问H(9)=9号地址,若内容为9则成功; 若查不到,应当设法返回一个特殊值,例如空指针或空记录。
缺点:空间效率低!
若干术语
哈希方法 (杂凑法)
选取某个函数,依该函数按关键字计算元素的存储位置, 并按此存放;查找时,由同一个函数对给定值k计算地址, 将k与地址单元中元素关键码进行比较,确定查找是否成 功。
3. 乘余取整法
4. 数字分析法
5. 平方取中法
常用的哈希函数构造方法有:
6. 折叠法
7. 随机数法
1、直接定址法
(a、b为常数) 优点:以关键码key的某个线性函数值为哈希地址, 不会产生冲突. 缺点:要占用连续地址空间,空间效率低。

数据结构(Java语言描述)第七章 查找

数据结构(Java语言描述)第七章  查找
数据结构
第七章 查找
目录
1 查找
2 静态查找表
第七章 查找
动态查找表 哈希表 小结
总体要求
•掌握顺序查找、折半查找的实现方法; •掌握动态查找表(包括:二叉排序树、二叉平衡树 、B-树)的构造和查找方法; •掌握哈希表、哈希函数冲突的基本概念和解决冲突 的方法。
7.1基本概念
1、数据项 数据项是具有独立含义的标识单位,是数据不可分 割的最小单位。 2、数据元素 数据元素数是据由项若(名干) 数据项构成的数据单位,是在某
}
性能分析:i 0 1 2 3 4
5 13 19 21 37
Ci 3 4 2 3 4
查找成功:
比较次数 = 路径上的结点数
比较次数 = 结点 4 的层数
比较次数
2
56 7 56 64 75 1 34
判定树
5
8 9 10 80 88 92 2 34
查找37 8
树的深度
0
3
6
9
≤=
log2n +1
1
4
}
【算法7-1】初始化顺序表 public SeqTable(T[] data,int n){
elem=new ArrayList<ElemType<T>>(); ElemType<T> e; for(int i=0;i<n;i++){
e=new ElemType<T>(data[i]); elem.add(i, e); } length=n; }
前者叫作最大查找长度(Maximun Search Length),即 MSL。后者叫作平均查找长度(Average Search Length) ,即ASL。

数据结构 查找

数据结构 查找

生成二叉排序树过程。
10 3 2 7 8 18 12
注:二叉排序树与关键字排列顺序有关,排列顺 序不一样,得到的二叉排序树也不一样。
二叉排序树的建立的算法
反复调用二叉排序树的插入算法即可 Bitree Creat (int n) { //建立含有n个结点的二叉排序树
Bitree T= NULL;
for ( int i=1; i<=n; i++) {
else if LT(key,p->key) p->lchild=s;
else p->rchild=s
return TRUE; }
//被插结点*s为右孩子
else return FALSE;
}// Insert BST
//树中已有关键字相同的结点,不再插入
4)二叉排序树的建立
例:关键字序列{ 10、18、3、8、12、2、7、3 }
5)二叉排序树上的删除
对于二叉排序树,删去树上一个结点相当于删去有序 序列中的一个记录,在删除某个结点之后依旧要保持二叉 排序树的特性。
如何在二叉排序树上删去一个结点呢?
设在二叉排序树上被删结点为*p(指向结点的指针为 p),其双亲结点为*f,设*p是*f的左孩子。 f F p P c PR C q Q s CL S QL SL
low
( 08,
( 08,
mid
14,
14,
high
55, 68, 79,
79,
23,
23,
37,
37,
46,
46,
91 )
low
55,
mid
68,
high
91 )
low mid

数据结构第九章:查找

数据结构第九章:查找

low high mid
8
1 5
2 13
3 19
4 21
5 37
6 56
7 64
8 75
9 80
10 88
11 92
high low 1 5 2 13 3 19 4 21 5 37 6 56 6 3 1 2
算法描述: 算法描述:ENTER
9
7 64
8 75
9 80
10 88
11 92
判定树: 判定树:
17
考试题型介绍: 考试题型介绍:
1. 填空题 若用链表存储一棵二叉树时,每个结点除数据域外, 若用链表存储一棵二叉树时,每个结点除数据域外,还有指向左孩子和右 孩子的两个指针。在这种存储结构中, 个结点的二叉树共有 个结点的二叉树共有________个 孩子的两个指针。在这种存储结构中,n个结点的二叉树共有 个 指针域,其中有________个指针域是存放了地址,有 指针域,其中有 个指针域是存放了地址, 个指针域是存放了地址 ________________个指针是空指针。 个指针是空指针。 个指针是空指针 2. 选择题 设有序表中有1000个元素,则用二分查找查找元素X最多需要比较( )次 个元素,则用二分查找查找元素 最多需要比较 最多需要比较( 设有序表中有 个元素 A. 25 3. 简答题 已知序列( , , , , , , , , , ) 已知序列(10,18,4,3,6,12,1,9,18,8)请用快速排序写出每一 趟排序的结果。 趟排序的结果。 4. 算法题 设计判断单链表中元素是否是递增的算法。 设计判断单链表中元素是否是递增的算法。 已知: 已知: 1. 单链表已存在,并带有头结点; 单链表已存在,并带有头结点; 2. 要求写出详细的算法步骤或画出详细的流程图; 要求写出详细的算法步骤或画出详细的流程图; B. 10 C. 7 D. 1

数据结构-第9章 查找

数据结构-第9章 查找

静态查找表 对查找表的查找仅是以查询为 目的,不改动查找表中的数据。 动态查找表 在查找的过程中同时插入不存 在的记录,或删除某个已存在的记录。
查找成功 查找表中存在满足查找条件的记 录。 查找不成功 查找表中不存在满足查找条件 的记录。
内查找 整个查找过程都在内存中进行。 外查找 在查找过程中需要访问外存。 平均查找长度ASL——查找方法时效的度量 为确定记录在查找表中的位置,需和给定值 进行比较的关键字个数的期望值。 n 查找成功时的ASL计算方法: ASL pici
3. 在二叉排序树上的操作
1)查找
[例] Key=28 f 24 12 T
45
53 28 90
Key=32 T 45 24 53 12 f 28 90 32
[算法描述]
2) 插入
[算法描述]
3) 生成
查找算法
返回
BiTree SearchBST(BiTree T,KeyType key){
//在根指针T所指二叉树中递归地查找某关键字等于 //key的数据元素,若查找成功,则返回指向该数据元 //素结点的指针,否则返回空指针
图9.1 用折半查找法查找12、50的过程 其中mid=(low+high)/2,当high<low时,表 示不存在这样的子表空间,查找失败。
成功! 位 置 1 2 3 4 5 6 7 8 9 10 11

6 12 15 18 22 25 28 35 45 58 60
low hign mid mid hign mid low mid (a) 用折半查找法查找12的过程
[性能分析] • 空间:一个辅助空间。 • 时间: 查找成功时的平均查找长度 设表中各记录查找概率相等 n ASLs(n)= PiCi =(1+2+ ... +n)/n =(n+1)/2 i 1 [算法特点] • 算法简单,对表结构无任何要求 • n很大时查找效率较低 • 改进措施:非等概率查找时,可将查找概率高 的记录尽量排在表后部。

数据结构与算法(10):查找

数据结构与算法(10):查找
def binary_search(lis, key): low = 0 high = len(lis) - 1 time = 0 while low <= high: time += 1 # 计算mid值是插值算法的核心心代码 mid = low + int((high - low) * (key - lis[low])/(lis[high] - lis[low])) print("mid=%s, low=%s, high=%s" % (mid, low, high)) if key < lis[mid]: high = mid - 1 elif key > lis[mid]: low = mid + 1 else: # 打印查找的次数 print("times: %s" % time) return mid print("times: %s" % time) return -1
× (high − low)
也就是将上述的比比例例参数1/2改进为自自适应的,根据关键字在整个有序表中所处的位置,让mid值 的变化更更靠近关键字key,这样也就间接地减少了了比比较次数。
基本思想:基于二二分查找算法,将查找点的选择改进为自自适应选择,可以提高高查找效率。当然, 插值查找也属于有序查找。
if __name__ == '__main__': LIST = [1, 5, 7, 8, 22, 54, 99, 123, 200, 222, 444] result = binary_search(LIST, 444) print(result)
3.3 斐波那契查找
在介绍斐波那契查找算法之前,我们先介绍一一下和它很紧密相连并且大大家都熟知的一一个概念—— ⻩黄金金金分割。 ⻩黄金金金比比例例又又称为⻩黄金金金分割,是指事物各部分间一一定的数学比比例例关系,即将整体一一分为二二,较大大部 分与较小小部分之比比等于整体与较大大部分之比比,其比比值约为1:0.618。 0.618倍公认为是最具有审美意义的比比例例数字,这个数值的作用用不不仅仅体现在诸如绘画、雕塑、 音音乐、建筑等艺术领域,而而且在管理理、工工程设计等方方面面有着不不可忽视的作用用。因此被称为⻩黄金金金分 割。 大大家记不不记得斐波那契数列列:1,1,2,3,5,8,13,21,34,55,89......(从第三个数开 始,后面面每一一个数都是前两个数的和)。然后我们会发现,随着斐波那契数列列的递增,前后两个 数的比比值会越来越接近0.618,利利用用这个特性,我们就可以将⻩黄金金金比比例例运用用到查找技术中。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

查找运算通常以"数据元素的键值与给定值的比较" 作为标准操作,也就是用"数据元素的键值与给定值 的比较次数"来作为查找算法的时间性能。上述比较 次数称为"查找长度"。显然,查找长度与键值等于给 定值K的元素在顺序表中的位置有关。 若顺序表中第n个元素的键值为K,则顺序查找算法 的查找长度为1;若第1个元素的键值为K,则查找长 度为n;若表中无键值等于K的元素(查找不成功),则 查找长度为n+1。可见差别很大。较合理的办法是以" 查找成功时的平均查找长度"(记为ASL)作为查找算法 时间性能的度量,其定义为:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 18 7 14 18 21 23 29 31 35 38 42 46 49 52 R.n
顺序查找算法(顺序表采用普通数组形式) int search-sqtable(int item[ ], int n, int k ) { int i ; item[0] = k; /*在数组的低端设置监视哨 */ While (item[i]!=k) i--; /* 从后往前找 */ return i; /* 找不到时,i为0 */ }
由于有序表中所有元素按键值递增的次序排 列,若将表中任一元素的键值R.item[i].key与 给定值K比较,可根据三种比较结果区分出三种 情况: ①R.item[i].key=K,查找成功,R.item[i] 即为待查元素; ②R.item[i].key>K,说明待查元素若在表中, 则一定排在R.item[i]之前; ③R.item[i].key<K,说明待查元素若在表中, 则一定排在R.item[i]之后。 因此,在一次比较之后,若沿未找到待查元 素,则可根据比较结果缩小进一步查找的区间。
顺序查找算法 int search-sqtable( sqtable R, keytype K ) { R.item[0].key = K; /*设置岗哨*/ i = R.n; /*设置比较位置初值 */ While (R.item[i].key!=K) i--; /*未找到时修改比较位置继续查找*/ return (i); } k=18
6.2 静态查找表的实现 6.2.1 顺序表上的查找 ●静态查找表的顺序表的类型定义如下: #define maxsize 静态查找表的表长; typedef struct { keytype key; /*关键字*/ ... ... /*其它域*/ }rec; typedef struct { rec item[maxsize+1]; int n; /*最后一个数据元素的下标*/ }sqtable;
n ASL=∑ PiCi i=1
●顺序查找算法的平均查找长度ASL: 查找成功: ASL =(n+1)/2
查找失败: ASL = n+1
可见,顺序查找算法时间复杂度为O(n)
6.2.2 有序表上的查找(二分查找)
●有序表:对于任何一个顺序表,若
其中的所有数据元素按键值的某种次
序(升序或降序)排列,则称为有序表。
岗哨R.item [0]的作用是:保证while 循环一定终止(即使查找不成功、即R 中无键值等于K的数据元素,当i=0时 循环终止条件"被迫"成立)。因此,不 必将"i>0"写入循环条件从而使循环条 件得到简化 (对比第2章定位算法 locate_sqlist)。有关测试表明:当 n≥1000时,进行一次查找所花费的时 间平均减少约一半。
定的若干数据元素组成的静态查找表ST。
②查找SEARCH(ST,K),若ST中存在关键字值 等于K的数据元素,运算结果为该数据元素在ST中 的位置;否则,运算结果为一特殊标志。 ③读表元GET(ST,pos),其运算结果是ST中
pos位置上的数据元素。
(静态查找表是仅对查找表进行查找操作,而不能 被改变的表。)
第6章
查找表
6.1 基本概念
●查找表是一种以集合为逻辑结构、以查找 为“核心”运算、同时包括其它运算的数据结 构。 6.1.1 集合的基本概念 ●集合:由任意一些可分辨的对象构成的整 体。例如,所有整数放在一起构成一个集合, 称为整数集。空集是不含任何元素的集合,记 为Φ。 ●在数据结构课程中,通常只考虑那些由具 有相同类型的数据元素构成的集合。
给定的某个值K,在查找表中寻找一个
其键值等于K的数据元素。若找到一个
这样的数据元素,则查找成功,运算结
果为该数据元素在表中的位置;否则, 查找不成功,此时的运算结果为一个特 殊标志。
●查找表:具有同一类型的数据元素组成的集合。
●静态查找表包括下列三种基本运算: ①建表CREATE(ST), 其作用是生成一个由用户给
●动态查找表 包括①查找②读表元以及下 列三种基本运算: ③插入INSERT(ST,K),若ST中不存在关 键字值等于K的数据元素,则将一个关键字 值等于K的新数据元素插入到ST中。 ④删除DELETE(ST,K),当ST中存在关 键字值等于K的数据元素时,将其删除。 ⑤初始化INITIATE(ST),其作用是设置一 个空的动态查找表ST。 (动态查找表:除了对查找表进行查找操作 外,还能向表中插入数据元素,或删除表中 的数据元素,因而表可以被改查找是一种常用运算,其功能是从大 量的数据元素中找出某个特定的数据元素。 ●标识数据元素的数据项称为关键字, 简称键。该数据项的值称为键值。 ●能够唯一地标识数据元素的关键字称 为主关键字。 ●不能唯一地标识数据元素的关键字称 为次关键字。
●查找运算的功能的确切表述:根据
●静态查找表中的数据元素存放在上述数组 的第1到第n个单元,第n+1到最后一个单元为 备用区。不同的是,这里多说明了一个单元 即第0个单元,该单元被用于设置"岗哨"以便 简化查找运算的实现。 在上述存储结构上实现查找运算的一种直 观方法是"顺序查找法":从表的第n个位置开 始,从后往前依次将各个位置上的数据元素 的键值与给定值K比较。若某个位置上的数据 元素的键值与K相等则查找成功,回送该位置 作为结果;若所有数据元素的键值均与K不等, 回送0,标记查找不成功。
相关文档
最新文档