概念

1、静态查找

首先无论是静态查找还是动态查找,都要有查找的对象,也就是包含很多同类型数据的“表”,这个“表”可以理解为一个由同类型数据元素组成的一个“集合”,该集合可以用各种容器来存储,例如数组、链表、树等,我们统称这些存储数据的数据结构为——查找表。可见,查找表有时是我们传统意义的表,有时候是很复杂的一种结构。

静态查找就是我们平时概念中的查找,是“真正的查找”。之所以说静态查找是真正的查找,因为在静态查找过程中仅仅是执行“查找”的操作,即:(1)查看某特定的关键字是否在表中(判断性查找);(2)检索某特定关键字数据元素的各种属性(检索性查找)。这两种操作都只是获取已经存在的一个表中的数据信息,不对表的数据元素和结构进行任何改变,这就是所谓的静态查找。

2、动态查找

看到上面静态查找的概念,动态查找就很好理解了,个人总觉得动态查找不像是“查找”,更像是一个对表进行“创建、扩充、修改、删除”的过程。动态查找的过程中对表的操作会多两个动作:(1)首先也有一个“判断性查找”的过程,如果某特定的关键字在表中不存在,则按照一定的规则将其插入表中;(2)如果已经存在,则可以对其执行删除操作。动态查找的过程虽然只是多了“插入”和“删除”的操作,但是在对具体的表执行这两种操作时,往往并不是那么简单。

哪种查找对应各自查找表,如有序表可以为静态查找表,也可以为动态查找表。依查找方式决定。

一、静态查找表

1.顺序查找

假设每个记录的查找概率相等,顺序查找的平均查找长度:

假设查找成功与不成功的可能性相同,对每个记录查找概率也相等,则,此时平均查找长度为

2.有序表查找

折半查找:这个查找过程类似二叉树,具有n个节点的判定树深度为,平均查找长度为

3.索引顺序表的查找(分块查找)

对子表建立一个索引表,包括两项内容:关键字项(值为该子表内最大关键字)和指针项(指向该子表的第一个记录在表中的位置)。索引表按关键字有序,表或者有序,或者分块有序。

由于索引项按关键字有序,则确定块的查找可以用顺序表查找,也可以用折半查找,块中记录是任意排列的,在块中只能是顺序查找。

分块查找由这两种查找算法简单合成。分块查找的平均查找长度为

,

其中:为查找索引表确定所在块的平均查找长度,为在块中查找元素的平均查找长度。

一般情况下,为进行分块查找,可以将长度为n的表均匀的分成b块,每块含有s个记录;假定表中每个记录的查找概率相等。用顺序查找确定所在块,分块查找的平均查找长度为

分块查找是折半查找和顺序查找的一种改进方法,折半查找虽然具有很好的性能,但其前提条件时线性表顺序存储而且按照关键码排序,这一前提条件在结点树很大且表元素动态变化时是难以满足的。而顺序查找可以解决表元素动态变化的要求,但查找效率很低。如果既要保持对线性表的查找具有较快的速度,又要能够满足表元素动态变化的要求,则可采用分块查找的方法。

分块查找的速度虽然不如折半查找算法,但比顺序查找算法快得多,同时又不需要对全部节点进行排序。当节点很多且块数很大时,对索引表可以采用折半查找,这样能够进一步提高查找的速度。

分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。当增加或减少节以及节点的关键码改变时,只需将该节点调整到所在的块即可。在空间复杂性上,分块查找的主要代价是增加了一个辅助数组。

平均查找长度:

以一个牛客网上的题目为例:设顺序线性表的长度为30,分成5块,每块6个元素,如果采用分块查找并且索引表和块内均采用顺序查找,则其平均查找长度为(     )。

分块查找会分两部分进行,第一步先进行索引表查找判断其在那个字表中,第二步然后进行在字表中的查找
索引表有5个元素 所以平均查找长度为:(1+5)/2=3
字表中有6个元素,所以平均查找长度为:(1+6)/2=3.5
所以总的平均查找长度为3+3.5=6.5

二、动态查找表

2.1二叉排序树与AVL树

2.1.1二叉排序树

含有n个节点的二叉排序树的平均查找长度和树的形态有关,最好和成正比,当先后插入的关键字有序,构成的二叉排序树蜕变为单支树,树的深度为n,最坏情况,平均查找长度为

2.1.2平衡二叉树(AVL树)

它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左右子树的深度之差绝对值不超过1。结点平衡因子定义为左子树深度减右子树深度(-1,0,1)。平均查找时间复杂度

2.2B-树和B+树

一棵m阶B-树,或为空树,或满足下列特性的m叉树:(是一种平衡的多路查找树)

  1. 树中每个节点至多有m棵子树;
  2. 若根节点不是叶子结点,则至少有两棵子树;
  3. 除根之外的所有非终端结点至少有
  4. 所有非终端结点中包含下列信息数据,其中为关键字,为指向子树根结点的指针,且指针所指子树中所有结点的关键字均小于
  5. 所有的叶子结点都出现在同一层次上,且不带信息。

m阶B+树和m阶B-树的差异在于:

  1. 有n棵子树的结点中含有n个关键字。
  2. 所有叶子结点中包含了全部关键字信息,及指向这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  3. 所有非终端结点可以看成是索引部分,结点中仅含有其子树(根结点)中最大(或最小) 关键字。

参考文献:

数据结构(C语言版),严蔚敏

https://blog.csdn.net/pamchen/article/details/8476134

数据结构:静态查找动态查找相关推荐

  1. 静态树表查找算法及C语言实现,数据结构 静态树表查找算法

    友情提示:此篇文章大约需要阅读 6分钟55秒,不足之处请多指教,感谢您的阅读. 算法思想 在使用查找表中有n个关键字,表中的每个关键字被查找的概率都是1/n.在等概率的情况下,使用折半查找算法最优. ...

  2. 查找-动态查找表-二叉排序树

    文字描述 二叉排序树的定义 又称二叉查找树,英文名为Binary Sort Tree, 简称BST.它是这样一棵树:或者是一棵空树:或者是具有下列性质的二叉树:(1)若它的左子树不空,则左子树上所有结 ...

  3. 数据结构(6) -- 查找

    查找表:用于查找的数据集合 对查找表的四种操作: 查询某特定元素是否在查找表中 检索满足条件的某个特定的数据元素的各种属性 在查找表中插入一个数据元素 删除一个数据元素 静态查找表:没有插入,删除操作 ...

  4. 数据结构-查找-顺序查找法

    在数据处理的过程中,是否能在时间内查找到所需要的数据是一个相当值得重视的问题.所谓查找(search),指的是在数据文件中找出满足某些条件的记录.用以查找的条件称作为"键值(Key)&quo ...

  5. JNI查找 native 方法的规则(静态、动态注册)

    转载自:JNI查找 native 方法的规则 通过上一篇文章,大家明白了调用 native 方法之前,首先要调用 System.loadLibrary 接口加载一个实现了native 方法的动态库才能 ...

  6. 数据结构-动态查找树表与平衡二叉树 红黑树简单介绍

    参考资料 数据结构(严蔚敏) 大话数据结构 百度百科 https://blog.csdn.net/lpp0900320123/article/details/39524947 https://mp.w ...

  7. 【数据结构笔记11】二叉搜索树,动态查找,删除操作

    本次笔记内容: 4.1.1 二叉搜索树及查找 4.1.2 二叉搜索树的插入 4.1.3 二叉搜索树的删除 文章目录 动态查找 什么是二叉搜索树(BST) 二叉树的操作 二叉搜索树的查找操作 二叉搜索树 ...

  8. 《大话数据结构》读书笔记-查找

    写在前面:本文仅供个人学习使用.<大话数据结构>通俗易懂,适合整体做笔记输出,构建体系.并且文中很多图片来源于该书,如有侵权,请联系删除. 文章目录 8.1 开场白 8.2 查找概论 8. ...

  9. 王道408数据结构——第七章 查找

    文章目录 一.基本概念 二.顺序查找(线性查找) 一般线性表的顺序查找 有序表的顺序查找 二.折半查找(二分查找) 三.分块查找(索引顺序查找) 四.B树 五.B+树 六.散列表 构造散列函数 1. ...

最新文章

  1. Resteasy集成Spring
  2. windows 10家庭版关闭Defender
  3. 代码规范(一)——java篇
  4. Dreamweaver cs3快捷键大全
  5. SQL*Plus 系统变量之53 - TERM[OUT]
  6. ssm 项目记录用户操作日志和异常日志
  7. bzoj 1710: [Usaco2007 Open]Cheappal 廉价回文【区间dp】
  8. 加速转型 高通绝地反攻
  9. HCIE RS 全套笔记整理
  10. C++工业设备日志记录系统
  11. PHP下ajax跨域的解决方案之window.name
  12. Spring 中的 bean 生命周期(代码实现)
  13. html横线标记_html中横线怎么写代码
  14. Spire.Doc for Java-根据表格模板生成word表格
  15. sql语句查询时,where条件同时使用and和or
  16. python语音播报天气预报_Python3爬虫之自动查询天气并实现语音播报
  17. PLC需要有什么样的基础才能学?
  18. conda 安装第三方包
  19. telnet登录SMTP发送邮件
  20. 共享内存 shmget函数

热门文章

  1. 文件磁盘相关函数[9]-获取当前文件夹 GetCurrentDir
  2. c#操作word表格
  3. 关于Response.redirect和Response.End出现线程中止异常的处理
  4. 控制項學習三(從繼承開始)
  5. php子类选择器代码,php – 可变产品选择器:获取实时选定值
  6. python中queue使用_在python2.6中使用Queue类
  7. linux启动Spark本地模式(Local模式)
  8. 面试必备Linux基础知识
  9. 社会化分享插件集成分享
  10. 未来大数据的处理和发展的五个趋势