基础算法-查找:插值查找

基础算法-查找:插值查找

算法描述

先来看一个实际问题:
我们在一本英汉字典中寻找单词“worst”,我们决不会仿照对半查找(或Fibonacci查找)那样,先查找字典中间的元素,然后查找字典四分之三处的元素等等. 事实上,我们是在所期望的地址(在字典的很靠后的地方)附近开始查找的,我们称这样的查找为插值查找。

可见,插值查找不同于前面讨论的几种查找算法,前面介绍的查找算法是基于严格比较的,即假定我们对线性表中元素的分布一无所知(或称没有启发式信息). 然而实际中,很多查找问题所涉及的表满足某些统计的特点。

插值查找在实际使用时,一般要满足两个假设条件:

(1)每一次对数据的访问与通常的指令相比,费用都是相当昂贵的。例如,待查找的表一定是在磁盘而非内存中,因而每一次比较都要进行磁盘访问。

(2)数据不仅是已被排好序的,而且呈现均匀分布特征。

伪代码

insertValue_Search(R,n,element)
//实现给定有序均匀分布数组R中元素element的查找
//输入:数组R,数组长度n,待查找元素的位置
//有无待查找的元素
from←0 ,to←n-1                    //初始化起止位置
while(from <= to)		
	middle ← from+(element-R[from])/(R[to]-R[from])*(to-from+0.5)//采用插值方法计算
	if R[mid]=element  return mid
	if R[mid]>element  to←mid-1
	if R[mid]<element  from←mid+1
return -1

具体实现

/*
*	功能:该函数用来实现插值查找算法
*	输入:查找数组search_table,数组长度n,查找元素element
*	输出:返回元素的位置
*/
int insertValue_Search(int search_table[], int n, int element)
{
	int low = 0;
	int high = n - 1;
	
	while(low <= high)
	{
		int mid = (int)(low + (element-search_table[low])/(search_table[high]-search_table[low])*(high-low));
		if(search_table[mid] == element)
		{
			return mid;
		}
		else if(search_table[mid] > element)
		{
			high = mid - 1;
		}
		else
		{
			low = mid + 1;
		}
	}//while
	
	return -1;
}

  从时间复杂度上来说,插值查找的时间复杂度也是O(logn),但对于表长较大,而关键字分布又比较均匀的查找来说,插值算法的平均性能比折半查找要好得多。但是,如果数组中的分布类似[0,1,2,2000,2001,……,99998,99999]这种极端不均匀的数据,用插值查找未必是合适的算法。

所以说,没有最好的算法,只有针对具体情况的最合适的算法。

转载于:https://www.cnblogs.com/stemon/p/4476075.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109466.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 文件夹打不开如何修复_为知笔记使用教程

    文件夹打不开如何修复_为知笔记使用教程呃….虽然是展示了笔记,但最为苦恼的一个问题,黏贴代码时,它竟然连序号都会粘上….最近再看谷粒学苑的笔记时,发现是ziw后缀的笔记,于是在网上下载了。呃~~下载好了打开文件一看,还是一如既往的会黏贴代码序号~,下载之后发现根本打不开文件,于是再次问度娘~~~通过发送的方式,将笔记发送到为知笔记软件里去。通过这个大神网友的评论才突然发现,原来是。的版本bug,下载旧版本就OK了。然后又再次找解决方法~~~的选项,找到以下目录,并把。…

    2022年10月12日
    4
  • linux 系统进行make menuconfig的时候出错

    linux 系统进行make menuconfig的时候出错错误信息:(ps:当前系统:Linuxlabpc4.13.0-36-generic#40~16.04.1-UbuntuSMPFriFeb1623:25:58UTC2018x86_64x86_64x86_64GNU/Linux)HOSTCCscripts/kconfig/mconf.oInfileincludedfromscripts/kc…

    2022年5月25日
    34
  • python进阶(22)pydantic–数据类型校验

    python进阶(22)pydantic–数据类型校验pydantic库的作用pydantic库是一种常用的用于数据接口schema定义与检查的库。Pydantic在运行时强制执行类型提示,并在数据无效时提供用户友好的错误信息。pydantic安

    2022年7月29日
    22
  • pytorch之dataloader,enumerate

    pytorch之dataloader,enumeratefromtorch utils dataimportTe utils dataimportDa torch tensor 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 b tor

    2025年8月1日
    2
  • crontab用法_切尔西对萨格勒布

    crontab用法_切尔西对萨格勒布Crontab语法一、基本语法minutehourday-of-monthmonth-of-yearday-of-weekcommands二、合法值00-5900-2301-3101-120-6(0issunday)三、特殊符号*代表所有的取值范围内的数字/代表每的意思,/5表示每5个单位-代表从某个数字到某个数字,分开几个离散的数…

    2025年6月10日
    2
  • 解决win10在安装Android-studio时提示HAXM无法安装问题[通俗易懂]

    解决win10在安装Android-studio时提示HAXM无法安装问题[通俗易懂]win10在安装Android-studio时提示HAXM无法安装ThiscomputerdoesnotsupportIntelVirtualizationTechnology(VT-x)oritisbeingexclusivelyusedbyHyper-V.HAXMcannotbeinstalled.PleaseensureHyper-VisdisabledinWindowsFeatures,orrefertotheIntelHAXM

    2022年6月28日
    83

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号