数据结构(Java)--查找
2017-07-03 20:50
267 查看
由于查找运算的使用频率很高,几乎在任何一个计算机系统软件和应用软件中都会涉及到,所以当问题所涉及的数据量相当大时,查找方法的效率就显得格外重要。在一些实时查询系统中尤其如此。
1、查找条件、查找操作和查找结果
一个数据结构由相同数据类型的多个数据元素所组成,一个数据元素通常由多个数据项组成。
关键字是数据元素中用于识别该元素的一个或多个数据项。
能够唯一识别数据元素的关键字称为主关键字。
查找操作:给定一个值key,在一个数据结构中找出关键字等于key的元素。
若找到,则查找成功,返回该结点的信息或该结点在表中的位置;否则查找失败,返回相关信息。
3、查找算法效率
衡量查找算法效率的主要标准是平均查找长度(Average Search length,ASL),即查找过程中关键字的平均比较次数。
其中:
①n是结点的个数;
②Pi是查找第i个结点的概率。若不特别声明,认为每个结点的查找概率相等,即
p1=p2…=pn=1/n
③ci是查找第i个结点所需进行的比较次数。
查找成功和查找不成功的平均查找长度通常不同,分别记为ASL成功和ASL不成功。
4、顺序查找算法及效率
顺序查找的基本思想
n从线性表的一端开始,依次将每个元素的关键字与给定值进行比较。
l若有相等者,则查找成功;
l否则继续比较,直到比较完所有元素,仍未有相等者,则查找不成功,给出结果信息。
n顺序查找又称为线性查找,主要应用于数据量较小的线性表。
n顺序查找方法既适用于顺序表,也适用于链表。
(1)顺序表的顺序查找
(2)单链表的顺序查找
(3)顺序查找算法分析
①顺序查找的优点
算法简单,且对线性表的存储结构无任何要求,无论是用顺序表还是用链表来存放元素,也无论结点之间是否按关键字有序,它都同样适用。
②顺序查找的缺点
查找效率低,时间复杂度是O(n)。因此,当n较大时不宜采用顺序查找。
6、提高查找效率的措施
顺序查找(基于线性表)
二分法查找(基于有序顺序表)
分块查找(基于索引表)
散列查找(基于散列表)
二叉排序树(基于树结构)
查找算法需要充分利用数据结构本身的特征来提高查找效率。
当数据量较大时,需要采取一些特殊的措施来提高查找效率。
数据排序
建立索引
散列技术
2
二分法查找
1、二分法查找算法
2.二分法查找算法分析(借助二叉判定树分析)
优点:
在有序顺序表长度相同的情况下,二分法查找算法效率比顺序查找算法的效率高。
缺点:
二分法查找算法的适用条件比顺序查找严格,既要顺序存储,还必须是已排序的。而排序本身是一种很费时的运算。即使采用高效率的排序方法也要花费O(nlog2n)的时间。
为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分法查找特别适用于那种一经建立就很少改动、而又经常需要查找的数据量较小的顺序表。
3 基于索引表的分块查找
1、索引(以空间换时间)
索引表(通常有序)
主表(分段有序:快内无序,块间有序)
完全索引
多级索引
2、分块查找
基于索引顺序表的查找算法称为分块查找。
查找索引表,获得给定值的索引信息,确定在哪一块中,缩小查找范围。
在一块中,根据给定值进行查找,获得查找结果。
在索引表或一块中,可采用顺序查找或二分法查找算法。
(1)字典的分块查找
(2)支持插入和删除操作的索引结构及其分块查找。
3、分块查找算法分析
平均查找长度ASL
分块查找是两次查找过程。整个查找过程的平均查找长度是两次查找的平均查找长度之和。
设索引表长度为m,主表每块长度为s,若两者均采用顺序查找算法,则ASL为:
分块查找的主要代价是需要额外的存储空间存储索引表和将初始表分块排序的运算
4 散列
n散列是一种按关键字编址的存储和检索方法。
n基于散列技术的查找不同于顺序查找、二分法查找、分块查找和二叉排序树查找。它不以关键字的比较为基本操作,而是采用直接寻址技术。
n
在理想情况下,无须任何比较就可以
找到待查
关键字,查找的期望时间为
O(1)
。
一、散列表
1、散列函数
设所有可能出现的关键字集合记为U(简称全集)。实际发生(即实际存储)的关键字集合记为K(|K|比|U|小得多)。
散列方法是使用函数h将U映射到表T[0..m-1]的下标上。这样以U中关键字为自变量,以h为函数的运算结果就是相应结点的存储地址。从而达到在O(1)时间内就可完成查找。
其中:
① h:U→{0,1,2,…,m-1} ,通常称h为散列函数(Hash Function)。
② T为散列表(Hash Table)。
③ h(Ki)(Ki∈U)是关键字Ki结点的存储地址(亦称散列地址)。
④ 将结点按其关键字的散列地址存储到散列表中的过程称为散列。
2、冲突
(1)冲突
两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上。该现象称为冲突(Collision)或碰撞。发生冲突的两个关键字称为该散列函数的同义词。
【例】上图中的k2≠k5,但h(k2)=h(k5)。
(2)完全避免冲突的条件
最理想的解决冲突的方法是完全避免冲突。要做到这一点必须满足两个条件:
①其一是|U|≤m
②其二是选择合适的散列函数。
(3)冲突不可能完全避免
通常情况下,h是一个压缩函数。虽然|K|≤m,但|U|>m,故无论怎样设计h,也不可能完全避免冲突。因此,只能在设计h时尽可能使冲突最少。同时还需要确定解决冲突的方法,使发生冲突的同义词能够存储到表中。
(4)影响冲突的因素
冲突的频繁程度除了与h相关外,还与表的填满程度相关。
设m和n分别表示表长和表中填入的结点数,则将α=n/m定义为散列表的装填因子。α越大,表越满,冲突的机会也越大。通常取α≤1。
二、散列函数
一个好的散列函数的标准是:使散列地址均匀分布在散列表中,尽量避免或减少冲突。
n散列地址必须均匀分布在散列表的全部地址空间;
n函数简单,计算散列函数花费时间为:O(1)。
n使关键字的所有成分都起作用,以反映不同关键字的差异。
n数据元素的查找频率。
1、除留余数法
取关键字被某一个不大于散列表长度m的最大素数p除后所得的余数为散列地址,即 h(key)=key%p。
三、处理冲突
通常有两类方法处理冲突:开放定址法和链地址法。
前者是将所有结点均存放在散列表T[0..m-1]中;
后者通常是将互为同义词的结点链成一个单链表,而将此链表的头指针放在散列表T[0..m-1]中。
1、开放定址法
(1)开放定址法解决冲突的方法
用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查技术在散 列表中形成一个探查序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止。
(2)开放定址法的一般形式
开放定址法的一般形式为: hi=(h(key)+di)%m i=1,2,…,k(k≤m-1)
其中:h(key)为散列函数,di为增量序列,m为表长。
(3)线性探查再散列
di=1,2,3,…,m-1称为线性探查再散列
该方法的基本思想是:
将散列表T[0..m-1]看成是一个循环向量,若初始探查的地址为d(即h(key)=d),则探查序列为:
d,d+1,d+2,…,m-1,0,1,…,d-1
即:探查时从地址d开始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循环到T[0],T[1],…,直到探查到T[d-1]为止。
探查过程终止于三种情况:(1)若当前探查的单元为空,则表示查找失败(若是插入则将key写入其中);
(2)若当前探查的单元中含有key,则查找成功,但对于插入意味着失败;
(3)若探查到T[d-1]时仍未发现空单元也未找到key,则无论是查找还是插入均意味着失败(此时表满)。
2、链地址法
5二叉排序树和平衡二叉树
1 二叉排序树
定义
二叉排序树 空树;性质:
元素可比较相等和大小,关键字互不相同。
结点,左子树元素均小于该结点,右子树元素均大于该结点。
左、右子树也是二叉排序树。
中根次序遍历,升序序列
2.
查找
从根开始
若key==p.data,则查找成功返回;若key<p.data,则查找p的左子树;否则查找p的右子树。
重复执行②,直到p为空,查找不成功
3.插入 40为例
5.二叉排序树的查找性能分析
6.删除
3 平衡二叉树
1、平衡二叉树定义
结点的平衡因子 = 左子树的高度 – 右子树的高度
2.插入结点
如何调整最小不平衡子树?
(1)LL型调整
(2)RR型调整
(3)LR型调整
(4)RL型调整
1、查找条件、查找操作和查找结果
一个数据结构由相同数据类型的多个数据元素所组成,一个数据元素通常由多个数据项组成。
关键字是数据元素中用于识别该元素的一个或多个数据项。
能够唯一识别数据元素的关键字称为主关键字。
查找操作:给定一个值key,在一个数据结构中找出关键字等于key的元素。
若找到,则查找成功,返回该结点的信息或该结点在表中的位置;否则查找失败,返回相关信息。
3、查找算法效率
衡量查找算法效率的主要标准是平均查找长度(Average Search length,ASL),即查找过程中关键字的平均比较次数。
其中:
①n是结点的个数;
②Pi是查找第i个结点的概率。若不特别声明,认为每个结点的查找概率相等,即
p1=p2…=pn=1/n
③ci是查找第i个结点所需进行的比较次数。
查找成功和查找不成功的平均查找长度通常不同,分别记为ASL成功和ASL不成功。
4、顺序查找算法及效率
顺序查找的基本思想
n从线性表的一端开始,依次将每个元素的关键字与给定值进行比较。
l若有相等者,则查找成功;
l否则继续比较,直到比较完所有元素,仍未有相等者,则查找不成功,给出结果信息。
n顺序查找又称为线性查找,主要应用于数据量较小的线性表。
n顺序查找方法既适用于顺序表,也适用于链表。
(1)顺序表的顺序查找
(2)单链表的顺序查找
(3)顺序查找算法分析
①顺序查找的优点
算法简单,且对线性表的存储结构无任何要求,无论是用顺序表还是用链表来存放元素,也无论结点之间是否按关键字有序,它都同样适用。
②顺序查找的缺点
查找效率低,时间复杂度是O(n)。因此,当n较大时不宜采用顺序查找。
6、提高查找效率的措施
顺序查找(基于线性表)
二分法查找(基于有序顺序表)
分块查找(基于索引表)
散列查找(基于散列表)
二叉排序树(基于树结构)
查找算法需要充分利用数据结构本身的特征来提高查找效率。
当数据量较大时,需要采取一些特殊的措施来提高查找效率。
数据排序
建立索引
散列技术
2
二分法查找
1、二分法查找算法
2.二分法查找算法分析(借助二叉判定树分析)
优点:
在有序顺序表长度相同的情况下,二分法查找算法效率比顺序查找算法的效率高。
缺点:
二分法查找算法的适用条件比顺序查找严格,既要顺序存储,还必须是已排序的。而排序本身是一种很费时的运算。即使采用高效率的排序方法也要花费O(nlog2n)的时间。
为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。因此,二分法查找特别适用于那种一经建立就很少改动、而又经常需要查找的数据量较小的顺序表。
3 基于索引表的分块查找
1、索引(以空间换时间)
索引表(通常有序)
主表(分段有序:快内无序,块间有序)
完全索引
多级索引
2、分块查找
基于索引顺序表的查找算法称为分块查找。
查找索引表,获得给定值的索引信息,确定在哪一块中,缩小查找范围。
在一块中,根据给定值进行查找,获得查找结果。
在索引表或一块中,可采用顺序查找或二分法查找算法。
(1)字典的分块查找
(2)支持插入和删除操作的索引结构及其分块查找。
3、分块查找算法分析
平均查找长度ASL
分块查找是两次查找过程。整个查找过程的平均查找长度是两次查找的平均查找长度之和。
设索引表长度为m,主表每块长度为s,若两者均采用顺序查找算法,则ASL为:
分块查找的主要代价是需要额外的存储空间存储索引表和将初始表分块排序的运算
4 散列
n散列是一种按关键字编址的存储和检索方法。
n基于散列技术的查找不同于顺序查找、二分法查找、分块查找和二叉排序树查找。它不以关键字的比较为基本操作,而是采用直接寻址技术。
n
在理想情况下,无须任何比较就可以
找到待查
关键字,查找的期望时间为
O(1)
。
一、散列表
1、散列函数
设所有可能出现的关键字集合记为U(简称全集)。实际发生(即实际存储)的关键字集合记为K(|K|比|U|小得多)。
散列方法是使用函数h将U映射到表T[0..m-1]的下标上。这样以U中关键字为自变量,以h为函数的运算结果就是相应结点的存储地址。从而达到在O(1)时间内就可完成查找。
其中:
① h:U→{0,1,2,…,m-1} ,通常称h为散列函数(Hash Function)。
② T为散列表(Hash Table)。
③ h(Ki)(Ki∈U)是关键字Ki结点的存储地址(亦称散列地址)。
④ 将结点按其关键字的散列地址存储到散列表中的过程称为散列。
2、冲突
(1)冲突
两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上。该现象称为冲突(Collision)或碰撞。发生冲突的两个关键字称为该散列函数的同义词。
【例】上图中的k2≠k5,但h(k2)=h(k5)。
(2)完全避免冲突的条件
最理想的解决冲突的方法是完全避免冲突。要做到这一点必须满足两个条件:
①其一是|U|≤m
②其二是选择合适的散列函数。
(3)冲突不可能完全避免
通常情况下,h是一个压缩函数。虽然|K|≤m,但|U|>m,故无论怎样设计h,也不可能完全避免冲突。因此,只能在设计h时尽可能使冲突最少。同时还需要确定解决冲突的方法,使发生冲突的同义词能够存储到表中。
(4)影响冲突的因素
冲突的频繁程度除了与h相关外,还与表的填满程度相关。
设m和n分别表示表长和表中填入的结点数,则将α=n/m定义为散列表的装填因子。α越大,表越满,冲突的机会也越大。通常取α≤1。
二、散列函数
一个好的散列函数的标准是:使散列地址均匀分布在散列表中,尽量避免或减少冲突。
n散列地址必须均匀分布在散列表的全部地址空间;
n函数简单,计算散列函数花费时间为:O(1)。
n使关键字的所有成分都起作用,以反映不同关键字的差异。
n数据元素的查找频率。
1、除留余数法
取关键字被某一个不大于散列表长度m的最大素数p除后所得的余数为散列地址,即 h(key)=key%p。
三、处理冲突
通常有两类方法处理冲突:开放定址法和链地址法。
前者是将所有结点均存放在散列表T[0..m-1]中;
后者通常是将互为同义词的结点链成一个单链表,而将此链表的头指针放在散列表T[0..m-1]中。
1、开放定址法
(1)开放定址法解决冲突的方法
用开放定址法解决冲突的做法是:当冲突发生时,使用某种探查技术在散 列表中形成一个探查序列。沿此序列逐个单元地查找,直到找到给定的关键字,或者碰到一个开放的地址(即该地址单元为空)为止。
(2)开放定址法的一般形式
开放定址法的一般形式为: hi=(h(key)+di)%m i=1,2,…,k(k≤m-1)
其中:h(key)为散列函数,di为增量序列,m为表长。
(3)线性探查再散列
di=1,2,3,…,m-1称为线性探查再散列
该方法的基本思想是:
将散列表T[0..m-1]看成是一个循环向量,若初始探查的地址为d(即h(key)=d),则探查序列为:
d,d+1,d+2,…,m-1,0,1,…,d-1
即:探查时从地址d开始,首先探查T[d],然后依次探查T[d+1],…,直到T[m-1],此后又循环到T[0],T[1],…,直到探查到T[d-1]为止。
探查过程终止于三种情况:(1)若当前探查的单元为空,则表示查找失败(若是插入则将key写入其中);
(2)若当前探查的单元中含有key,则查找成功,但对于插入意味着失败;
(3)若探查到T[d-1]时仍未发现空单元也未找到key,则无论是查找还是插入均意味着失败(此时表满)。
2、链地址法
5二叉排序树和平衡二叉树
1 二叉排序树
定义
二叉排序树 空树;性质:
元素可比较相等和大小,关键字互不相同。
结点,左子树元素均小于该结点,右子树元素均大于该结点。
左、右子树也是二叉排序树。
中根次序遍历,升序序列
2.
查找
从根开始
若key==p.data,则查找成功返回;若key<p.data,则查找p的左子树;否则查找p的右子树。
重复执行②,直到p为空,查找不成功
3.插入 40为例
5.二叉排序树的查找性能分析
6.删除
3 平衡二叉树
1、平衡二叉树定义
结点的平衡因子 = 左子树的高度 – 右子树的高度
2.插入结点
如何调整最小不平衡子树?
(1)LL型调整
(2)RR型调整
(3)LR型调整
(4)RL型调整
相关文章推荐
- Java 数据结构之一般树形结构中父节点和子节点的查找
- 数据结构——查找和删除指定连接点(java实现)
- 数据结构(Java)——查找和排序(1)
- 数据结构(Java)——查找和排序(4)
- 数据结构:二分查找 java
- 数据结构与算法->树->2-3-4树的查找,添加,删除(Java)
- 数据结构(java)_数组顺序查找
- 数据结构(Java)——查找和排序(5)
- java 数据结构与算法 之查找法
- #数据结构与算法学习笔记#剑指Offer1:二维数组中的查找(JAVA)
- java数据结构与算法-递归二分查找
- Java数据结构与算法之【二分查找】
- 数据结构(Java)——查找和排序(2)
- 数据结构和算法设计专题之---二分查找(Java版)
- java中数据结构Bitmap查找相等元素
- 【转】Java 下实现锁无关数据结构
- 数据结构——快速排序原理及算法Java实现
- 数据结构中排序和查找的算法
- java语言实现二分查找数据法
- Java基础之数据结构