顺序查找和折半查找

   今天忽然想到這個,查了一下,保存保存~~~~

顺序表的查找:
1. 顺序查找
    [算法思想]:从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。此查找过程可用算法9.1描述之。


有序表的查找:
1. 折半查找算法。先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止。

    int Search_Bin(SSTable ST,KeyType key){
    //在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为该元素在表中的位置,否则为0。
    low=1; high=ST.lenqth; //置区间初值
    while (low<=high){
        mid = (low+high)/2
        if EQ(key, ST.elem[mid].key) return mid; //找到待查元素
        else if LT(key, ST.elem.[mid].key) high=mid - 1 //继续在前半区间进行查找
              else low = mid+1; //继续在后半区间进行查找
        }
    return 0; //顺序表中不存在待查元素
    } //Search_Bin


静态树表的查找:
    已知一个按关键字有序的记录序列:(rl, rl+1, …, rh) (9-8)
    其中,rl.key<rl+1.key<…<rh.key
    与每个记录相应的权值为:wl, wl+1, …, wh (9-9)
    现构造一棵二叉树,使这棵二叉树的带权内路径长度PH值在所有具有同样权值的二叉树中近似为最小,称这类二叉树为次优查找树(Nearly Optimal Search Tree)。它是构造近似最优二叉查找树的有效算法。

    构造次优查找树的方法是:
    首先在式(9-8)所示的记录序列中取第i(l≤i≤h)个记录构造根结点ri,使得
    h i-1
    △Pi=|∑wj-∑wj| (9-10)
    j=i+1 j=l
    取最小值(△Pi=Min{△Pj}),然后分别对子序列{rl,rl+1, …ri-1}和{ri+1,.., rh} 两棵次优查找树,并分别设为根结点ri的左子树和右子树。


索引顺序态树表的查找:
    索引顺序表 = 索引 + 顺序表

    若以索引顺序表表示静态查找表,则Search函数可用分块查找来实现。分块查找又称索引顺序查找,这是顺序查找的一种改进方法。在此查找法中,除表本身以外,尚需建立一个“索引表” 。

    查找方法:
    1)由索引确定记录所在区间;
    2)在顺序表的某个区间内进行查找。
    所以,这也是一种缩小区间的查找方法

 #region セットコードのインデックスの探す
        /// <summary>
        ///  セットコードのインデックスの探す
        /// </summary>
        /// <remarks>
        ///   セットコードのインデックスの探す。
        /// </remarks>
        /// <param name="nSetcd">セットコード</param>
        /// <param name="mcsArea">受診セット</param>
        /// <returns>セットコードのインデックス</returns>
        private int GetSetIndex(int? nSetcd,MCheckupSetCL mcsArea)
        {
            //最小インデックス
            int nLow = 0;
            //最大インデックス
            int nHeight = mcsArea.Count-1;
            //中心インデックス
            int nMid = 0;
            //ECには降順、昇順ですか
            bool bASC = false;
            //ECが昇順の場合
            if (mcsArea[0].Setcd < mcsArea[1].Setcd)
            {
                bASC = true;
                //セットコードが最大値
                if (nSetcd > mcsArea[nHeight].Setcd)
                {
                    return nHeight;
                }
                //セットコードが最小値
                else if (nSetcd < mcsArea[0].Setcd)
                {
                    return 0;
                }
            }
            //ECが降順の場合
            else
            {
                //セットコードが最大値
                if (nSetcd < mcsArea[nHeight].Setcd)
                {
                    return nHeight;
                }
                //セットコードが最小値
                else if (nSetcd > mcsArea[0].Setcd)
                {
                    return 0;
                }

            }
            while (nHeight>= nLow)
            {
                //中心値を取得する
                nMid = (nLow + nHeight) / 2;
                //ECが昇順の場合
                if (bASC)
                {
                    if (nSetcd > mcsArea[nMid].Setcd)
                    {
                        nLow = nMid;
                    }
                    else
                    {
                        nHeight = nMid;
                    }
                }
                //ECが降順の場合
                else
                {
                    if (nSetcd > mcsArea[nMid].Setcd)
                    {
                        nHeight = nMid;
                    }
                    else
                    {
                        nLow = nMid;
                    }
                }
            }
            return nLow;
        }
        #endregion
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值