在这种单调的非线性趋势下,是否有可能实现比logn搜索性能更好的效果?

时间:2016-07-26 18:03:30

标签: algorithm search big-o

我的问题

(你可以跳过这个并转到下一节的实际问题。这只是那些真正想知道的人的背景信息"为什么你要问这个?")

想象一下物体在无摩擦的山坡上滑落。有加速度为0的平坦区域。路径的其余部分的加速度大于0到9.81 m / s ^ 2。如果您知道山丘的形状,您可以绘制最大加速度作为山坡位置的函数。让我们说你把同一个山丘放在另一个星球或月球上,以获得与位置轮廓不同的加速度。为什么?目标是选择正确的加速度,以便在10秒内到达山脚。您的职位变动是固定的。你的初始速度是0,你的最终速度是无关紧要的,只要你在10秒内下山。假设你永远不会失去与山丘表面的接触。

这意味着您可以插入加速度值(更改行星)并在下坡行驶10秒后获取位置。当我绘制这种关系时,我得到一个单调增加的图(x轴上的更高加速度导致y轴上更高的10秒位置变化值)。但是,我的山很复杂。我不能假设这种关系是立方或平方。但它是单调增加的。

以下是我的算法中的一些示例数据:

acc = [
 1.5000    2.0000    2.5000    3.0000    3.5000    4.0000    4.5000
 5.0000    5.5000    6.0000    6.5000    7.0000    7.5000    8.0000
 8.5000    9.0000    9.5000   10.0000   10.5000   11.0000   11.5000
12.0000   12.5000   13.0000   13.5000   14.0000   14.5000   15.0000
15.5000   16.0000   16.5000   17.0000   17.5000   18.0000   18.5000
]

pos = [
 5.9176    6.5810    6.9784    7.2429    7.4314    7.5725    7.6818
 7.7691    7.8402    7.8992    7.9489    7.9913    8.0279    8.0597
 8.0877    8.1123    8.1342    8.1538    8.1714    8.1872    8.2016
 8.2146    8.2265    8.2374    8.2472    8.2550    8.2617    8.2676
 8.2676    8.2676    8.2676    8.2676    8.2676    8.2676    8.2676
]

Position vs Acceleration Example

显然我使用的是Matlab,但这与语言无关。请注意我的数据来自我当前的算法,这与我上面描述的问题略有不同。

问题广义

给定具有非线性和非线性化趋势的单调递增或递减函数,是否存在类似于插值搜索(loglogn)的搜索算法,或至少优于二进制/ gold-section搜索(logn)会找到正确的输入来实现所需的输出吗?

我的直觉是,应该有比logn更好的东西,因为它是单调的和趋势的。我知道趋势不是一个非常好用的词,但我认为它传达了我想说的话。

备注:

  1. 可能有助于知道x的y计算在计算上非常昂贵
  2. 更新

    如果没有线性化,我无法在此特定趋势上实现更好的登录性能。虽然通过反转加速度值可以使数据线性化,但由于计算上昂贵/不可能计算函数的导数,@ Gassa建议的Newton-Raphson方法并不成功。

    不幸的是,这并不能回答这是否不可能的问题。对于f和f,可以找到用于单调趋势的loglogn搜索算法,其具有昂贵的计算时间。这个问题需要数学证明。也许现在是时候将这个问题带到数学堆栈交换站点了。

    虽然这里仍然需要回答一个更深层次的问题,但我相信@Penguino的回答让我想到了一种线性化数据的方法,以便我可以使用插值搜索。出于这个原因,他的回答被标记为正确。

1 个答案:

答案 0 :(得分:1)

因此,如果我理解,你有一个函数A(x),它在两个极限x0和x1之间单调增加,并且对于这些极限之间的所有x也大于零。并且您的对象在x0和x1之间经历加速度k.A(x),其中k是与局部重力相关的比例因子。并且您希望您的对象在速度v0 = 0,时间t0 = 0,位置x0处开始,并且通过适当选择缩放因子k在时间t1 = 10处结束位置x1。

如果是这种情况,那么我认为旅行时间与1 / sqrt(k)成正比。所以你需要做的就是准确计算一些任意k的一次的旅行时间,然后适当地进行缩放。例如,如果k = 1的旅行时间是T1,那么k =(T1)^ 2/100将获得10秒的旅行时间。

因此,所需的时间是对行程时间进行单一精确计算所需的O(?)(可能是一些分段数值积分可以做到这一点)。