数据结构查找技术1-静态查找表

合集下载

c语言数据结构查找算法大全

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 如下图所示有序 数组 ST.elem :递增序
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 个 ,灰色标识的结点。

静态查找

静态查找
Pi为查找列表中第 个数据元素的概率 为查找列表中第i个数据元素的概率 Ci为找到列表中第 个数据元素时,已经进行过的关 为找到列表中第i个数据元素时 个数据元素时, 键字比较次数
查找的基本方法
基于线性表的查找法 ——顺序查找法、折半查找法、分块查找法 比较式查找法 基于树的查找法 —— ——二叉排序树、平衡二叉排序树、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)——可以 )主关键字( ) 可以 唯一地标识一个记录的关键字称为主关键 如图的“学号” 字。如图的“学号”。
基本概念

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

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

数据结构(三十七)查找的基本概念

数据结构(三十七)查找的基本概念

数据结构(三⼗七)查找的基本概念 ⼀、查找的基本概念 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++)静态查找表既可以使⽤顺序表表⽰,也可以使⽤链表结构表⽰。

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

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

数据结构(八)查找

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

查找-数据结构

查找-数据结构

平均查找长度:为确定记录在查找表中 的位置,需和给定值进行比较的关键字 个数的期望值称为查找算法在查找成功 时的平均查找长度,简称ASL。
对于含有n个记录的表,查找成功时的平 均查找长度为: n ASL PiCi i 1
其找到中表:中Pi为其查关找键表字中与第给i定个值记相录等的的概第率,i个C记i为 录时和给定值已进行过比较的关键字个数。
(1)若*p 为叶子结点,直接删除即可。
45
45
12
3
37
53
f
100
24
p
61
60
90
12
53
3
删除24
f->lchild = null; delete p;
37
100
61
60
90
78
78
(2)若*p结点只有左子树PL或只有右子树PR,此 时只要令PL或PR直接成为*f的左子树即可
f
F
f
F
p
P
p
二叉排序树的插入
基本思想:
若二叉排序树为空,则待插结点作为根结点插入 到空树中;
若待插结点的关键字值和根结点的关键字值相等, 则说明树中已有此结点,无需插入;
若待插结点的关键字值小于根结点的关键字值, 则将待插结点插入到根的左子树中;
若待插结点的关键字值大于根结点的关键字值, 则将待插结点插入到根的右子树中;
mid low
mid low
mid low
mid low
mid
mid
mid
mid
6
3
9
1
47
10
2
58
11
由此可见,二分查找过程恰好是走了一条从判 定树的根到被查结点的路径,比较的关键字个 数恰为该结点在判定树中的层数。

数据结构——第五章查找: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),此时要求存储结构是链表。

动态查找与静态查找的区分

动态查找与静态查找的区分

动态查找与静态查找的区分
1、静态查找
⾸先⽆论是静态查找还是动态查找,都要有查找的对象,也就是包含很多同类型数据的“表”,这个“表”可以理解为⼀个由同类型数据元素组成的⼀个“集合”,该集合可以⽤各种容器来存储,例如数组、链表、树等,我们统称这些存储数据的数据结构为——查找表。

可见,查找表有时是我们传统意义的表,有时候是很复杂的⼀种结构。

静态查找就是我们平时概念中的查找,是“真正的查找”。

之所以说静态查找是真正的查找,因为在静态查找过程中仅仅是执⾏“查找”的操作,即:(1)查看某特定的关键字是否在表中(判断性查找);(2)检索某特定关键字数据元素的各种属性(检索性查找)。

这两种操作都只是获取已经存在的⼀个表中的数据信息,不对表的数据元素和结构进⾏任何改变,这就是所谓的静态查找。

常见的静态查找(表):顺序查找、⼆分法查找、索引顺序查找(分块查找)、斐波那契查找等
2、动态查找
看到上⾯静态查找的概念,动态查找就很好理解了,个⼈总觉得动态查找不像是“查找”,动态查找它更像是⼀个对表进⾏“创建、扩充、修改、删除”的过程。

动态查找的过程中对表的操作会多两个动作:(1)⾸先也有⼀个“判断性查找”的过程,如果某特定的关键字在表中不存在,则按照⼀定的规则将其插⼊表中;(2)如果已经存在,则可以对其执⾏删除操作。

动态查找的过程虽然只是多了“插⼊”和“删除”的操作,但是在对具体的表执⾏这两种操作时,往往并不是那么简单。

常见的动态查找(表):各种树(⼆叉搜索树、AVL、B/B+树、红⿊树等等)、哈希表。

数据库系统l试题库及答案 第9章 查找

数据库系统l试题库及答案 第9章 查找

第9章查找9.1知识点:静态查找表一、填空题1.在数据的存放无规律而言的线性表中进行检索的最佳方法是。

2.查找表是由构成的集合。

3.若对查找表只做“查询某个特定的数据元素是否在查找表中”和“查询某个特定的数据元素的各种属性”操作,则称此类查找表为。

若在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素,则称此类查找表为。

4.在n个记录的有序顺序表中进行折半查找,最大的比较次数为。

5.是顺序查找的一种改进方法,又称索引顺序查找,具体实现为将一个主表分成n个子表,要求子表之间元素是按,而子表中元素可以无序的,用每个子表最大关键字和指示块中第一个记录在表中位置建立。

6.分块查找的时间复杂度是。

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

8.由于查找运算的主要运算是关键字的比较,所以通常把______________作为衡量一个查找算法效率优劣的标准。

它的计算公式为________________________________________。

二、选择题1.()在表长为n的链表中进行顺序查找,它的平均查找长度为()。

A. ASL=nB. ASL=(n+1)/2C. ASL=+1D. ASL≈log2(n+1)-12.()采用折半查找方法查找长度为n的线性表时,平均时间复杂度为()。

A.O(n2)B.O(nlogn)C.O(n)D.O(logn)3.()折半查找有序表(4,6,10,12,20,30,50,70,88,100)。

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

A.20,70,30,50 B.30,88,70,50 C.20,50 D.30,88,504.()有序线性表(a1,a2,a3,…,a256)是从小到大排列的,对一个给定的值k,用二分法检索表中与k相等的元素,在查找不成功的情况下,最多需要检索()次。

数据结构(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。

数据结构-第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很大时查找效率较低 • 改进措施:非等概率查找时,可将查找概率高 的记录尽量排在表后部。

DS_第九章查找

DS_第九章查找
如果元素总数有 1024 个, 不可能把所有元素的数据一次都读入内存。 无论是顺序查找或对分查找,都需要多次读取外存记录。
如果在索引表中每一个索引项占4个字节, 每个索引项索引一个职工对 象,则 1024 个索引项需要 4k 字节, 在内存中可以容纳所有的索引项。
这样只需从外存中把索引表读入内存,经过查找索引后确定了职工对 象的存储地址,再经过 1 次读取元素操作就可以完成查找。
1)

n 1. 2
5
9.1.2 有序表的查找(折半查找)
设n个元素存放在一个有序顺序表中,并按其关键字从小到大排好 了序。
采用折半查找时,先求位于查找区间正中的元素的下标mid,用其 关键字与给定值x比较: elem[mid].key = x,查找成功; elem[mid].key > x,把查找区间缩小到表的前半部分,再继续进 行折半查找; elem[mid].key < x,把查找区间缩小到表的后半部分,再继续进 行折半查找。
n
( pi 1 ) i 1
• 在顺序查找情形,ci = n-i+1, i = 1, 2, , n,因此
n
ASLsucc pi (n i 1)
i 1
• 在等概率情形,pi = 1/n, i = 1, 2, , n。
ASLsucc

n i 1
1 (n i n
第九章 查找
9.1 静态查找表 9.2 动态查找表 9.3 哈希表
1
查找(Search)的概念
所谓查找,就是在数据集合中寻找满足某种条件的数据元素。 查找的结果通常有两种可能:
查找成功,即找到满足条件的数据元素。查找结果可为该元素在 结构中的位置,还可进一步给出该元素中的具体信息。 查找不成功,或查找失败。查找结果为一些指示信息,如失败标 志、失败位置等。

数据结构与算法(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)。

灵便的结构。
整理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());
相关文档
最新文档