Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 弹簧和挂钩_Algorithm_Language Agnostic_Puzzle - Fatal编程技术网

Algorithm 弹簧和挂钩

Algorithm 弹簧和挂钩,algorithm,language-agnostic,puzzle,Algorithm,Language Agnostic,Puzzle,好, 我正在处理一个我似乎无法解决的问题。帮点忙 问题:给定一条长度为M的木线,该木线有n个挂钩,这些挂钩的位置以数组形式给出(0

好,

我正在处理一个我似乎无法解决的问题。帮点忙

问题:给定一条长度为M的木线,该木线有n个挂钩,这些挂钩的位置以数组形式给出(0M。在阵列中的同一位置可以有多个挂钩

假设:给定数组始终有效

可以忽略垂直拉伸,只考虑弹簧在水平方向上的拉伸。这个问题在本质上可以看作是一维的

限制:O(nlogn)解决方案或更好的解决方案

示例:M=10,数组=[4,4],R=1(直径为2),最佳球位=[3,5]

到目前为止,我所尝试的:

  • 一次拿一个钩子/球,如果两个球互相碰撞,则创建Clustor。将它们对称地放置在挂钩的质心处。瓶颈O(n^2),因为球不断地互相碰撞
  • 将所有球放在吊钩的完整质心处。递归返回最多3个子问题。。 a) 向左拉伸的球,b)向右拉伸的球,c)中间的球。瓶颈:这三个子问题可能有重叠,而获得良好的重叠似乎很尴尬。

    • 这里是一种二进制搜索,可以找到每个球的正确位置

    • 按照每个球可以到达的最左边的连接顺序,启动每个球旁边的球
    • 计算球移动的空间量(从最右边的球到右边缘的距离),并使用其中的一半作为起始增量
    • 计算弹簧、相邻弹簧和边缘对每个球的净作用力
    • 按净力方向移动每个球,如果没有净力,则将球保持在原处
    • 如果增量低于您想要的精度,或者所有球上都没有净力,请停止。否则,将增量除以2并转至步骤3

    • 这似乎不够具体。钩子的位置是给定的,还是我们可以决定它们去哪里?关于弹簧的长度和力常数,以及球的质量呢?我认为可视化在这里会有很大帮助。为什么第一种方法是
      O(n²)
      ?如果对球进行排序(最好是对簇进行排序),则可以通过二进制搜索的变体(
      O(logn)
      )找到相交的球。你需要做这个
      n次。所以总的复杂度应该是
      O(n logn)
      @Nico每次2个球击中,它们就形成一个4个的集群。2簇4个,每簇8个。随着集群的不断扩大,越来越多的球开始被击中。在最坏的情况下,这可以得到O(n^2)。但是您只需要检查集群的边界。如果一个球位于这些边界内,你只需将它分类到集群中(
      logn
      )并重新计算位置(
      n
      ):-)即使我想到了类似的事情。问题是,假设挂钩集中在右边,但不是最右边。。那么一开始,力会相当大。。引起大量的运动。力的符号会改变。。整个过程会有点振荡。然后我需要多次迭代才能收敛到最优解。我不会吗?还是我还没有完全理解?@KshitijBanerjee是的,这个解决方案是一个迭代的方法,每次通过步骤3-5都会让你越来越接近正确的解决方案。还请注意,净力的大小不会影响移动球的距离,因为只有净力的方向才重要。例如,如果自由度为8个单位,则首先在净力方向上移动球4,然后在下一次传球中移动球2,然后移动球1,依此类推,直到达到所需的精度。