算法设计优化——有序向量插值查找

0.概述

介绍了有序向量二分查找与Fibonacci查找,再介绍下有序向量的插值查找算法,包括算法原理分析,示例与实现,优点。

1. 原理与算法

算法基于二分查找(binary search) 演变而成,拥有二分查找时间复制度小的优点,而思想也几乎是继承了二分查找。

算法前提:向量中各元素有序、分布均匀且独立

轴点mi值依据首尾索引值、该位置上对应的值和待查找元素大致猜测。

该公式即为mi点的选取方式,而在 e < A[mi] 时则将high取为mi - 1,这点与二分查找同理,e > A[mi]时则同理将 low 取为 mi + 1

2. 示例与实现

此版示例显示,low和middle的计算很容易陷入10与11的死循环

此版插值查找算法采取措施防止死循环发生。

cpp 复制代码
#include<iostream>
using namespace std;

//实现插值查找算法,e 表示要查找的目标元素,[lo,hi] 指定查找区域
int interpolation_search(int* A, int lo, int hi, int e) {
	int mi = 0;

	while (lo < hi) { //每步迭代仅需做一次比较判断,有两个分支
		// 猜测"中间元素"所在的位置
		mi = lo + (hi - lo - 1) * (e - A[lo]) / (A[hi - 1] - A[lo]);

		//mi 取值无效  防止死循环
		if (mi < lo) {
			return --lo;
		}

		//找到后便跳出循环
		if (e == A[mi]) {
			return mi;
		}

		(e < A[mi]) ? hi = mi : lo = mi + 1; //经比较后确定深入[lo, mi)或(mi, hi)
	}
	return --lo; //循环结束时,lo为大于e的元素的最小秩,故lo - 1即不大于e的元素的最大秩
}

int main()
{
	int a[19] = { 5,10,12,14,26,31,38,39,42,46,49,51,54,59,72,79,82,86,92 };

	cout << interpolation_search(a, 0, 18, 62);
	cout << endl;

	return 0;
}

算法的正确性同有序向量二分查找与Fibonacci查找中的二分查找版本C。

3. 性能

  • 对二长度为 n 的此类向量,插值查找的期望运行时间为 O(loglogn)

4. 优点

严格遵守search()语义,即返回确定不大于e的最后一个元素得秩,而不是-1。

5. 综合

当需要查找的数据源极大的时候,插值查找可以很大程度上缩短所需的时间,而在极小的数据源中,顺序查找更优,二分查找以及斐波那契查找则相较占中些。

大规模:插值查找

中规模:折半查找

小规模:顺序查找

参考连接:https://blog.csdn.net/glassesone/article/details/106910155

相关推荐
2301_8227032011 分钟前
Flutter 框架跨平台鸿蒙开发 - 创意声音合成器应用
算法·flutter·华为·harmonyos·鸿蒙
cmpxr_26 分钟前
【C】数组名、函数名的特殊
c语言·算法
KAU的云实验台37 分钟前
【算法精解】AIR期刊算法IAGWO:引入速度概念与逆多元二次权重,可应对高维/工程问题(附Matlab源码)
开发语言·算法·matlab
会编程的土豆43 分钟前
【数据结构与算法】再次全面了解LCS底层
开发语言·数据结构·c++·算法
咖啡忍者1 小时前
【SAP CO】4.COPC产品成本控制-3.WIP后台配置
笔记
aWty_1 小时前
实分析入门(1)--皮亚诺和自然数
学习
weixin_513449962 小时前
walk_these_ways项目学习记录第八篇(通过行为多样性 (MoB) 实现地形泛化)--策略网络
开发语言·人工智能·python·学习
大熊背2 小时前
如何利用Lv值实现三级降帧
算法·自动曝光·lv·isppipeline
LX567772 小时前
传统编辑如何考取AI内容编辑师认证?学习路径详解
人工智能·学习