//插值查找
/*
插值查找在实际使用时,一般要满足两个假设条件:
(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