数据结构“查找表”分析

合集下载

数据结构教案第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; 折半查找判定数中的结点都是查找成功的情况,将每个结点的空指针指向⼀个实际上不存在的结点——外结点,所有外界点都是查找不成功的情况,如图所⽰。

  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,标记查找不成功。
相关文档
最新文档