查找算法

一、平均查找长度
设关键字个数为n,在各关键字等概率查找的前提下,
1、顺序查找的平均查找长度ASL=(n+1)/2,
2、在n趋于无穷大时,折半查找的ASL=((n+1)log2(n+1))/n - 1,当n大于50时,ASL约等于log2(n+1)-1
3、设分块查找中将长为 n 的表分成均等的 b 个块,每块 s 个元素,则 b = (n / s)上取整,如果索引表中采用顺序查找,则ASL=(b+1)/2+(s+1)/2;如果索引表中采用折半查找,则ASL=(s+1)/2+log2(b+1)-1
二、顺序查找
针对无序序列的一种最简单的查找方式。
时间复杂度为 O(n)。
三、折半查找
针对已排序序列的一种查找方式。并且只适用于顺序存储结构的序列。要求序列中的元素基本不变,在需要做删除和插入操作的时候,会影响检索效率。 时间复杂度为 O(logN)。
在有序表中查找关键字的值等于key的记录,如查找成功,则返回此记录的序号,否则返回-1
int BinSearch(ElemType elem[],int n,KeyType key)
{
    int low=0,high=n-1;
    while(low<=high)
    {
        int mid=(low+high)/2;
        if(key==elem[mid])
        {
            return mid;
        }
        else if(key<=elem[mid])
        {
            high=mid-1;
        }
        else
        {
            low=mid+1;
        }
    }
    return -1;
}
对表中每个数据元素的查找过程可用二叉树来描述,称这个描述查找过程的二叉树为二叉判定树。对于n个结点的判定树,树高为k,则有2^(k-1)-1<n<=2^k-1,即k-1<log(n+1)<=k,所以k=log(n+1)上取整。因此,折半查找在查找成功时,所进行的关键码比较次数至多为log(n+1)次。
四、二叉排序树
1、概念:
它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于左子树所在树的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于右子树所在树的根结点的值; (3)左、右子树也分别为二叉排序树;
2、二叉排序树的查找: 时间复杂度与树的深度的有关。
步骤:若根结点的关键字值等于查找的关键字,成功。
否则:若小于根结点的关键字值,递归查左子树。
若大于根结点的关键字值,递归查右子树。
若子树为空,查找不成功。
3、二叉排序树的插入: 首先执行查找算法,找出被插结点的父亲结点。
判断被插结点是其父亲结点的左儿子还是右儿子。将被插结点作为叶子结点插 入。
若二叉树为空。则首先单独生成根结点。
注意:新插入的结点总是叶子结点,所以算法复杂度是 O(h)。 4、二叉排序树的删除:
如果删除的结点没有孩子,则删除后算法结束; 如果删除的结点只有一个孩子,则删除后该孩子取代被删除结点的位置;
如果删除的结点有两个孩子,则选择该结点的后继结点(该结点右孩子为根的树 中的左子树中的值最小的点)作为新的根,同时在该后继结点开始,执行前两种删除 算法,删除算法结束。
五、B 树
一棵 m 阶的 B 树,或者为空树,或者满足以下特性: 1、树中每个结点至多有 m 棵子树。 2、若根节点不是叶子结点,则至少有两棵子树。 3、除根结点之外的所有非终端结点至少有 m/2 棵子树。 4、所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息;
5、有 k 个孩子的非终端结点恰好包含有 k-1 个关键字。
在 B 树中,每个结点中关键字从小到大排列,并且当该结点的孩子是非叶子结点时,
该 k-1 个关键字正好是 k 个孩子包含的关键字的值域的分划。
因为叶子结点不包含关键字,所以可以把叶子结点看成在树里实际上并不存在外部结 点,指向这些外部结点的指针为空,叶子结点的数目正好等于树中所包含的关键字总 个数加 1。
B 树中的一个包含 n 个关键字,n+1 个指针的结点的一般形式为: (n,P0,K1,P1,K2,P2,...,Kn,Pn)
其中,Ki 为关键字,K1<K2<...<Kn, Pi 是指向包括 Ki 到 Ki+1 之间的关键字的子 树的指针。
六、B+树
1、有 n 棵子树的结点中含有 n 个关键码。
2、所有的叶子结点中包含了全部关键码的信息,以及指向含有这些关键码记录的指 针,且叶子结点本身依关键码的大小自小而大地顺序连接。
3、所有的非终端结点可以看成是索引部分,结点中仅含有其子数根节点中最大(或最 小)的关键码。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值