数据结构:静态查找动态查找

版权声明:作者:Rookiekk 联系邮箱:[email protected] 欢迎转载或分享,但请务必声明文章出处。 https://blog.csdn.net/qq_18888869/article/details/88540334

概念

1、静态查找

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

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

2、动态查找

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

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

一、静态查找表

1.顺序查找

假设每个记录的查找概率相等,顺序查找的平均查找长度:ASL=\sum_{i=1}^{n}P_{i}C^{i} = \frac{1}{n}\sum_{i=1}^{n}(n-i+1)=\frac{n+1}{2}

假设查找成功与不成功的可能性相同,对每个记录查找概率也相等,则P_{i} = 1/(2n),此时平均查找长度为ASL=\frac{3}{4}(n+1)

2.有序表查找

折半查找:这个查找过程类似二叉树,具有n个节点的判定树深度为\left \lfloor log_{2}n \right \rfloor + 1,平均查找长度为ASL=\frac{1}{n}\sum _{j =1}^{h}j*2_{j-1} = \frac{n+1}{n}log_{2}(n+1)-1

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

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

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

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

                             ASL_{bs} = L_{b} + L_{w}

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

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

                            ASL = \frac{b+1}{2}+\frac{s+1}{2}

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

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

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

平均查找长度:

以一个牛客网上的题目为例:设顺序线性表的长度为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个节点的二叉排序树的平均查找长度和树的形态有关,最好和log_{2}n成正比,当先后插入的关键字有序,构成的二叉排序树蜕变为单支树,树的深度为n,最坏情况,平均查找长度为\frac{n+1}{2}

2.1.2平衡二叉树(AVL树)

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

2.2B-树和B+树

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

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

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

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

参考文献:

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

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

猜你喜欢

转载自blog.csdn.net/qq_18888869/article/details/88540334