zoukankan      html  css  js  c++  java
  • 三分查找

    一 问题

    在一个平面上有N个点,每个点的坐标已经给出,现在要求在X轴上找一个点,使得这个点到所有点中最大的距离最小。

    二 分析

    不知道是否有基于策略选择的算法,也许是DP也许是Greedy。本文通过数值计算来解决此问题。

    问题抽象:

    设f(x) = max(node1_distance, node2_distance, ……nodeN_distance), a<=x<=b;

    求x*使min(f(x)) = f(x*),a<=x*<=b;

    如果存在x*使目标函数极小,那么对任意的a<=x1<x2<=b,当x2<=x*时,f(x1)>f(x2);当x1>=x*时,f(x1)<f(x2). 也就是f(x)是一个单峰函数。

    问题就转化为求单峰函数的极值。

    三 算法

    网上主要有两种搜索算法,虽然都称之为三分搜索(或称查找)。核心思想都是通过“去坏留好”的原则不断压缩解空间来求极值。

    流传算法1:

    void Solve(void)
    {
        double Left, Right;
        double mid, midmid;
        double mid_value, midmid_value;
        Left = MIN; Right = MAX;
        while (Left + EPS < Right)
        {
            mid = (Left + Right) / 2;
            midmid = (mid + Right) / 2;
            mid_area = Calc(mid);
            midmid_area = Calc(midmid);
            // 假设求解最小极值.
            if (mid_area >= midmid_area) Left = mid;
            else Right = midmid;
        }
    }
    流传算法2:

    double ternary_search(double l,double r){ //三分查找求最小值
    	while(l + EPS < r){
    		double left = (2*l + r)/3;
    		double right = (2*r + l)/3;
    		double tmp1 = cal(left);
    		double tmp2 = cal(right);
    		if(tmp1 > tmp2) l = left;
    		else     	r = right;
    	}
    	return l;
    }



  • 相关阅读:
    DownloadManager
    Android(蓝牙)
    Android下集成Paypal支付
    java 网络(socket)
    java 泛型的几点备忘
    设计模式(模板方法)
    STM32F4_引领入门
    如何查找STM32开发资料
    Keil(MDK-ARM)使用教程(三)_在线调试
    Keil(MDK-ARM)使用教程(二)_菜单
  • 原文地址:https://www.cnblogs.com/zswbky/p/6717941.html
Copyright © 2011-2022 走看看