zoukankan      html  css  js  c++  java
  • 二分与三分

    二分与三分

    二分查找

    在一个单调序列中查找一个元素的算法。

    一般偷懒做法:lower_bound函数直接实现。

    具体实现:不断以从答案所在的区间中间划分出两个子区间,舍弃不存在答案的那一个子区间,在存在答案的那个区间继续二分。

    二分答案

    在所有问题的答案的集合中二分查找最优解的算法。

    具体而言,就是先找出答案的范围,确定答案的集合,判断答案的单调性,并在答案的范围中进行二分,判断依据为答案是否成立或可行。

    是否可以二分答案的条件:

    1. 答案具有单调性,即可二分性。
    2. 二分出的答案可以进行可行性检验。

    题目特征:经常出现“最大值最小”这种诡异的说法。

    推荐题目:

    P1281 书的复制

    P1462 通往奥格瑞玛的道路

    三分求单峰函数极值

    在一个单调单峰/单谷函数中求解最值的算法。

    是否可以进行三分的条件:

    1. 函数是单峰的
    2. 函数是严格单调的(即不存在一段平直的区间)

    对于存在最值得一段区间([l,r]),我们取出其中的两个点(lmid)(rmid),使得这个区间被分成三段,对于任意的(lmid)(rmid),会出现以下两种情况:

    1. (f(lmid)<f(rmid)),此时(lmid)(rmid)要不然都在最值右边,要不然在最值两边,由于函数是严格单调的,这样我们就可以确保([l,lmid])这一段区间是不存在最值的,舍弃它,在剩下的子区间中继续三分。
    2. (f(lmid)>f(rmid)),类比上面这种情况,我们舍弃([rmid,r])这段区间。

    当然,(lmid)(rmid)的值只要(lmid<rmid)(l<lmid,r>rmid)就可以任意取,比如说取三等分点,不过有一种更优的方法。

    (lmid)(rmid)分别是(l,r)的稍微偏离中点一点点的左边和右边的位置,这样不仅保证了函数被分为三段,又实现了每次三分近似于二分,又保证了这个三分的复杂度近似于(O(logn))

    具体实现看代码:

    while(l+eps<r){//eps为精度
    		double lmid=(l+r)/2-eps/10,rmid=(l+r)/2+eps/10;//为了不出意外,我把eps除以了10
    		if(calc(lmid)<calc(rmid)) l=lmid;
    		else if(calc(lmid)>=calc(lmid)) r=rmid; 
    }
    

    板子:

    P3382 【模板】三分法

  • 相关阅读:
    echarts配置折线图的点和线条的颜色
    Route的exact属性
    JS获取一个字符串中指定字符串第n次出现的位置
    谈谈react hooks的优缺点
    babel配置文件.babelrc详解
    react的Router的exact、path、component、strict属性
    FormData使用方法详解
    【转】将jmeter返回的Unicode转换成utf8
    不同场景设计非gui测试结果
    jmeter关联练习题(正则、jsonpath)--能做出来,关联就基本没问题了
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/11261533.html
Copyright © 2011-2022 走看看