码迷,mamicode.com
首页 > 其他好文 > 详细

三分法

时间:2017-08-06 21:58:39      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:ble   最大值   else   while   src   cpp   分享   class   nbsp   

 

区别于二分法 , 二分法只适用于单调函数 (在一个单调的序列中对某一个元素进行查找)

三分法  突破了这种限制 , 可以用于凸函数或凹函数 , 这是因为凸函数或凹函数必存在一个最值

 

技术分享

  三分 顾名思义 要将一个线段分成 3 份 , 可以以线段 1/3  与  2/3 的位置 作为 3 分的 基准 ,将此函数分为3段 , 再分别计算 lm  与  lr  所对应的值 , 将较小的一侧全部舍去 , 并且重新赋予 left 与 right ,  一直重复此过程下去 , 直到 right - left > 1e-7 。此时被分割的线段可以近似看成一个点 , 也就是此函数的极值 。

 

代码示例

  

double f( int x ) {
    return f(x) ;   // f(x) 则代表所要三分的函数
}


double sf ( int left , int right ) {  // 三分求最大值
    double lm , lr ;   // 定义两个三分的中间变量
    
    while ( right - left < 1e-7 ) {  // 当最三分的线段无线小时 , 此时近似为一个点 , 即函数的最值
        lm = l + ( right - left ) / 3.0 ;   // 选取线段的 1/3 点为一个基准点
        lr = r - ( right - left ) / 3.0 ;     // 选取线段的 2/3 点为另一个基准点
        
        if ( f(lm) > f(lr) ) right = lr ;    
        else left = lm ;      
    }
    
    return left ;    // 此时被三分的线段无线小 , 因此任意返回一个点就行
}

 

三分法

标签:ble   最大值   else   while   src   cpp   分享   class   nbsp   

原文地址:http://www.cnblogs.com/ccut-ry/p/7295776.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!