三分法,伟大无比的二分法扩展,本节带部分数论问题。

news2024/11/26 2:48:39

一,引导简介
简单的来看三分法实际就是二分法的另一种扩展,可以完全的看成二分法,我们介绍几个特殊的点,才能使用这个解法来进行相关的算法求解:求解单调性改变的点,在本个区间中只有一个导数为 0 的点,使用下面的模板进行求解即可。

三分法是一种用于在有序数组或函数上进行搜索的算法,其主要思想是将搜索空间分成三个部分,而不是传统的二分法(将搜索空间分为两半)。这可以在某些情况下更快地找到目标值。

下面是三分法的基本工作原理和步骤:

  1. 确定搜索范围: 首先,你需要确定搜索的范围。这通常是一个有序数组或一个连续的函数区间。

  2. 将搜索范围分成三等分: 与二分法不同,三分法将搜索范围分成三个部分,而不是两个。你需要找到两个分隔点,将搜索范围划分为三个部分。这两个分隔点通常距离搜索范围的两端相等距离。

  3. 比较中点: 计算并比较中点1和中点2处的函数值或数组元素值。根据比较的结果,你可以确定目标值位于哪个部分:左侧、中间还是右侧。

  4. 更新搜索范围: 根据上一步的比较结果,你可以缩小搜索范围。如果目标值在左侧部分,将搜索范围更新为左半部分;如果在右侧,将搜索范围更新为右半部分;如果在中间,你已经找到了目标值。

  5. 重复步骤: 重复步骤2至4,直到找到目标值或搜索范围足够小。

三分法的主要优点是,在某些情况下,它可以比二分法更快地找到目标值,因为它在每一步将搜索范围缩小为三分之一,而不是一半。这对于某些特定的函数或问题非常有效,但并不适用于所有情况。

需要注意的是,三分法通常用于连续函数的优化问题,以寻找函数的最大值或最小值,而不仅仅是查找特定值。在算法竞赛中,你可能会遇到需要使用三分法的问题,尤其是涉及到优化的情况。

二,算法重现


/*
    1.算法 : 三分法
    2.算法思想 : 三分法使用二分法的主要框架,并且通过单导数为零的函数特性进行的修改
    3.算法实现 : 整个框架和二分法一致 , check() 函数函数的写法可以自行模拟 , 
    一般情况下 我们对比较小的函数进行操作 。
*/


#include <iostream>
#define eps 0.000001 
using namespace std ;

const int N = 20 ; 

double q[N] ; 

int n ;

double l , r ;

bool check()
{

}

int main ()
{
    cin >> n >> l >> r ;
    for(int i = n ; i >= 0 ; i -- )
        cin >> q[i] ; 
    while ( r - l >  eps )
    {
        double mid1 = (r - l ) * ( 1.0 / 3) + l ;
        double mid2 = (r - l )* (2.0 / 3) + l ;
      
        if(check())    r = mid2 ;
        else l = mid1 ; 
    }
    // 主要操作 。
    cout << l << endl ;
    return 0 ; 
}

三,在线解题

题目来源洛谷,仅作学习使用,侵权请联系删除

【模板】三分法

题目描述

如题,给出一个 N N N 次函数,保证在范围 [ l , r ] [l, r] [l,r] 内存在一点 x x x,使得 [ l , x ] [l, x] [l,x] 上单调增, [ x , r ] [x, r] [x,r] 上单调减。试求出 x x x 的值。

输入格式

第一行一次包含一个正整数 N N N 和两个实数 l , r l, r l,r,含义如题目描述所示。

第二行包含 N + 1 N + 1 N+1 个实数,从高到低依次表示该 N N N 次函数各项的系数。

输出格式

输出为一行,包含一个实数,即为 x x x 的值。若你的答案与标准答案的相对或绝对误差不超过 1 0 − 5 10^{-5} 105 则算正确。

样例 #1

样例输入 #1

3 -0.9981 0.5
1 -3 -3 1

样例输出 #1

-0.41421

提示

对于 100 % 100\% 100% 的数据, 6 ≤ N ≤ 13 6 \le N \le 13 6N13,函数系数均在 [ − 100 , 100 ] [-100,100] [100,100] 内且至多 15 15 15 位小数, ∣ l ∣ , ∣ r ∣ ≤ 10 |l|,|r|\leq 10 l,r10 且至多 15 15 15 位小数。 l ≤ r l\leq r lr

【样例解释】

如图所示,红色段即为该函数 f ( x ) = x 3 − 3 x 2 − 3 x + 1 f(x) = x^3 - 3 x^2 - 3x + 1 f(x)=x33x23x+1 在区间 [ − 0.9981 , 0.5 ] [-0.9981, 0.5] [0.9981,0.5] 上的图像。

x = − 0.41421 x = -0.41421 x=0.41421 时图像位于最高点,故此时函数在 [ l , x ] [l, x] [l,x] 上单调增, [ x , r ] [x, r] [x,r] 上单调减,故 x = − 0.41421 x = -0.41421 x=0.41421,输出 − 0.41421 -0.41421 0.41421

    #include <iostream>
    #define eps 0.000001 
    using namespace std ;

    const int N = 20 ; 

    double q[N] ; 

    int n ;

    double l , r ;

    double f(double x )
    {
        double sum = 0 ;
        for(int i = 0 ; i <= n ; i ++ )
        {
         
            double ans = q[i] ;
            for(int j = 0 ; j < i ; j ++ )
            {
                ans *= x ;
            }
            sum += ans ;
        }
        
        return sum ;
    }

    int main ()
    {
        cin >> n >> l >> r ;
        for(int i = n ; i >= 0 ; i -- )
            cin >> q[i] ; 
        while ( r - l >  eps )
        {
            double mid1 = (r - l ) * ( 1.0 / 3) + l ;
            double mid2 = (r - l )* (2.0 / 3) + l ;
          
            if(f(mid2) < f(mid1) )    r = mid2 ;
            else l = mid1 ; 

        }
        cout << l << endl ;
        return 0 ; 
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/980263.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于qt软件的网上聊天室软件

1.服务器: 1).功能: 用于创建一个客户端&#xff0c;通过文本编辑器来获得端口号&#xff0c;根据获得的端口号创建服务器&#xff0c;等待客户端连接 创建成功会提示服务器创建成功 在收到客户端发送的信息时&#xff0c;把这条信息发送给其他所有客户端&#xff0c;实现群…

力扣(LeetCode)算法_C++——有效的数独

请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 &#xff0c;验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; …

vue3集成jsoneditor

一、背景 之前在做录制回放平台的时候&#xff0c;需要前端展示子调用信息&#xff0c;子调用是一个请求列表数组结构&#xff0c;jsoneditor对数组的默认展示结构是[0].[1].[2]..的方式&#xff0c;为了达到如下的效果&#xff0c;必须用到 onNodeName的钩子函数&#xff0c;…

使用Minifilter过滤驱动保护文件

代码如下: 可以保护拓展名.com文件不被删除、重命名、读写、可执行。#include <ntifs.h> #include <ntstrsafe.h> #include <fltKernel.h> static UNICODE_STRING ProtectedExtention RTL_CONSTANT_STRING(L"com"); //卸载回调 PFLT_FILTER gFile…

如何写一个可以找到工作的简历不至于太烂

简历是自己的一个很重要的标签&#xff0c;是获得面试的敲门砖&#xff0c;简历是要时常更新的&#xff0c;否则会错过一些机会。简历也是给自己的正反馈。 方法 ● 模仿&#xff0c;例如Boss&#xff0c;拉钩下面都给你一个案例模板供你参考&#xff0c;但是我觉得其实参考性…

基础算法--二分查找

二分查找 算法原理 1. 简介 故事分享&#x1f3ec;&#xff1a; 有一天小明到图书馆借了 N 本书&#xff0c;出图书馆的时候&#xff0c;警报响了&#xff0c;于是保安把小明拦下&#xff0c;要检查一下哪本书没有登记出借。小明正准备把每一本书在报警器下过一下&#xff0…

C语言基本知识

基础 第一个函数 argc代表参数个数argument count。argv代表参数value&#xff0c;第一个为放的是文件名&#xff0c;后面是传入的参数。 编译过程 预处&#xff1a;gcc -E hello.c -o hello.i编译&#xff1a;gcc -S hello.c(.i) -o hello.s汇编&#xff1a;gcc -c hello.c…

2023年09月数据库流行度最新排名

点击查看最新数据库流行度最新排名&#xff08;每月更新&#xff09; 2023年09月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多&#xff0c;这个数据库就被认为越受欢迎。这是一个领先指标。原始数…

C语言“牵手”1688商品详情数据方法,1688商品详情API接口,1688API申请指南

1688是中国最大的自营式电商企业&#xff0c;在线销售计算机、手机及其它数码产品、家电、汽车配件、服装与鞋类、奢侈品、家居与家庭用品、化妆品与其它个人护理用品、食品与营养品、书籍与其它媒体产品、母婴用品与玩具、体育与健身器材以及虚拟商品等。 1688平台的商品详情…

route命令小结

Destination: 如果不满足该列的任何一个ip,则走默认的default Gataway: *是 不指定gateway.有的系统是0.0.0.0,与*意义相同 Genmask: 0.0.0.0是不指定掩码, 255.255.0.0掩码了16位,172.17 开头的ip,会走这个网关 255.255.255.0掩码了16位,192.168.0 开头的ip都会走这个网关 当是…

基于Alexnet深度学习网络的人员口罩识别算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 file_path1 test\mask\;% 图像文件夹路径 %获取测试图像文件夹下所有jpg格式的图像文件…

网工内推 | 国企专场,网络运维工程师,华为/思科认证优先

01 中百集团 招聘岗位&#xff1a;运维工程师 职责描述&#xff1a; 1、对集团内使用云计算架构&#xff08;Kubernetes&#xff09;的系统进行规划、运维及管理相关工作。 2、对集团数据中心系统的大数据基础架构&#xff08;Cloudera Distribution Hadoop&#xff09;的规划…

vue3项目修改浏览器的项目icon小图标

修改vue3项目的浏览器的图标 vue2修改图标

微信的标签怎样管理?怎样标签群发更高效?(建议收藏)

01 管理标签的意义 随着时间的递增&#xff0c;微信好友越来越多&#xff0c;很容易就超过了上千人&#xff0c;如果这时候&#xff0c;还没有具备管理标签的意识&#xff0c;那就必须得提上日程了。 管理标签有如下几点意义&#xff1a; 1、方便找到对方 2、分组备注&am…

HarmonyOS/OpenHarmony(Stage模型)应用开发单一手势(三)

五、旋转手势&#xff08;RotationGesture&#xff09; RotationGesture(value?:{fingers?:number; angle?:number}) 旋转手势用于触发旋转手势事件&#xff0c;触发旋转手势的最少手指数量为2指&#xff0c;最大为5指&#xff0c;最小改变度数为1度&#xff0c;拥有两个可…

分享一下在微信上有哪些微信活动可以做

微信营销活动是吸引更多用户和提高品牌知名度的有效策略。下面是一些微信营销活动的做法&#xff1a; 抽奖活动&#xff1a;通过设置奖品和参与条件&#xff0c;吸引用户参与抽奖活动。例如&#xff0c;可以设置关注公众号、转发活动页面等条件&#xff0c;吸引更多用户参与抽奖…

Redis 分布式锁

面试题&#xff1a; Redis除了拿来做缓存&#xff0c;你还见过基于Redis的什么用法&#xff1f; 1.数据共享&#xff0c;分布式Session 2.分布式锁 3.全局ID 4.计算器、点赞 5.位统计 6.购物车 7.轻量级消息队列&#xff1a;list、stream 8.抽奖 9.点赞、签到、打卡 10.差集交集…

手机技巧:推荐7款日常生活中实用的工具类app

目录 1、DeepL-翻译神器 2、我的倒计时 3、醒图APP-图片美化神器 4、DAMA 5、氢时光 今天给大家推荐7款日常生活中实用的工具类app&#xff01; 1、DeepL-翻译神器 Deepl手机版是一款强大简便的在线翻译工具&#xff0c;与全球最精确的语言词典系统连接&#xff0c;您可以…

二进制安全虚拟机Protostar靶场(3)溢出控制程序指针,基础知识讲解 Stack Three,Stack Four

前言 这是一个系列文章&#xff0c;之前已经介绍过一些二进制安全的基础知识&#xff0c;这里就不过多重复提及&#xff0c;不熟悉的同学可以去看看我之前写的文章 二进制安全虚拟机Protostar靶场 安装,基础知识讲解,破解STACK ZERO https://blog.csdn.net/qq_45894840/artic…

生信分析-在线小工具|永久收藏

生信分析软件在生物信息学研究中可以帮助研究人员处理、分析和解释生物学数据&#xff0c;从而揭示生物学系统的结构和功能。如数据处理和格式转换、序列比对和测序数据分析、基因组注释和功能预测、基因表达分析、变异检测和遗传分析、数据可视化等软件功能都可以提高研究效率…