Algorithm 在这种单调非线性趋势上,是否有可能获得比logn更好的搜索性能? 我的问题
(你可以跳过这一部分,转到下一部分来回答实际问题。这只是那些真正想知道“你为什么问这个?”的人的背景信息。) 想象一个物体从没有摩擦的山上滑下来。在加速度为0的平坦区域。路径的其余部分的加速度大于0到9.81 m/s^2。如果你知道山的形状,你可以画出最大加速度作为下坡位置的函数。假设你把同一座山放在另一个行星或月球上,得到一个不同的加速度与位置曲线。为什么?目标是选择正确的加速度,使您在10秒内准确到达山脚。你的位置改变是固定的。你的初始速度是0,你的最终速度是无关的,只要你在10秒内下山。假设您永远不会与山丘表面失去接触 这意味着您可以插入加速度值(改变行星)并在下坡行驶10秒后获得位置。当我绘制这个关系图时,我得到了一个单调递增的图(x轴上的加速度越高,y轴上的位置变化值就越高)。然而,我的山很复杂。我不能假设这个关系是立方或平方的。但它是单调递增的 以下是一些示例数据,其中包含我的算法中的绘图:Algorithm 在这种单调非线性趋势上,是否有可能获得比logn更好的搜索性能? 我的问题,algorithm,search,big-o,Algorithm,Search,Big O,(你可以跳过这一部分,转到下一部分来回答实际问题。这只是那些真正想知道“你为什么问这个?”的人的背景信息。) 想象一个物体从没有摩擦的山上滑下来。在加速度为0的平坦区域。路径的其余部分的加速度大于0到9.81 m/s^2。如果你知道山的形状,你可以画出最大加速度作为下坡位置的函数。假设你把同一座山放在另一个行星或月球上,得到一个不同的加速度与位置曲线。为什么?目标是选择正确的加速度,使您在10秒内准确到达山脚。你的位置改变是固定的。你的初始速度是0,你的最终速度是无关的,只要你在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
]
显然,我使用的是Matlab,但这是独立于语言的。请注意,我的数据来自我当前的算法,这与我上面描述的问题略有不同
这个问题是广义的
给定具有非线性和可非线性化趋势的单调递增或递减函数,是否有类似于插值搜索(loglogn)的搜索算法,或至少优于二进制/黄金分割搜索(logn)的搜索算法,以找到正确的输入以获得所需的输出
我的直觉是,应该有比logn更好的东西可用,因为它是单调的和带有趋势的。我知道趋势语不是一个很好的词,但我认为它表达了我想说的
注意事项:
虽然这里还有一个更深层次的问题需要回答,但我相信@Penguino的回答让我找到了一种线性化数据的方法,这样我就可以使用插值搜索。由于这个原因,他的答案被标记为正确。如果我理解的话,你有一个函数a(x),它在两个极限x0和x1之间单调递增,并且在这些极限之间的所有x都大于零。物体在x0和x1之间经历加速度k.A(x),其中k是与局部重力相关的比例因子。你们希望你们的物体从速度v0=0开始,在时间t0=0,在位置x0结束,在时间t1=10,通过适当选择比例因子k,在位置x1结束 如果是这种情况,那么我相信旅行时间与1/sqrt(k)成正比。所以你需要做的就是精确地计算旅行时间,非常精确地计算任意k的旅行时间,然后适当地缩放。例如,如果k=1的行程时间为T1,则k=(T1)^2/100的行程时间为10秒
因此,所需的时间是对行程时间进行单一精确计算所需的O(?)(可能需要一些分段数值积分).也许值得研究一下我认为其背后的思想,它会像离散公式中的logn一样以速度收敛。为什么不将其表述为非线性优化问题,并用类似的方法解决呢?看起来,你想在一个离散的网格上搜索;但在我看来,使用连续优化会更加精确。根据网格的大小(同样:我假设您要检查有限数量的候选对象),这可能会快得多(通常是二次收敛)。(Gassa速度更快,但描述了一些类似的东西!)我记得牛顿·拉弗森(Newton Raphson)在一个数值方法课程中,现在你们提到了它!对于每个x,y的计算非常昂贵。我应该补充这一点。我不知道f。我想我可以通过从结果中减去根,将我的函数转换为在所需位置变化的根。我必须进一步研究这种可能性。我认为计算f'的复杂性将排除它,因为y的计算已经非常昂贵。@toshiomagic尽管如此,牛顿方法背后的直觉可能有助于在这里设计一种算法:而不是仅仅将y比较为“更高”或“更低”,而是使用实际的“不同于”值进行下一次猜测
x
。有关一些想法,请参见,即使这些想法假设y的计算很便宜。备注:根据您的设置,您可以使用自动微分来获得jacobi/hessian矩阵,然后使用适当的方法。如果你没有梯度,对分搜索应该是最好的。优化,当计算y时