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

推荐订阅源

V
Visual Studio Blog
J
Java Code Geeks
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
Docker
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 聂微东
MyScale Blog
MyScale Blog
H
Help Net Security
Last Week in AI
Last Week in AI
T
The Blog of Author Tim Ferriss
M
MIT News - Artificial intelligence
大猫的无限游戏
大猫的无限游戏
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
P
Proofpoint News Feed
博客园 - 叶小钗
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
T
Tailwind CSS Blog
aimingoo的专栏
aimingoo的专栏

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,再见!