【第22期】观点:IT 行业加班,到底有没有价值?

二分查找和斐波那契查找优化

原创 2016年06月01日 15:15:44

二分查找是一种很高效的查找方法,它需要所要查找的数列有序,然后每次折半进行查找,时间复杂度为O(logn),

理解起来不难但是在代码实现要注意边界

template<typename T>
int binarySearch(T aim,T *array,int left,int right){
	if(left<right){
		int mid=(left+right)>>1;
		if(aim<array[mid]){
			//right=mid;
			binarySearch(aim,array,left,mid);
		}
		else if(array[mid]<aim){
			//left=mid+1;
			binarySearch(aim,array,mid+1,right);
		}
		else{
			return mid;
		}		
	}
	else
	return -1;
}

将原来的数组区间[left,right)分为3份[left,mid),mid,[mid+1,right),通过重点mid来判断目标值属于哪个区间,然后再进行判断。

二分查找的方法是尽量的将区间等分,保证查找结构一个左右子树等高的树,但是通过分析上面代码可以知道,在左区间查找需要进行一次判断,在右区间进行查找需要进行两次判断,很明显若想让代码平均耗时减少,应保证目标值在左区间。所以应将原来的区间分为左区间大于又区间,通过证明知道采用黄金分割(斐波那数列)进行分割会较少时间复杂度

要用斐波那搜索,需要的前提条件是:数列有序,以及初始数列的长度加1是斐波那数。注意是数列长度fib[k]-1才行

所以首先应判断数列长度是不是某个fib-1才行

vector<int>fib;

int placeInFibonacci(int num){
	if(fib.size()<2){
		fib.push_back(0);
		fib.push_back(1);
	}
	for(int i=2;;++i){
		if(fib.size()==i){
			fib.push_back(fib[i-2]+fib[i-1]);
		}
		if(num==fib[i])
		return i;
		if(num<fib[fib.size()-1])
		return -1;
	}
}
template<typename T>
int fibonacciSearch(T aim,T *array,int left,int right){
	int k=placeInFibonacci(right+1);
	if(k==-1){
		return -1;	
	}
	while(left<right){
		int mid=fib[k-1]-1+left;
		if(aim<array[mid]){
			right=mid;
			--k;
		}
		else if(array[mid]<aim){
			left=mid+1;
			k-=2;
		}
		else{
			return mid;
			
		}		
	}
	return -1;
}

以上是数列中不含有重复的数当含有重复的数字的时候,若要返回最后一个数字的位置,则需要进行如下修改

template<typename T>
int binarySearch(T aim,T *array,int left,int right){
	while(left<right){
		int mid=(left+right)>>1;
		if(aim<array[mid]){
			right=mid;
		}
		else if(array[mid]<aim){
			left=mid+1;
		}
		else{
			while(aim==array[++mid]);
			return --mid;
		}		
	}
	return -1;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

算法--查找--斐波那契查找

相对于二分查找和差值查找,斐波那契查找的实现略显复杂。但是在明白它的主体思想之后,掌握起来也并不太难。既然叫斐波那契查找,首先得弄明白什么是斐波那契数列。相信大家对这个著名的数列也并不陌生,无论是C语...

斐波那契数列的最优算法(O(logN))

相信大家都对斐波那契数列已经相当的熟悉了,最多两分钟就可以写出来以下时间复杂度为O(N)的代码://递归实现 long long fib(int n) { if (n =1 || n== 2) {...

关于斐波那契数列的优化

斐波那契数列的优化
  • dadai_
  • dadai_
  • 2015-12-07 18:48
  • 1175

斐波那契查找详解

斐波那契查找的前提是待查找的查找表必须顺序存储并且有序。     相对于折半查找,一般将待比较的key值与第mid=(low+high)/2位置的元素比较,比较结果分三种情况      1)相等,mi...

斐波那契查找(黄金分割法查找)(仅使用加减实现的二分查找)

什么是斐波那契查找       斐波那契数列,又称黄金分割数列,指的是这样一个数列:1、1、2、3、5、8、13、21、····,在数学上,斐波那契被递归方法如下定义:F(1)=1,F(2)=1,F...

折半查找、插值查找和斐波那契查找

一、折半查找
  • cdu09
  • cdu09
  • 2014-04-07 21:32
  • 1475

斐波那契查找法

/*斐波那契查找法,前提是线性表必须有序,时间复杂度是O(logn)*/ #include const int MAXSIZE = 20; int Fibonacci_Search(in...
  • zpluw
  • zpluw
  • 2012-07-17 23:30
  • 3038

斐波那契查找

斐波那契查找是一种在有序表中高效查找指定元素的算法,比折半查找要复杂一些,主要复杂在要多做不少准备工作。下面看它的工作流程:         1.计算并保存一个斐波那契序列的数组,方便以后取值。数组...

斐波那契查找

斐波那契查找 黄金比例又称黄金分割,是指事物各部分间一定的数学比例关系,即将整体一分为二,较大部分与较小部分之比等于整体与较大部分之比,其比值约为1:0.618或1.618:1。 0.618被公...

“斐波那契查找”真的比“二分查找”快么?

Is Fibonacci Search really "faster" than Binary Search? 申明:本文讨论的搜索对象为有序数组,不是数学上讨论的函数。 1. 介绍 ...
  • fovwin
  • fovwin
  • 2013-06-11 22:20
  • 4351
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)