二分查找的改进--差值查找

差值查找

在二分查找中,我们每次比较都可以排除一半的数据量,这个已经是很高效了。如果利用关键字本身的信息,每次排除的数据量充分依赖于关键字的大小,则查找会更高效,这就是差值查找的思想。

下面通过示例代码,比较二分查找和差值查找的不同,在不同中领略差值查找的改良之处。

#include <stdio.h>
#include <stdlib.h>
int InterSearch(int *array, int n, int key)
{
	if (array && n > 0)
	{
		int low, high, mid;
		low = 0, high = n - 1;
		while (low <= high)
		{
			mid = (low + high) / 2;    //二分查找
			//mid = low + (high - low)*(key - array[low]) / (array[high] - array[low]);   //差值查找
			static int i = 1;
			printf("查找第 %d 次\n", i++);
			if (key < array[mid])
				high = mid - 1;
			else if (key > array[mid])
				low = mid + 1;
			else
				return mid;
		}
		return -1;
	}
	return -1;
}
void main()
{
	int array[] = { 1, 3, 5, 6, 7, 8, 9, 11, 13 };
	int key = 11;
	int sub = InterSearch(array, sizeof(array) / sizeof(int), key);
	if (sub != -1)
		printf("查找到的下标是 %d , key = %d \n", sub, key);
	else
		printf("查找失败!\n");
	system("pause");
}

运行

二分查找

差值查找

通过打开注释,分别对二分查找和差值查找进行测试。也可以查找一个不存在的关键字,实验发现,差值查找的查找次数明显少于二分查找。

专栏目录

时间: 2024-08-11 21:01:08

二分查找的改进--差值查找的相关文章

查找(哨兵查找、二分查找、差值查找)

#include <iostream> using namespace std; #define N 10 int fib(int n) { if(n == 0) { return 0; } else if(n == 1) { return 1; } else { return (fib(n-1) + fib(n-2)); } } //普通查找: int sequenctial_Search(int *a,int n,int key) { int i; a[0] = key; i = n; w

什么是差值查找?

1.插值查找与二分查找很类似,都是用于在有序的基础上查找某个元素 2.二分查找的原理是,每次都取一半,然后与mid值比较,再决定下一次查找的范围 3.设想在一本英文字典里查找某个单词,因为是根据字母序排列好的,你不会傻到采用二分查找的方法,先找到这本字典的一半,再取这本字典的四分之一...这样下去比较吧,这种效率显然不是最快的,此时就轮到我们的差值查找出场了. 4.差值公式的推导: 有序序列: 1 2,3,4,5,6,7,8,9,10 比例公式:   假设数组a[i]已经有序 (key-low)

C++ 二分查找 求最近的值

上代码: <span style="font-size:18px;"> #include <iostream> #include <math.h> using namespace std; int BinarySearch(float *array, int aSize, float key) { if ( array == NULL || aSize == 0 ) return -1; int low = 0; int high = aSize -

查找系列之简述顺序查找和二分查找

顺序查找和二分查找 一.顺序查找思想 1. 从表的一端开始扫描,顺序扫描线性表,依次扫描到的结点关键字与给定的值K相比较.如果当前扫描到的结点的关键字与给定的值K相等,则查找成功;若扫描结束后,仍未找到关键字与给定的值K相等,则查找失败; 2.顺序查找既适用于顺序存储结构,也适用于线性表的链式存储结构; 3.ASL= (n+1)/2为其平均查找长度 4.优点:算法简单,对存储结构形式没有要求 缺点:浪费空间,当长度非常大是效率低 5.算法描述: /** *顺序查找 *@param int a[]

查找算法系列之简单查找:顺序查找、二分查找、分块查找

近期总结了各大排序算法的原理 ,并对其进行了实现,想着一并把查找算法总结了,今天就着手开始总结查找算法. 废话不多说,这篇文章从最简单的查找算法开始讲起,之后会补充复杂的二叉搜索树查找(BST)和B树,B+树查找以及哈希查找等. 顾名思义,查找就是寻找到关键字在队列中的位置,最笨的查找算法就是依次顺序比较,复杂度为O(n),但是有很多方法的复杂度可以达到O(logn)等等. 1.顺序查找 关键字与数组中的数顺序比较,时间复杂度O(n). template<class T> int OrderS

基于二分查找法的数值区间查找

1.问题定义: 在有序数组中,查找在输入数组满足大于某值a,小于某值b的所有元素.其中a和b可以不在数组中. 2.举例描述: 输入数组eg:{2,7,8,11,16,26,31,33,37,40,45,49}.查找满足大于10小于30的所有数字,则输出的结果为{11,16,31}子集.若查找大于50或小于2则输出空集. 3.线性扫描方式: 复杂度O(n) 从左到右扫描满足条件的区间 4.二分查找方式: 复杂度O(logN)二分查找满足条件的区间,两次二分查找,确定子数组范围. auto bina

在二叉查找树中查找不小于某个值的最小数值

给定一颗二叉查找树,给定一个值value,求该二叉查找树中不小于某个值value的最小数值. 思考:二叉查找树的特征就是左子节点比父节点值小,右子节点比父节点值大.在获得该二叉查找树根节点的情况下,想要得到该二叉查找树中不小于某个值得最小数值,分以下几点考虑: 1.如果currentNode.getData() == value , 则currentNode节点即为所求节点. 2.如果currentNode.getData() < value , 则当前节点的左子树所有节点的值均小于value,

实现链表的初始化,按值查找,插入,删除

#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define OK   1#define ERROR  0#define TRUE 1#define FALSE 0typedef char ElemType;typedef struct Node    /*结点类型定义*/ {  ElemType data; struct Node  * next;}Node, *LinkList; void init_

map按value值查找——find_if的使用(转载)

转载:http://www.cnblogs.com/xufeiyang/archive/2012/05/09/2491871.html CValueFind 1 #ifndef _CVALUEFIND_H_ 2 #define _CVALUEFIND_H_ 3 #include <string> 4 #include <algorithm> 5 #include <map> 6 7 8 class map_value_finder 9 { 10 public: 11 m