三分法

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

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

  三分 顾名思义 要将一个线段分成 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 ;    // 此时被三分的线段无线小 , 因此任意返回一个点就行 }
时间: 2024-12-13 18:35:32

三分法的相关文章

Light Bulb--zoj3203(三分法)

Light Bulb Time Limit: 1 Second      Memory Limit: 32768 KB Compared to wildleopard's wealthiness, his brother mildleopard is rather poor. His house is narrow and he has only one light bulb in his house. Every night, he is wandering in his incommodio

ACM学习历程—HDU4717 The Moving Points(模拟退火 || 三分法)

Description There are N points in total. Every point moves in certain direction and certain speed. We want to know at what time that the largest distance between any two points would be minimum. And also, we require you to calculate that minimum dist

XTU OJ 1175 Hurry Up(三分法&amp;&amp;穷举法)

 Hurry Up Accepted : 88   Submit : 345 Time Limit : 1000 MS   Memory Limit : 65536 KB Problem Description GG is some what afraid of his MM. Once his MM asks, he will always try his best to rush to their home. Obvious, he can run home in straight li

HDU 4355 Party All the Time(三分法搜索)

HDU 4355 思路:三分法求f(x)极值. f(x)是指位置为x时的愤怒值之和,是一个三次函数,且存在极值点使f(x)最小. code: /* * @author Novicer * language : C++/C */ #include<iostream> #include<sstream> #include<fstream> #include<vector> #include<list> #include<deque> #i

【算法学习】三分法

我们都知道二分查找以及许多二分的应用. 但是二分主要是对于有单调性的函数或数列才能使用. 如果这个函数/数列没有单调性,而是有一种单峰/谷的特性. 我们可以使用三分法来确定这个函数的极值. 三分法的具体思想可在别处见到. 我就贴一个自己的模板,没有bug-- 因为我曾经被一个有bug的模板坑害了-- 速度非常快,常数应该很小.约是二分的两倍常数左右. 1 l=L,r=R;//确定l,r的初值,保证l<=r哦 2 while(l!=r){ 3 if(r-l<3){//[l,r]超过3就特判 4

P3382 【模板】三分法

题目描述 如题,给出一个N次函数,保证在范围[l,r]内存在一点x,使得[l,x]上单调增,[x,r]上单调减.试求出x的值. 输入输出格式 输入格式: 第一行一次包含一个正整数N和两个实数l.r,含义如题目描述所示. 第二行包含N+1个实数,从高到低依次表示该N次函数各项的系数. 输出格式: 输出为一行,包含一个实数,即为x的值.四舍五入保留5位小数. 输入输出样例 输入样例#1: 3 -0.9981 0.5 1 -3 -3 1 输出样例#1: -0.41421 说明 时空限制:50ms,12

HDU 4717 The Moving Points (三分法)

题意:给n个点的坐标的移动方向及速度,问在之后的时间的所有点的最大距离的最小值是多少. 思路:三分.两点距离是下凹函数,它们的max也是下凹函数.可以三分. #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include<cstdlib> #include<string> #include<cmath> #include&

HDU 5144 NPY and shot(三分法)

当时做这道题时一直想退出物理公式来,但是后来推到导数那一部分,由于数学不好,没有推出来那个关于Θ的最值,后来直接暴力了,很明显超时了,忘了三分法的应用,这道题又是典型的三分求最值,是个单峰曲线,下面是代码 1 #include <stdio.h> 2 #include <math.h> 3 #define PI 3.1415926 4 int v, h; 5 double f(double i)//推倒物理公式 6 { 7 return v*v*1.0*sin(2*i)/9.8+(

UVA 10385 - Duathlon(三分法)

UVA 10385 - Duathlon 题目链接 题意:一些运动员,参加铁人两项,跑步r千米,骑车k千米,现在知道每个人的跑步和骑车速度,问能否设置一个r和k,保持r + k = t,使得第n个人会取胜,如果可以求出时间和r,k 思路:三分法,把每个人列出一个带r的方程求时间,其他人减去最后一个人就是相差的时间,发现这些方程都是一元一次线性方程,而问题相当于求每个x轴上,值最小的那个,这些线画出来,会发现变成一个上凸函数,是单峰函数,可以用三分法求解 代码: #include <cstdio>