查找算法之内插搜寻法
创始人
2025-05-30 18:46:00
0

给定一个由n个均匀分布的值组成的排序数组arr[],编写一个函数来搜索数组中特定的元素x。

线性搜索需要O(n)个时间,跳转搜索需要O(√n)个时间,二分搜索需要O(log n)个时间。

插值搜索是对实例的二进制搜索的改进,其中排序数组中的值是均匀分布的。插值在已知数据点的离散集范围内构造新的数据点。二分查找总是到中间的元素进行检查。另一方面,插值搜索可以根据被搜索键的值去不同的位置。例如,如果键的值更接近最后一个元素,插值搜索可能会从结束端开始搜索。

算法公式

为了找到要搜索的位置,使用以下公式。

//公式的思想是返回更高的pos值

//当要搜索的元素接近arr[hi]时。和

//当接近arr[lo]时更小的值

有许多不同的插值方法,其中一个被称为线性插值。线性插值取(x1,y1)和(x2,y2)两个数据点,公式为:在点(x,y)处。

这个算法的工作方式是我们在字典中搜索单词。插值搜索算法改进了二分搜索算法。求值的公式是 K = data-low/high-low.。

K是一个常数,用来缩小搜索空间。在二分搜索的情况下,这个常数的值是:K=(low+high)/2.

pos的公式可以推导如下。

假设数组的元素是线性分布的。

直线一般方程:y = m*x + c。

Y是数组中的值,x是它的下标。

现在把lo hi和x的值代入方程

arr[hi] = m*hi+c ----(1)

arr[lo] = m*lo+c ----(2)

x = m*pos + c ----(3)

m = (arr[hi] - arr[lo] )/ (hi - lo)

subtracting eqxn (2) from (3)

x - arr[lo] = m * (pos - lo)

lo + (x - arr[lo])/m = pos

pos = lo + (x - arr[lo]) *(hi - lo)/(arr[hi] - arr[lo])

算法

内插搜寻算法的其余部分除了上面的分区逻辑外是相同的。

步骤1:在循环中,使用上面给出的公式计算“pos”的值。

步骤2:如果匹配,返回该项的索引,并退出。

步骤3:如果项目小于arr[pos],计算左子数组的探测位置。否则,在右子数组中进行相同的计算。

步骤4:重复操作,直到找到匹配项或子数组归零。

下面是算法的C代码递归方法实现。

// C program to implement interpolation search
// with recursion
#include // If x is present in arr[0..n-1], then returns
// index of it, else returns -1.
int interpolationSearch(int arr[], int lo, int hi, int x)
{int pos;// Since array is sorted, an element present// in array must be in range defined by cornerif (lo <= hi && x >= arr[lo] && x <= arr[hi]) {// Probing the position with keeping// uniform distribution in mind.pos = lo+ (((double)(hi - lo) / (arr[hi] - arr[lo]))* (x - arr[lo]));// Condition of target foundif (arr[pos] == x)return pos;// If x is larger, x is in right sub arrayif (arr[pos] < x)return interpolationSearch(arr, pos + 1, hi, x);// If x is smaller, x is in left sub arrayif (arr[pos] > x)return interpolationSearch(arr, lo, pos - 1, x);}return -1;
}// Driver Code
int main()
{// Array of items on which search will// be conducted.int arr[] = { 10, 12, 13, 16, 18, 19, 20, 21,22, 23, 24, 33, 35, 42, 47 };int n = sizeof(arr) / sizeof(arr[0]);int x = 18; // Element to be searchedint index = interpolationSearch(arr, 0, n - 1, x);// If element was foundif (index != -1)printf("Element found at index %d", index);elseprintf("Element not found.");return 0;
}

输出

Element found at index 4

下面是算法的C++代码递归方法实现。

// C++ program to implement interpolation search by using iteration approach
#include
using namespace std;int interpolationSearch(int arr[], int n, int x)
{// Find indexes of two cornersint low = 0, high = (n - 1);// Since array is sorted, an element present// in array must be in range defined by cornerwhile (low <= high && x >= arr[low] && x <= arr[high]){if (low == high){if (arr[low] == x) return low;return -1;}// Probing the position with keeping// uniform distribution in mind.int pos = low + (((double)(high - low) /(arr[high] - arr[low])) * (x - arr[low]));// Condition of target foundif (arr[pos] == x)return pos;// If x is larger, x is in upper partif (arr[pos] < x)low = pos + 1;// If x is smaller, x is in the lower partelsehigh = pos - 1;}return -1;
}// Main function
int main()
{// Array of items on whighch search will// be conducted.int arr[] = {10, 12, 13, 16, 18, 19, 20, 21,22, 23, 24, 33, 35, 42, 47};int n = sizeof(arr)/sizeof(arr[0]);int x = 18; // Element to be searchedint index = interpolationSearch(arr, n, x);// If element was foundif (index != -1)cout << "Element found at index " << index;elsecout << "Element not found.";return 0;
}
//this code contributed by Ajay Singh

相关内容

热门资讯

银行信贷员竞聘演讲稿范文 信贷... 银行信贷员竞聘演讲稿  竞聘人XX,我竞聘的岗位是信贷岗,竞聘理由如下:  我有一定的文字表达能力和...
关爱他人优秀演讲稿范文 关爱他... 关爱他人优秀演讲稿篇1  得到他人的的关爱是一种幸福,关爱他人更是一种美德。在我成长的岁月中,常常得...
颂歌献给党演讲稿范文 我把赞歌... 颂歌献给党演讲稿一  亲爱的党啊,在庆祝您华诞之际,请收下我,一名曾在死亡线上徘徊了好长一段时间后,...
励志演讲稿参考范文 励志演讲稿... 励志演讲稿参考范文【1】  各位领导、各位同事,大家下午好!  今天我要演讲的题目是《青春风采、励志...
银行营销岗位竞聘演讲稿 银行竞...   银行营销岗位竞聘演讲稿1  我是来自观音阁支行的李梦娜,我演讲的题目是学习、创新、团结。  每个...
logstash+elasti... 文章目录一.安装ELK 7.17二.为Elasticsearch设置密码三.配置logstash四....
华为OD机试题,用 Java ... 华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已...
银行竞聘副行长演讲稿 竞聘银行... 银行竞聘副行长演讲稿【1】  尊敬的各位评委、各位领导、同志们:  大家*午好!  首先,真诚的感谢...
关于低碳绿色环保演讲稿 节能低...  尊敬的各位领导,各位评委,敬爱的老师,亲爱的同学们:  大家晚上好!  我演讲的题目是《迈出那一小...
因果推断dowhy之-ihdp... 0x01. 案例背景 IHDP(Infant Health and Developme...
关于银行竞聘演讲稿三篇 银行营... 银行竞聘演讲稿1尊敬的各位领导、同志们:  大家好!  我叫xxx,现年32岁,金融本科文化,中国共...
加强师德师风教育演讲稿 师德师... 加强师德师风教育演讲稿一  今天,我们怀着喜悦的心情迎来了中国共产党的80华诞。中国共产党是中国工人...
环保先进个人演讲稿范文 环保工...   环保先进个人演讲稿  同学们:  我今天发言的主题是《保护环境,珍惜地球》。  我们生活在地球上...
医院借力泛微今承达实现数字化合...   国家卫健委印发的《公立医院内部控制管理办法》中要求“充分利用信息技术加强内部控制建设࿰...
设置jvm参数,验证结果 文章目录前言一、启动java项目二、开始验证设置项目的jvm参数总结 前言 书接上文上个博文 由于...
简短的自我介绍演讲稿 演讲稿3... 简短的自我介绍演讲稿1  大家好!非常感谢曙光双语学校能够给予我这样的一个机会让我来到这个地方作 自...
小学生环保演讲稿范文 小学生环... 篇一:小学的环保演讲稿同学们:大家好!  你知道全国每天节约一张纸,一年可以节约多少张纸吗?4745...
从诚信的小事做起演讲稿 诚信要... 诚信的小事做起  古人说:言行可模可范者,人师也。一个父亲不诚信,影响的只是自己的孩子,而一个老师不...
文明礼仪从小事做起演讲稿两篇 ... 【1】文明礼仪从小事做起  敬爱的老师,亲爱的同学们:  大家早上好!今天,我国旗下演讲的题目是《文...
世界环保日演讲稿精选 幼儿园环... 世界环保日演讲稿精选篇1各位领导,同事:  大家好!  市政府市长提名我担任运城市环保局局长,提请本...