zoukankan      html  css  js  c++  java
  • 有序表查找---插值查找

    插值查找和折半查找的思想是一样的,其代码机构也基本和折半查询相同:

    //折半查找
    	public int Binary_Search(int[] a, int n, int key) {
    		int low = 1, high = n, mid;
    		while(low <= high) {
    			mid = (int)((low + high) / 2);
    			if(key < a[mid]) {
    				high = mid - 1;
    			}
    			else if(key > a[mid]) {
    				low = mid + 1;
    			}
    			else return mid;
    		}
    		
    		return 0;
    	}
    

    但是我们可能会碰到这种情况,要在取值范围0-10000之间100个元素从小到大均匀分布的数组中查找5,那么这个时候我们肯定考虑从数组下表较小的开始从查找而不是从中间的5000开始查找。
    所以对于中间值下标的确定,mid=low+high2frac{low+high}{2}=low+12frac{1}{2}(high - low)
    将上述公式中12frac{1}{2}优化为:keya[low]a[high]a[low]frac{key - a[low]}{a[high] - a[low]}
    则mid=keya[low]a[high]a[low]frac{key - a[low]}{a[high] - a[low]}(high - low)

    其时间复杂度和折半查询相同,但是对于表比较大,且关键字分布比较均匀的查找表来说,其平均性能优于折半查询。对于分布极端不均匀的数据,用插值并不合适。

  • 相关阅读:
    Classification and Representation(分类与表示)
    静态链表
    拓扑序列
    二分图问题
    大数据概述
    QT出现应用程序无法正常启动0xc000007b的错误
    简易有穷自动机实验
    一个简易的C语言文法
    词法分析器实验报告
    浅谈词法分析器
  • 原文地址:https://www.cnblogs.com/lishanlei/p/10707802.html
Copyright © 2011-2022 走看看