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

    转自:https://blog.csdn.net/littlewhite520/article/details/70144763

    我们都知道 二分查找 适用于单调函数中逼近求解某点的值。
    如果遇到凸性或凹形函数时,可以用三分查找求那个凸点或凹点。
    下面的方法应该是三分查找的一个变形。

    这里写图片描述

    如图所示,已知左右端点L、R,要求找到白点的位置。
    思路:通过不断缩小 [L,R] 的范围,无限逼近白点。
    做法:先取 [L,R] 的中点 mid,再取 [mid,R] 的中点 mmid,通过比较 f(mid) 与 f(mmid) 的大小来缩小范围。
    当最后 L=R-1 时,再比较下这两个点的值,我们就找到了答案。
    1、当 f(mid) > f(mmid) 的时候,我们可以断定 mmid 一定在白点的右边。
    反证法:假设 mmid 在白点的左边,则 mid 也一定在白点的左边,又由 f(mid) > f(mmid) 可推出 mmid < mid,与已知矛盾,故假设不成立。
    所以,此时可以将 R = mmid 来缩小范围。
    2、当 f(mid) < f(mmid) 的时候,我们可以断定 mid 一定在白点的左边。
    反证法:假设 mid 在白点的右边,则 mmid 也一定在白点的右边,又由 f(mid) < f(mmid) 可推出 mid > mmid,与已知矛盾,故假设不成立。
    同理,此时可以将 L = mid 来缩小范围。

    这是先增再减的模型 凸型
    两种写法

    int SanFen(int l,int r) //找凸点  
    {  
        while(l < r-1)  
        {  
            int mid  = (l+r)/2;  
            int mmid = (mid+r)/2;  
            if( f(mid) > f(mmid) )  
                r = mmid;  
            else  
                l = mid;  
        }  
        return f(l) > f(r) ? l : r;  
    }  
    double three_devide(double low,double up)  
    {  
        double m1,m2;  
        while(up-low>=eps)  
        {  
            m1=low+(up-low)/3;  
            m2=up-(up-low)/3;  
            if(f(m1)<=f(m2))  
                low=m1;  
            else  
                up=m2;  
        }  
        return (m1+m2)/2;  
    }  

    后面是先减再增 下凸
    和上面反着来

    int SanFen(int l,int r) //找凸点  
    {  
        while(l < r-1)  
        {  
            int mid  = (l+r)/2;  
            int mmid = (mid+r)/2;  
            if( f(mid) > f(mmid) )  
                l = mid;  
            else  
                r = mmid;  
        }  
        return f(l) > f(r) ? l : r;  
    }  
    double three_devide(double low,double up)  
    {  
        double m1,m2;  
        while(up-low>=eps)  
        {  
            m1=low+(up-low)/3;  
            m2=up-(up-low)/3;  
            if(f(m1)<=f(m2))  
                up=m2;  
            else  
                low=m1;  
        }  
        return (m1+m2)/2;  
    }  
  • 相关阅读:
    算法 python实现(二) 冒泡排序
    算法 python实现(一) 基本常识
    python 零散记录(五) import的几种方式 序列解包 条件和循环 强调getattr内建函数
    IT桔子-抓取数据
    mac中导出CSV格式在excel中乱码
    phantomJS安装
    pyquery 安装
    mac终端的命令都失效的解决方法
    Python爬虫防封杀方法集合
    python爬虫 403 Forbidden 解决方法
  • 原文地址:https://www.cnblogs.com/linruier/p/9738084.html
Copyright © 2011-2022 走看看