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

来源:互联网 发布:淘宝首页装修素材下载 编辑:程序博客网 时间:2024/05/21 19:37

联想一下自己在字典中查找单词的经历,我们肯定不会使用折半查找,因为对于分布有规律的单词而言,我们有更好的方式。我们会使用大脑的自适应计算出单词的大概位置,一步步缩减范围。类似的对于分布有规律的数据元素来说,我们可以改进一下折半查找的轴点,不使用中点,而是使其可以根据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的计算其实是有欺骗性的,这种方式不适合。

0 0
原创粉丝点击