当前位置: 首页 > news >正文

查找算法-插值查找法(Interpolation Search)

目录

 查找算法-插值查找法(Interpolation Search)

1、说明

2、算法分析

3、C++代码 


 查找算法-插值查找法(Interpolation Search)

1、说明

插值查找法又称为插补查找法,是二分查找法的改进版。它是按照数据位置的分布,利用公式预测数据所在的位置,再以二分法的方式渐渐逼近。使用插值查找法是假设数据平均分布在数组中,而每一项数据的差距相当接近或有一定的距离比例。插值查找法的公式为:

Mid = low + ((key + data[low])/(data[high] - data[low]))*(high - low)

其中,key是要查找的键值,data[high]、data[low]是剩余待查找记录中的最大值和最小值。

2、算法分析

  1. 一般而言,插值查找法优于顺序查找法,如果数据的分布越平均,查找速度就越快,甚至可能第一次就找到数据。插值查找法的时间复杂度取决于数据分布的情况,平均而言优于O(log_{2}n)
  2. 使用插值查找法的数据需要先经过排序。

3、C++代码 

#include<iostream>
using namespace std;void SetData(int* Data, int Size) {for (int i = 0; i < Size; i++) {Data[i] = rand() % 150 + 1;}
}void Sort(int* Data, int Size) {for (int i = 0; i < Size; i++) {for (int j = i + 1; j < Size; j++) {if (Data[i] > Data[j]) {int temp = Data[i];Data[i] = Data[j];Data[j] = temp;}}}
}void Print(int* Data, int Size) {for (int i = 0; i < Size / 10; i++) {for (int j = 0; j < 10; j++) {cout << Data[i * 10 + j] << "\t";}cout << endl;}
}int InterpolationSearch(int* Data, int Size, int Value) {int low = 0;int high = Size - 1;while (low <= high && Value != -1) {int mid = low+((Value-Data[low])/(Data[high]-Data[low]))*(high - low);if (Value < Data[mid]) {high = mid - 1;}else if (Value > Data[mid]) {low = mid + 1;}elsereturn mid;}return -1;
}int main() {int Size = 80;int* Data = new int[Size] {0};SetData(Data, Size);Sort(Data, Size);cout << "原始数据:" << endl;Print(Data, Size);cout << "---------------------" << endl;int num = 0;cout << "请输入想要查找的数据:";cin >> num;int index = -1;index = InterpolationSearch(Data, Size, num);if (index != -1)cout << "查找的数据在数据库的第[ " << index + 1 << " ]位" << endl;elsecout << "在数据库中没有找到该数据" << endl;return 0;
}

输出结果 

相关文章:

  • asp.net core项目部署到iis每次更新都提示被占用需要停止网站才可以的问题解决
  • Golang 继承
  • 【阅读和学习代码】VoxelNet
  • 动手学深度学习—网络中的网络NiN(代码详解)
  • 功能测试想进阶,可以提供一点点思路和方向吗?
  • 深度学习——图像分类(CIFAR-10)
  • vue项目package.json与package-lock.json作用及区别
  • 10款轻量型的嵌入式GUI库分享
  • ajax请求的时候get 和post方式的区别?
  • 【Java】PAT Basic Level 1023 组个最小数
  • 怎么降低Linux内核驱动开发的风险?
  • C# 图解教程 第5版 —— 第10章 语句
  • appium操控微信小程序的坑
  • Centos 7 安装 Docker Enginee
  • rabbitmq-3.8.15集群、集群镜像模式安装部署
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 07.Android之多媒体问题
  • 2017-08-04 前端日报
  • 77. Combinations
  • angular2 简述
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java面向对象及其三大特征
  • Linux快速复制或删除大量小文件
  • Logstash 参考指南(目录)
  • MySQL几个简单SQL的优化
  • Netty源码解析1-Buffer
  • Nodejs和JavaWeb协助开发
  • php面试题 汇集2
  • Vue.js源码(2):初探List Rendering
  • WebSocket使用
  • 阿里云Kubernetes容器服务上体验Knative
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 高性能JavaScript阅读简记(三)
  • 工作手记之html2canvas使用概述
  • 两列自适应布局方案整理
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 算法之不定期更新(一)(2018-04-12)
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 线上 python http server profile 实践
  • 小程序 setData 学问多
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • #微信小程序:微信小程序常见的配置传值
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (Matlab)使用竞争神经网络实现数据聚类
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Project Open Day(2011.11.13)
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)