【发布时间】:2013-07-16 02:47:47
【问题描述】:
例如,受限空间为100 x 100 x 100大,每个球的半径为5,我需要在这个空间内随机位置生成100个这样的球,不允许重叠。我想出了两种方法:
使用 srand 得到 100 个位置,然后检查删除相互重叠的球(检查两个球的中心距离是否小于半径的两倍),然后生成另一个 x 个球( x 是删除的球数)并不断重复该过程,直到 100 个球不重叠。
首先将空间划分为 100 个立方体,并使用
srand将每个球放置在其分配的立方体内,这样它们就不会重叠。
我觉得第一种方式在随机方面更合适,但太费时,第二种方式又快又容易,但我不确定随机的想法。而这个模型正试图模拟分子在空气中的位置。也许这两种方法都不好,如果有更好的方法,请告诉我。提前致谢!
编辑: @Will 为我提供了一个与我原来的第一种方法相似但更简洁的选项;每次添加新球时,检查它是否与任何现有球重叠,如果重叠,则重新生成。复杂度是1+2+3...+(n-1),大约是O(n^n)。我仍然想知道是否有更快的算法。
编辑2: 抱歉 1+2+..n 应该是 n^2
【问题讨论】:
-
第二个。什么,你需要这个答案吗?我宁愿在算法上花更少的时间,也不愿真正随机。第三种选择,丢球。然后将球放在尚未覆盖的区域。如果你能弄清楚这个算法,你可能应该有一个大师。正如我已经提到的,我有一个 derpsters。
-
感谢@Will 的回复,虽然我在理解
derp这个词时遇到了一些困难(我自己不是本地演讲者)。我现在在读本科,只是帮助我朋友的化学研究。当你说大师时,你是在暗示这是一个很深的问题吗?我认为您的第三个选项实际上很棒。每次我生成一个新球时,我都会检查它是否与现有球重叠,如果有,则重新生成。非常感谢! -
对于您的编辑,您建议 1+2+3... + n-1 的复杂度是 O(n^n) 但实际上是 O(n^2)。跨度>
-
@user1125600 谢谢,已更正!
-
@Arch1tect:“derp”是愚蠢的声音,我猜......无论如何,第三个建议的简单实现可能会导致一大群球而不是均匀分布。
标签: algorithm random complexity-theory big-o