查找算法

来源:互联网 发布:linux安装mysql报错 编辑:程序博客网 时间:2024/06/14 11:04
一、平均查找长度
设关键字个数为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、所有的非终端结点可以看成是索引部分,结点中仅含有其子数根节点中最大(或最 小)的关键码。
1 0