数据结构与算法(11)插值查找

联想一下自己在字典中查找单词的经历,我们肯定不会使用折半查找,因为对于分布有规律的单词而言,我们有更好的方式。我们会使用大脑的自适应计算出单词的大概位置,一步步缩减范围。类似的对于分布有规律的数据元素来说,我们可以改进一下折半查找的轴点,不使用中点,而是使其可以根据lo 和 hi的位置上元素的大小进行适当的调整。这就是插值查找的来源。

算法实现

int InsertSearch(List L, KeyValue k, int n)
{
    int lo = 0, hi = n - 1;
    int mid;
    while (lo < hi){
        mid = lo + (hi - lo) * (k - L[lo].key) / (L[hi].key - L[lo].key);
        if (L[mid].key == k)
            return mid;
        else if (L[mid].key < k)
            lo = mid + 1;
        else
            hi = mid - 1;
    }
    if (lo == hi){
        if (L[lo].key == k)
            return lo;
    }

    return -1;
}

总结:
1. 时间复杂度为O(log(logn)), 对于关键字分布较均匀的查找表来说比较适合,可以减少查找对比次数。
2. 数据元素分布均匀的话可以大大提高查找的速度,但是数据元素分布不均匀的话,mid的计算其实是有欺骗性的,这种方式不适合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值