二分法中的移位操作

参考

http://www.cnblogs.com/zhengjunfei/p/4714098.html

折半查找是进行假发与除法运算(mid={low+high}/2),插值查找进行复杂的四则运算

(mid=low+(high-low)*(key-a[low])/(a[high]-a[low])),而斐波那契额查找只是最简单加减运算(mid=low+F[k-1]-1),在海量数据的查找过程中,这种细微的差别可能会影响最终的查找效率。

实际上在应用折半查找的过程中,通常都是通过移位的操作来实现除法的这一个细节,估计作者没有意识到。在一种最优使用斐波那契查找的条件是:当数据有一个二次方以上的递增过程,或者有一个性能的提升。但是这种性能的提升随机出现的概率还是太小了

发现实现的代码有问题,纠正如下:

int F[] = {0,1,1,2,3,5,8,13,21,34,55};

int Binary_Search(int* a, int n, int key)

{

int low, mid, high, i, k;

low  = 1;

high = n;

k    = 0;

while(n>F[k]-1)

{

k++;

}

while (low <= high)

{

mid = low + F[k-1] - 1;

if (key < a[mid])

{

high = mid - 1;

k--;

}

else if (key > a[mid])

{

low = mid + 1;

k = k - 2;

}

else

{

if (mid <= n)

{

return mid;

}

else

{

return n;

}

}

}

return 0;

}

int _tmain(int argc, _TCHAR* argv[])

{

int num[] = {0, 1, 26, 24, 35, 47, 59, 62, 73, 88, 99};

int size =  sizeof(num)/sizeof(num[0])-1;

int result = Binary_Search(num, size, 62);

printf("result:%d\n", result);

return 0;

}

时间: 2024-10-15 17:35:41

二分法中的移位操作的相关文章

java中的移位操作

java中的移位操作仅仅对int和long有效,byte.short.char升级为int后再进行移位 移位操作符有>>(右移).<<(左移).>>>(右移)三种,注意两点:1.没有<<<符号  2.移位是不循环的 三种的差别是 >>是带符号右移.负数高位补1,正数补0         ----->>>也就是在高位用符号位进行填充. <<左移无论负数还是正数,在低位永远补0 >>>是不带

c语言中的位移位操作

先要了解一下C语言里全部的位运算都是指二进制数的位运算.即使输入的是十进制的数,在内存中也是存储为二进制形式. “<<”使用方法: 格式是:a<<m,a和m必须是整型表达式,要求m>=0. 功能:将整型数a按二进制位向左移动m位,高位移出后,低位补0. “>>”使用方法: 格式是:a>>m,a和m必须是整型表达式,要求m>=0. 功能:将整型数a按二进制位向右移动m位,低位移出后,高位补0 C语言中的移位操作,内容不多.只是有些地方你不注意,就疏

LeetCode总结,二分法一般性总结

一,学习别人的总结与讲解 本部分的参考见末尾,本部分文字是在其基础上的二度总结(节约时间和精力). 1,典型的二分法 算法:当数据量很大适宜采用该方法.采用二分法查找时,数据需是排好序的. 基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较, 如果当前位置arr[k]值等于key,则查找成功: 若key小于当前位置值arr[k],则在数列的前半段中查找,arr[low,mid-1]: 若key大于当前位置值arr[k],则在数列的后半段中继续查找arr[mid+1,h

c语言移位操作

先要了解一下C语言里全部的位运算都是指二进制数的位运算.即使输入的是十进制的数,在内存中也是存储为二进制形式. “<<”使用方法: 格式是:a<<m,a和m必须是整型表达式,要求m>=0. 功能:将整型数a按二进制位向左移动m位,高位移出后,低位补0. “>>”使用方法: 格式是:a>>m,a和m必须是整型表达式,要求m>=0. 功能:将整型数a按二进制位向右移动m位,低位移出后,高位补0 C语言中的移位操作,内容不多.只是有些地方你不注意,就疏

【转】C语言中的左移与右移

先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: int i = 1;i = i << 2;  //把i里的值左移2位 也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成 000...0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因) 需要注意的一个问题是int类型最左

Java学习笔记(一)

1.java是区分大小写的. 2.java类命名规则是驼峰式命名(即每个单词的首字母大写). 3.java有8种基本的数据类型:4种整形.2种浮点.1种char.1种布尔型(java没有unsigned类型,浮点类型一般使用double类型,在编程中一般不要使用char类型). 4.在java中变量的声明尽可能地靠近变量第一次使用的地方. 5.final关键字表示该变量只能被赋值一次. eg: final type var 6.常量的命名一般采用全部大写的方式,而变量一般采用首字母小写后单词首字

谈谈补码与移位

在计算机中整数的表示使用补码来表示的. 什么是补码呢?首先要明白什么是原码. 数字是有符号的,计算机中,用最高位作为符号位.以四位机器码举例:1的原码表示是:0001: -1 的原码表示是:1001. 也就是说表示实际数值的只有3位.因此4位机器码原码表示数的范围是:[-7, 7],其中0有两种表示,+0:  0000; -0:   1000. 原码表示清晰易懂,但对机器来说却是个麻烦,因为我们必须设计两套电路分别表示加法和减法. 为了统一加减法电路,人们想到了同余原理,让符号位也参与运算,补码

三种初步简易的方法求解数值问题 of C++

1. “二分法解方程” 在二分法中,从区间[a,b]开始,用函数值f(a)与f(b)拥有相反的符号.如果f在这个区间连续,则f的图像至少在x=a,x=b之间穿越x轴一次,因此方程f(x)=0在[a,b]之间至少有一个解,通过逐步对[a,b]区间进行二分处理,选取在那一部分改变了符号,逐步缩小方程解的更小区域. 1 /************************************************************************/ 2 /*二分法 解方程 */ 3

指定CRC32反构数据

指定CRC反构数据 指定CRC反构数据 1 题目 2 CRC32算法 3 定义运算符 4 逆运算和反运算 5 题目分解 6 处理数组 7 驱动表法 8 处理文件 [摘要] 针对CRC32算法,给定希望产生的CRC32校验和,通过修改给定文件中连续4个字节,将CRC32改变成希望产生的值. 1. 题目 给出一组具体的题目,可以便于对问题的分析与解答,并用来验证算法的正确. 已知如下数据: 00 01 02 03 04 05 06 07 08 09 ?? ?? ?? ?? 0A 0B 0C 0D 0