Algorithm 弹簧和挂钩
好, 我正在处理一个我似乎无法解决的问题。帮点忙 问题:给定一条长度为M的木线,该木线有n个挂钩,这些挂钩的位置以数组形式给出(0Algorithm 弹簧和挂钩,algorithm,language-agnostic,puzzle,Algorithm,Language Agnostic,Puzzle,好, 我正在处理一个我似乎无法解决的问题。帮点忙 问题:给定一条长度为M的木线,该木线有n个挂钩,这些挂钩的位置以数组形式给出(0
M。在阵列中的同一位置可以有多个挂钩
假设:给定数组始终有效 可以忽略垂直拉伸,只考虑弹簧在水平方向上的拉伸。这个问题在本质上可以看作是一维的 限制: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,依此类推,直到达到所需的精度。