`
nairuo1988
  • 浏览: 2978 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

二分法

阅读更多
1、基于:分治策略
2、应用:有序序列
3、隐喻:二叉树
4、时间复杂度:O(logn)
5、关键字:scope

	/**
	 * @param 数组a
	 * @param 目标值target
	 * @return 位序
	 */
	public static int binarySearch(int[] a, int target) {
		int left = 0;
		int right = a.length - 1;  //游标
   
		while (left <= right)      //范围a[left:right]
		{
			int middle = (left + right) / 2;  //取下整
			if (target == a[middle])
				return middle;
			else if (target < a[middle])
				right = middle - 1;  //*明确边界   
			else
				left = middle + 1;   //*~
		}
		return -1;
	}



关键点:
    二分法算法描述简单,但关于scope的划分,边界的问题,理解透彻,对于别的类似问题就得心应手。

1、游标:
         a[left:right] --闭区间,一个scope
2、下整:middle = (left+right)/2 --当scope变为2时,middle落在left上
3、闸门:while(left<=right)
        若target不在a中,最后一次循环中左右游标交叉,则target在区间   (right,left)中。可以修改算法,返回right&left。 
4、初始范围:a[0:n-1]
    进入循环:a[left:right]
   循环中,a[left:right]被分为三段:a[left:middle-1],a[middle],a[middle+1,right],边界要确保不重复,scope分明,就不会出现死循环。
  
    每步while循环,scope都会缩小,最终会到达闸门left=right(或提前找到结果);
                                    --算法会在有限步内终止   log(n)
    并且确保target要在新的scope中。
                                    --不会漏掉target



关键字:离散序列,连续序列


数学方面: --百度百科

一般地,对于函数f(x),如果存在实数c,当x=c时f(c)=0,那么把x=c叫做函数f(x)的零点。
  解方程即要求f(x)的所有零点。
  先找到a、b,使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求f[(a+b)/2],
  现在假设f(a)<0,f(b)>0,a<b
  ①如果f[(a+b)/2]=0,该点就是零点,
  如果f[(a+b)/2]<0,则在区间((a+b)/2,b)内有零点,(a+b)/2=>a,从①开始继续使用
  中点函数值判断。
  如果f[(a+b)/2]>0,则在区间(a,(a+b)/2)内有零点,(a+b)/2=>b,从①开始继续使用
  中点函数值判断。
  这样就可以不断接近零点。
  通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。
  给定精确度ξ,用二分法求函数f(x)零点近似值的步骤如下:
  1 确定区间[a,b],验证f(a)·f(b)<0,给定精确度ξ.
  2 求区间(a,b)的中点c.
  3 计算f(c).
  (1) 若f(c)=0,则c就是函数的零点;
  (2) 若f(a)·f(c)<0,则令b=c;
  (3) 若f(c)·f(b)<0,则令a=c.
  4 判断是否达到精确度ξ:即若┃a-b┃<ξ,则得到零点近似值a(或b),否则重复2-4.

 例:(C语言)
  方程式为:f(x) = 0,示例中f(x) = 1+x-x^3
  使用示例:
  input a b e: 1 2 1e-5
  solution: 1.32472

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>

double f(double x){
    return 1+x-x*x*x;
}
int main(){
    double a=0,b=0,e=1e-5;
    printf("input a b e:");
    scanf("%lf%lf%lf",&a,&b,&e);
    e=fabs(e);

    if(fabs(f(a))<=e){
        printf("solution:%lg\n",a);
    }else if(fabs(f(b))<=e){
        printf("solutionL:%lg\n",b);

    }else if(f(a)*f(b)>0){
        printf("f(%lg)*f(%lg)>0!need<=0!\n",a,b);
    }else
    {
        while(fabs(b-a)>e){
            double c=(a+b)/2.0;
            if(f(a)*f(c)<0)
            b=c;
            else
            a=c;
        }
        printf("solution:%lg\n",(a+b)/2.0);
    }
    return 0;
}



分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    二分法流程图1

    二分法流程图1 二分法是一种常用的数值计算方法,用于寻找单变量函数的零点。它的基本思想是通过不断地将搜索范围缩小,来逼近函数的零点。下面我们将通过流程图来详细地介绍二分法的工作过程。 首先,我们需要...

    二分法排序算法 C语言实现

    根据给定的文件信息,我们可以总结出以下关于“二分法排序算法C语言实现”的相关知识点: ### 1. 二分法搜索算法原理 二分法搜索算法,也称为折半查找算法,是一种在有序数组中查找特定元素的搜索算法。其基本思想...

    c语言二分法递归求解函数根

    二分法,也称为折半搜索,是一种在有序数组中查找特定元素的搜索算法。它通过不断将查找区间减半,快速定位目标值。在数值分析领域,二分法也被用于求解方程,特别是连续函数的零点。在本案例中,我们将探讨如何用...

    温度转换二分法_二分法_温度二分法查表_40_

    标题中的“温度转换二分法”是指在处理温度测量时,采用二分法来查找温度对应的电压或电阻值。二分法,又称折半查找法,是一种高效的算法,常用于有序数据集合中寻找特定元素。在温度测量领域,如果我们有一个预设的...

    二分法和牛顿迭代法求解方程

    二分法和牛顿迭代法是两种常用的数值计算方法,常用于求解方程。这两种方法各有特点,适用场景不同,且在效率上有所差异。 首先,二分法(也称为折半查找法)是一种基于区间分割的算法,主要用于解决连续函数在已知...

    非线性方程求根——二分法python

    对于区间[a,b]上连续不断且f(a)·f(b)的函数y=f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值的方法叫二分法。 算法:当数据量很大适宜采用该...

    二分法排序和查找(C#)

    二分法,也称为折半查找,是一种在有序数组中高效地查找特定元素的搜索算法。它的基本思想是每次比较中间元素与目标值,根据比较结果缩小搜索范围,直到找到目标值或者确定不存在为止。这种方法在C#编程中非常常见,...

    C/C++语言的二分法求方程的根

    二分法,也称为折半搜索法,是一种在数值计算中广泛应用的算法,尤其在寻找方程的实数根时非常有效。它基于连续函数在有限区间内的中间值定理,即如果一个连续函数在一个闭区间上既有正又有负的值,那么至少存在一个...

    二分法文献和程序

    二分法,也称为折半搜索或二分搜索,是一种在有序数组中查找特定元素的搜索算法。这个方法的核心思想是通过不断将搜索区间减半,来快速定位目标值的位置。二分法在信息技术、数据处理和算法设计等领域有着广泛的应用...

    二分法求解非线性方程的解

    二分法求解非线性方程的解是一种在数值分析中常用的方法,尤其适用于求解定义良好的非线性方程在某个区间内的根。这种方法依赖于函数的连续性和介值定理,通过逐步缩小包含根的区间,最终找到满足精度要求的近似解。...

    二分法_二分法解方程_

    二分法,也称为折半搜索或二分搜索,是一种在有序数组中查找特定元素的搜索算法。这个方法的关键在于其高效性,每次查询都能将搜索区间减半,因此在大量数据中查找特定值时非常有效。二分法不仅用于查找,还可以应用...

    二分法解线性方程二分法解线性方程

    二分法,也称为折半搜索或区间搜索,是一种在有序序列中查找特定元素的搜索算法。它通过不断将搜索范围减半来逼近目标值,适用于解决特定类型的数学问题,如寻找连续函数的零点。在本场景中,我们将探讨如何运用...

    二分法计算方法及VB编程代码设计

    二分法计算方法及VB编程代码设计 二分法是一种常用的数值分析方法,用来求解非线性方程的根。其基本思想是将搜索区间不断地缩小,直到找到根所在的位置。二分法的优点是计算速度快、精度高,但需要搜索区间的初值离...

    VC++6.0 实现计算方法中的二分法

    二分法,又称折半搜索法,是一种在有序数组中查找特定元素的搜索算法。它以其高效的性能在计算方法中占据重要地位,特别是在解决数值计算问题时,如求解方程的根、优化问题和搜索特定值。在VC++6.0环境下实现二分法...

    三种二分法MATLAB程序

    二分法,也称为折半查找法或区间搜索法,是一种在有序数据集合中寻找特定元素的算法。在MATLAB中,二分法通常用于数值计算,如求解方程的根、查找数组中的特定值或者优化问题。下面将详细讨论三种不同的二分法MATLAB...

    VB 二分法求方程根

    在VB(Visual Basic)编程语言中,二分法是一种经典的数值方法,用于寻找单变量方程的实数根。这种方法适用于连续函数,并且在给定的区间内已知函数值改变符号。以下是对二分法及其在VB中实现的详细解释。 首先,...

    PT100用二分法查表计算温度

    标题和描述中的“PT100用二分法查表计算温度”涉及到的是在工业自动化领域中非常重要的一个传感器——PT100热电阻温度传感器的温度计算方法。PT100是一种常用的金属热电阻,其阻值随温度变化而变化,常用于测量-200...

    用二分法求方程近似解

    二分法,也称为折半查找法,是一种在有序数据集合中寻找特定元素或解问题的有效算法。在数学上,二分法常用于求解连续函数的根,即找到使得函数值等于零的点。本题是用C#编程语言实现二分法来求解方程的近似解。 ...

    二分法的使用

    二分法的使用 二分法是一种常用的数值计算方法,用于找到函数的零点或极值。在计算机科学中,二分法是解决直际问题的重要工具。下面我们将详细介绍二分法的使用和实践。 二分法的定义 二分法是一种数值计算方法,...

    二分法、牛顿迭代法方程求根.txt

    在计算机科学与数值分析领域,二分法与牛顿迭代法是解决多项式方程求根问题中的两种经典且高效的方法。以下将详细介绍这两种方法及其应用。 ### 二分法 二分法(Bisection Method)是一种基于区间划分的求根算法,...

Global site tag (gtag.js) - Google Analytics