三分查找小结

187 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

原文链接:blog.csdn.net/roufoo/arti…

二分查找所面向的搜索序列的要求是:具有单调性(不一定严格单调);没有单调性的序列不是使用二分查找。

与二分查找不同的是,三分法所面向的搜索序列的要求是: 序列为一个凸性函数。通俗来讲,就是该序列必须有一个最大值(或最小值),在最大值(最小值)的左侧序列,必须满足不严格单调递增(递减),右侧序列必须满足不严格单调递减(递增)。如下图,表示一个有最大值的凸性函数:

image.png

下面代码是求ax^2+bx+c的最大值。

/*************************************************************************
	> File Name: 11.ternarySearch.c
	> Author: 
	> Mail: 
	> Created Time: Sat 21 Nov 2020 01:22:07 PM CST
 ************************************************************************/
 
#include <stdio.h>
#include <math.h>
 
const double EPS = 1e-10;
#define a -1
#define b 6
#define c -7
 
double f(double x) {
    return a * x * x + b * x + c;
}
 
#define P(func) { \
    printf("%s = %lf\n", #func, func); \
}
 
typedef double (*FuncType)(double);
 
double ternarySearch(FuncType f, double left, double right) {
    double mid_left, mid_right;
    do {   
        mid_left = left + (right - left) / 3.0;
        mid_right = left + (right - left) * 2.0 / 3.0;
        if (f(mid_left) < mid_right) left = mid_left;
        else right = mid_right;
    } while (abs(mid_left - mid_right) < EPS); 
 
    return mid_left;
}
 
int main() {
    P(ternarySearch(f, 0, 6));
    return 0;
}