Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在这种单调非线性趋势上,是否有可能获得比logn更好的搜索性能? 我的问题_Algorithm_Search_Big O - Fatal编程技术网

Algorithm 在这种单调非线性趋势上,是否有可能获得比logn更好的搜索性能? 我的问题

Algorithm 在这种单调非线性趋势上,是否有可能获得比logn更好的搜索性能? 我的问题,algorithm,search,big-o,Algorithm,Search,Big O,(你可以跳过这一部分,转到下一部分来回答实际问题。这只是那些真正想知道“你为什么问这个?”的人的背景信息。) 想象一个物体从没有摩擦的山上滑下来。在加速度为0的平坦区域。路径的其余部分的加速度大于0到9.81 m/s^2。如果你知道山的形状,你可以画出最大加速度作为下坡位置的函数。假设你把同一座山放在另一个行星或月球上,得到一个不同的加速度与位置曲线。为什么?目标是选择正确的加速度,使您在10秒内准确到达山脚。你的位置改变是固定的。你的初始速度是0,你的最终速度是无关的,只要你在10秒内下山。假

(你可以跳过这一部分,转到下一部分来回答实际问题。这只是那些真正想知道“你为什么问这个?”的人的背景信息。)

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

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

以下是一些示例数据,其中包含我的算法中的绘图:

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更好的东西可用,因为它是单调的和带有趋势的。我知道趋势语不是一个很好的词,但我认为它表达了我想说的

注意事项:

  • 了解从x开始的y计算在计算上非常昂贵可能会有所帮助
  • 更新

    没有线性化,我无法在这个特定趋势上获得优于logn的性能。虽然数据可通过反转加速度值进行线性化,但@Gassa建议的牛顿-拉斐逊式方法并不成功,因为该函数导数的计算非常昂贵/不可能计算

    不幸的是,这并不能回答这是否不可能的问题。对于单调趋势,可能会找到一种logn搜索算法,对f和f'的计算时间会很昂贵。这个问题需要数学证明。也许是时候把这个问题带到数学堆栈交换站点了


    虽然这里还有一个更深层次的问题需要回答,但我相信@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时