zoukankan      html  css  js  c++  java
  • 插值查找

    插值查找算法

    算法思想

    • 假如有一本英文的字典,你现在要查找apple这个单词,你肯定不会一页页去翻,也不会从中间去翻,你肯定会去前边翻,因为你知道字典是有序的,从A-Z,已知A在前面,所以你一定会去前面翻

    • 同样的,对于一个值均匀增长的一个数组来说,已知一个值的大小,我们就可以按照值的分布规律来猜测它的下标

    • 假设值随下标增加如上图所示,现在已知值求下标,那么通过函数公式可知道y-a[low] =(a[high]-a[low])/(high-low)(x-low),那么代入要查找的值key,就可以求出大概的下标index = low + (high - low)(key - a[low])/ (a[high] - a[low])

    代码实现

    package search;
    
    public class InterpolationSearch {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		int[] a= {1,2,3,4,5,6,7,8,9};
    		int index=interpolationSearch(a, 6);
    		System.out.println(index);
    	}
    	
    	public static int interpolationSearch(int[] a,int key)
    	{
    		int low=0;
    		int high=a.length-1;
    		int index;
    		while(a[low]!=a[high]&&key<=a[high]&&key>=a[low])//判断条件
    		{
    			index=low + (high - low)*(key - a[low])/(a[high] - a[low]);
    			if(a[index]==key)
    			{
    				return index;
    			}
    			else if(a[index]<key)
    			{
    				high=index-1;
    			}
    			else
    			{
    				low=index+1;
    			}
    		}
    		if(key==a[low])//针对重复元素
    		{
    			return low;
    		}
    		else
    		{
    			return -1;
    		}
    	}
    
    }
    
    

    注意

    • 要保证这两个条件,不可以用while(low<=high),否则可能在查找不存在的值的时候陷入死循环
      1.a[low]!=a[high] ( 插值公式里分母是a[high] - a[low],不能等于0)
      2.a[low]<=key<=a[high]

    • 要考虑到都是重复元素的极端情况例如都是2,a={2,2,2,2,2,2,2,2}

    特性

    • 插值查找的时间复杂度是(logNlogN)
    • 插值查找适合于元素有序且均匀分布的情况
  • 相关阅读:
    App.js和App.css(用于移动应用的js和css)
    cookie和session使用
    html实现返回上一页的几种方法(javaScript:history.go(-1);)
    sublime找到成对标签(Ctrl+Shift+")
    Java NIO框架Netty课程(一) – Hello Netty
    信息增益的特征选择方法
    Java线程学习笔记(两) 线程异常处理
    薏米红豆粥的功效和实践演示
    文件翻译002片:Process Monitor帮助文档(Part 2)
    Spring MVC 3 深入总结
  • 原文地址:https://www.cnblogs.com/mengxiaoleng/p/11745695.html
Copyright © 2011-2022 走看看