本文已参与「新人创作礼」活动,一起开启掘金创作之路。
原文链接:blog.csdn.net/roufoo/arti…
二分查找所面向的搜索序列的要求是:具有单调性(不一定严格单调);没有单调性的序列不是使用二分查找。
与二分查找不同的是,三分法所面向的搜索序列的要求是: 序列为一个凸性函数。通俗来讲,就是该序列必须有一个最大值(或最小值),在最大值(最小值)的左侧序列,必须满足不严格单调递增(递减),右侧序列必须满足不严格单调递减(递增)。如下图,表示一个有最大值的凸性函数:
下面代码是求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;
}