想象一下,在[0.0,n]范围内有一个连续的函数。是否有任何算法可以比简单迭代更快地找到最小步长s
的函数的最大值?简单的迭代很容易编程,但是当n / s
很大时,时间复杂度会增加。
double maxValue = 0;
double maxValueX = 0;
double s = 0.1 * n;
for (double x = 0.0; x <= n; x += s)
{
double value = someFunction(x);
if(value > maxValue) {
maxValue = value;
maxValueX = x;
}
}
我尝试过这种方法更快,但不知道它是否会卡在本地最大值上。
double min = 0;
double max = n;
int steps = 10;
increment = (max - min) / steps;
while (increment > s)
{
double maxValue = 0;
double maxValueX = X;
for (double x= min; x <= max; x+= increment)
{
double value = someFunction(x);
if(value > maxValue) {
maxValue = value;
maxValueX = x;
}
}
min = Math.Max(maxValueX - increment, 0.0);
max = Math.Min(maxValueX + increment, n);
increment = (max - min) / steps;
}
答案 0 :(得分:5)
假设存在这样一种算法,即一种能够在不查看近似的每个点的情况下找到连续函数近似值的最大值的算法。
现在选择一个正整数n并选择你想要命名的n个双精度的任何有限序列。存在无限多个连续函数,使得f(n)等于序列中的第n个double,并且小于或等于它们中的最大值。选择其中一个。
现在使用你的算法找到n个双打中最大的一个。通过假设,它检查了少于n的双打。我们假设它检查了除kth double之外的所有内容。
现在假设我们创建一个与第一个序列相同的新序列,除了第k个double是最大值。该算法是否神奇,当给出输入它不读时,它会改变其输出?
现在很清楚为什么没有这样的算法?如果你想在抽屉里找到最长的一根绳子,你将不得不看一下它们。
该功能的连续性根本无法帮助您。所有连续性都可以保证在函数上给出一个点,您可以在函数上找到另一个与您想要的第一个点相近的点。这没有告诉你函数所采用的最大值。 (好吧,好吧,它会告诉你某些东西。在一个封闭的有界区间,它意味着存在一个最大值,但这并不能帮助你找到它。)
答案 1 :(得分:2)
鉴于你所讨论的函数是代码,那么不,该函数可以在任何点返回任意最大值。
如果您可以对功能做出假设(如最大变化率),那么您可以进行优化。