查找 是数据结构中 数据运算的一部分 (有属于它自己的特殊的方法)
这篇文章主要是根据自己所学对所有的查找方法进行一个简单的总结:
一:
查找算法的评价指标:关键字的平均比较次数,也称为平均搜索长度。 ASL(Average Search Length)
公式解释:每一个记录 被找到 需要比较的次数的和 的平均值。
{n 代表元素||记录个数; pi代表查找到第i个元素的概率//默认为(1/n);ci代表找到第i个元素需要比较的次数 }
二、查找方法
线性表的查找{顺序查找、折半查找、分块查找}
顺序查找:
{设第i个元素被查找的概率为Pi,则静态查找表平均查找长度ASLSS=n*P1+(n-1)P2+..+Pi(n-i+1)+..+1*Pn +(n+1)*P0
通常所查找元素均在ST中,此时P0=0 }
若查找保证成功且各元素几率同(1/n)则 ASLSS=(n+1)/2 {计算过程:1/n*(n)*(n+1)/2}
若成功与否各50%,且各元素被找到概率同(1/2n)则 ASLSS=(n+1)/4 + (n+1)/2= 3*(n+1)/4 { 计算过程:查找到的概率+未找到的概率}
折半查找:
{(前提这个表为有序表,否则无法用折半查找) 折半查找的平均查找长度我们通过构造折半查找判定树来分析 折半查找判定树的构造方法:相加除以2下取整作为根,左边部分为左子树,右边部分为右子树,相加除2下取整}
Ø最坏查找长度为[log2(n)]+1,复杂度O(log2(n))
Ø当判定树为满二叉树时(n=2h-1),若查找成功且各元素几率同(1/n)则ASLbs=(1*2^0+2*2^1+3*2^2+…+h*2^h-1)/n≈log2(n+1)-1 {计算原理:元素在树的第几层就代表该元素需要查找几次才能成功}
例如:当给出一个长度为10的有序表让你进行折半查找时,首先要画出折半查找的判定树,然后通过判定树来求得查找成功的平均查找长度=(1+2*2+3*4+4*3)/10=2.9
分块查找:
{原理:块内无序,块间有序。将各块中的最大关键字构成一个索引表,表中还要包含每块的起始地址}
查找效率:( ASL=Lb + Lw )
树表的查找{二叉排序树、平衡二叉树、B-树、B+树、键树}
二叉排序树:
{原理:
二叉排序树或是空树,或是满足如下性质的二叉树:
(1)若其左子树非空,则左子树上所有结点的值均小于根结点的值;
(2)若其右子树非空,则右子树上所有结点的值均大于等于根结点的值;
(3)其左右子树本身又各是一棵二叉排序树
二叉排序树的中序遍历结果是:关键字递增的有序序列
}
平衡二叉树:
{原理:所有节点的左右子树的深度之差的绝对值<=1
要掌握构造平衡二叉树的方法:
每插入一个结点,检查该结点是否导致不平衡。若导致不平衡则找“最小不平衡树”,通过旋转使该最小的不平衡树平衡即可。
旋转原则:第一保证平衡性;第二保证是二叉排序树
}
对于一棵有n个结点的AVL树(平衡二叉树),其高度保持在O(log2n)数量级,ASL也保持在O(log2n)量级。
B-树:
B+树:
哈希表查找
{原理:}
性能分析: