惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Hugging Face - Blog
Hugging Face - Blog
V
Visual Studio Blog
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
The GitHub Blog
The GitHub Blog
Recent Announcements
Recent Announcements
博客园 - Franky
D
DataBreaches.Net
B
Blog
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
人人都是产品经理
人人都是产品经理
WordPress大学
WordPress大学
P
Proofpoint News Feed
J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Martin Fowler
Martin Fowler
月光博客
月光博客
宝玉的分享
宝玉的分享
Engineering at Meta
Engineering at Meta
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs
博客园 - 【当耐特】

faryou的博客

faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客-福建行小记 faryou的博客 faryou的博客 faryou的博客 faryou的博客 faryou的博客-夏令营小记 faryou的博客 faryou的博客 faryou的博客 faryou的博客-暑假阶段总结与展望 faryou的博客 faryou的博客 faryou的博客 faryou的博客 台风进行时 faryou的博客 limbo虚拟机初体验&安装Windows NT 4.0 faryou的博客 台风将来时 faryou的博客 faryou的博客 faryou的博客 faryou的博客 出租车上的对话 faryou的博客
【算法教程】【C/C++】三分算法——程序设计思路与代码实现
作者: faryou · 2024-06-30 · via faryou的博客

前言
前面我们已经学习了二分算法。其实,对于一些特定问题,我们还可以使用三分算法。

程序设计思路
三分,顾名思义,就是把数据分成三段,使用四个指针,其基本方向仍是缩小范围。我们可以重复检查左中指针与右中指针,判断答案在哪一侧,将左指针或右指针移动到中指针,再重新计算左右中指针,实现缩小范围。
三分算法主要适用于曲线形函数的求解,因为这类题目一般都是求其在峰上的值。

代码实现
直接看题目:
202408211724235830591510.png
题目要求很清楚:求函数值为峰值时,x的值,看代码——

#include <bits/stdc++.h>
using namespace std;

double n,l,ml,mr,r,iq[13];//l、ml、mr、r分别为左、左中、右中、右指针。iq数组存放系数

double f(double x){//即check,验证函数
    double ans=0;
    for(int i=0;i<=n;i++) ans+=iq[i]*pow(x,n-i);
    return ans;
}

void sett(){//重算左中、右中指针
    ml=l+(r-l)/3;
    mr=l+((r-l)/3)*2;
    return ;
}

int main(){//输入输出,不解释
    scanf("%lf%lf%lf",&n,&l,&r);
    for(int i=0;i<=n;i++) scanf("%lf",&iq[i]);
    while(fabs(l-r)>1e-5){
        sett();
        if(f(ml)>f(mr)) r=mr;
        else l=ml;
    }
    printf("%.5lf",ml);
    return 0;
}

由此可见,三分实质上就是二分加上了一个指针,从而使答案限制在峰顶,最后求出结果。

结语
相比于二分,三分的应用场景小了很多。不过对三分的学习,其实也可以当成对二分的复习。我是faryou,再见!