zoukankan      html  css  js  c++  java
  • 【复习笔记】三分算法

    考试考到了三分,但是我忘了(qwq)

    似乎没啥好说的,三分用于求单峰函数(f(x))的最值。

    存个板子,分别是整数和浮点数的。

    如果忘了的话可以看一下 这个,写得还比较清楚。

    在实际实现过程中,为了避免卡精度/死循环之类的惨案发生,可以适当将(EPS)设得大一点(指整数边界的差值,浮点数要看题目要求喏),在用三分得到了一个比较精确的区间之后,再枚举,并更新答案。或者也可以设定一个循环次数。

    二分也是这样的(我记得之前的一些二分题就是这么干的,诶,记不太清楚了

    二分答案的话,如果很明确区间左闭右闭/左闭右开/左开右开,或者哪个边界是合法但不优,哪个边界是答案足够小/大但不合法,就心里比较有底(感觉二分答案思路清晰一点)


    ►Code View

    void dac_for_int()
    {
    	int l/*=...*/,r/*=...*/,lans,rans;
    	while(l+2<r)
    	{
    		int lmid=l+(r-l)/3,rmid=r-(r-l)/3;
    		lans=f(lmid),rans=f(rmid);//函数f(x)
    		//---min
    		if(lans>rans) l=lmid;
    		else r=rmid;
    		//---
    		//---max
    		if(lans<rans) l=lmid;
    		else r=rmid;
    		//---
    	}
    	int ans=INF;
        for(int i=l;i<=r;i++)
            ans=min(ans,f(i));//这个具体看答案求啥
    }
    #define EPS 1e-9
    void dac_for_double()
    {
    	double l/*=...*/,r/*=...*/,lans,rans;
    	while(l+EPS<r)
    	{
    		double lmid=l+(r-l)/3.0,rmid=r-(r-l)/3.0;
    		lans=f(lmid),rans=f(rmid);
    		//---min
    		if(lans>rans) l=lmid;
    		else r=rmid;
    		//---
    		//---max
    		if(lans<rans) l=lmid;
    		else r=rmid;
    		//---
    	}
    	printf("%.9f
    ",l);//这个看着办吧(看答案求啥)
    }
    
  • 相关阅读:
    【javascript 面试笔试】1、几道笔试题
    【菜鸟学习jquery源码】数据缓存与data()
    【javascript杂谈】你所不知道的replace函数
    001-编译hadoop-2.5.2总结
    静态工厂 + DbHelper
    用Socket来简单实现IIS服务器
    JS产生徐特尔图表
    JS中图片飞飞效果
    基础类型
    Linux-切换启动方式
  • 原文地址:https://www.cnblogs.com/lyttt/p/14081725.html
Copyright © 2011-2022 走看看