插值查找详解

//插值查找

/*
插值查找在实际使用时,一般要满足两个假设条件:
(1)每一次对数据的访问与通常的指令相比,费用都是相当昂贵的。例如,待查找的表一定是在磁盘而非内存中,因而每一次比较都
要进行磁盘访问。
(2)数据不仅是已被排好序的,而且呈现均匀分布特征。

这种插值查找对表长较大的顺序表,其平均性能比折半查找好。
*/

#include<iostream>
#include<stdio.h>
using namespace std;

int insertValueSearch(int values[], int num,  int element)  
{  
    //初始化起止端口号  
    int from = 0;  
    int to = num-1;  
    //循环扫描  
    while(from <= to)  
    {  
        //采用插值算法得到中间元素的位置  
        int mid = (int)(from+(to-from)*(element-values[from])/(values[to]-values[from]));  
        //进行判断是否找到该元素  
        if(values[mid] > element)  
        {  
            to = mid-1;  
        }  
        else if(values[mid] < element)  
        {  
            from = mid+1;  
        }  
        else  
        {  
            //找到该元素,返回  
            return mid;  
        }  
    }  
    //未能查找到该元素  
    return -1;  
}  

int main() {  
    // TODO Auto-generated method stub  
    //定义数组,用来存放待查找的元素  
    int values[] = {05,13,19,21,37,56,64,75,80,88,92};  
    int len = sizeof(values)/sizeof(int);  
    int result = insertValueSearch(values,len,13);  
    if(result != -1)  
    {  

        cout<<"待查找的元素位置为——>"<<result<<endl;
    }  
    else  
    {  

        cout<<"不存在该元素!!"<<endl;
    }  

}  

//插值公式:
插值算法
其中ST.elem[l]和ST.elem[h]分别为有序表中具有最小关键字和最大关键字的记录。

//插值算法原理
这里写图片描述

当n1和n2无限接近时,近似直边三角形ABC、ADE为相似三角形,则有:BC/DE=AB/AD
在图中即有:F-F1/F2-F1=n-n1/n2-n1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值