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

0.概述

介绍了有序向量二分查找与Fibonacci查找,再介绍下有序向量的插值查找。

1. 原理与算法

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

算法前提:有序且分布均匀且独立
在这里插入图片描述
轴点mi值依据首尾索引值、该位置上对应的值和待查找元素大致猜测。

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

2. 性能

在这里插入图片描述

  • 对二长度为 n 的此类向量,插值查找的期望运行时间为 O(loglogn)
    在这里插入图片描述

3. 实现

//实现插值查找算法,ele 表示要查找的目标元素,[begin,end] 指定查找区域
int interpolation_search(int* arr, int begin, int end, int ele) {
	int mid = 0;
	//如果[begin,end] 不存在,返回 -1
	if (begin > end) {
		return -1;
	}
	//如果搜索区域内只有一个元素,判断其是否为目标元素
	if (begin == end) {
		if (ele == arr[begin]) {
			return begin;
		}
		//如果该元素非目标元素,则查找失败
		return -1;
	}
	// 找到"中间元素"所在的位置
	mid = begin + ((end - begin) / (arr[end] - arr[begin]) * (ele - arr[begin]));
	//递归的出口
	if (ele == arr[mid]) {
		return mid;
	}
	//比较 ele 和 arr[mid] 的值,缩小 ele 可能存在的区域
	if (ele < arr[mid]) {
		//新的搜索区域为 [begin,mid-1]
		return interpolation_search(arr, begin, mid - 1, ele);
	}
	else {
		//新的搜索区域为 [mid+1,end]
		return interpolation_search(arr, mid + 1, end, ele);
	}
}

4. 不足

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

5. 综合

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

大规模:插值查找
中规模:折半查找
小规模:顺序查找

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

相关推荐

  1. 突破编程_C++_查找算法查找

    2024-04-28 12:52:03       29 阅读
  2. python查找

    2024-04-28 12:52:03       35 阅读
  3. 算法--

    2024-04-28 12:52:03       38 阅读
  4. GIS算法--克里金算法

    2024-04-28 12:52:03       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-28 12:52:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-28 12:52:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-28 12:52:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-28 12:52:03       20 阅读

热门阅读

  1. 前端网络安全面试题:CSRF 与 XSS

    2024-04-28 12:52:03       12 阅读
  2. 商城数据库(77-80)

    2024-04-28 12:52:03       13 阅读
  3. jupyter lab 如何安装和启动

    2024-04-28 12:52:03       14 阅读
  4. Vue.js 的事件循环(Event Loop)机制

    2024-04-28 12:52:03       13 阅读
  5. 关于数据库分库分表

    2024-04-28 12:52:03       11 阅读
  6. 12.7.1 实验7:实施路由器密码恢复

    2024-04-28 12:52:03       12 阅读
  7. ES6相关语法规范

    2024-04-28 12:52:03       10 阅读
  8. 探索中国IT行业的知名技术社区

    2024-04-28 12:52:03       14 阅读
  9. C 练习实例36 - 求100之内的素数

    2024-04-28 12:52:03       47 阅读