Clojure中冲突检查的迭代是如何在时间n^2/2内完成的?

Clojure中冲突检查的迭代是如何在时间n^2/2内完成的?,clojure,collision,Clojure,Collision,我对检测碰撞不感兴趣。 我习惯于使用java在两个for循环中使用两个计数器,如下所示: 第一个循环解析所有对象并包含第二个循环。它的计数器是正在对照所有其他对象检查的当前对象的索引 第二个for循环解析所有未选中的对象。它的计数器是当前对照第一个循环查看的对象检查的未检查对象的索引 伪代码: for(i++) for(int j = i, j++) collides(objects[i], objects[j) 这在Clojure中是如何实现的 我非常习惯使用像map这样没有计数器

我对检测碰撞不感兴趣。

我习惯于使用java在两个for循环中使用两个计数器,如下所示:

第一个循环解析所有对象并包含第二个循环。它的计数器是正在对照所有其他对象检查的当前对象的索引

第二个for循环解析所有未选中的对象。它的计数器是当前对照第一个循环查看的对象检查的未检查对象的索引

伪代码:

for(i++)
  for(int j = i, j++)
   collides(objects[i], objects[j)
这在Clojure中是如何实现的

我非常习惯使用像
map
这样没有计数器的命令,我想知道这种方法是否真的需要计数器。如果有一种方法可以在没有计数器的情况下实现这一点,那就更好了


我还想明确指出,我不希望随着时间
n^2
而实现。相反,我希望使用time
n^2/2
方法,它只检查未检查的对象是否发生碰撞

您可以通过for执行相同的代码:

(for [i (range (count objs))
      j (range i (count objs))
      :when (collide? (nth objs i) (nth objs j))]
    ...do stuff...)

如果使用
循环
,它会运行得更快,但看起来可能不太好

您可以通过for执行相同的代码:

(for [i (range (count objs))
      j (range i (count objs))
      :when (collide? (nth objs i) (nth objs j))]
    ...do stuff...)

如果使用
循环
,它会运行得更快,但看起来可能不太好

要选择不使用计数器而发生碰撞的所有对:

(defn select-pairs [collide? objects]
  (for [tail (iterate rest objects) :while (seq tail)
        :let [x (first tail)], y tail :when (collide? x y)]
    [x y]))
比如说,

(select-pairs < (range 4))
;([0 1] [0 2] [0 3] [1 2] [1 3] [2 3])
(选择配对<(范围4))
;([0 1] [0 2] [0 3] [1 2] [1 3] [2 3])
  • 这将适用于任何序列,甚至是无休止的序列
  • collide?
    只是选择对的标准的名称

要选择不使用计数器而发生碰撞的所有对:

(defn select-pairs [collide? objects]
  (for [tail (iterate rest objects) :while (seq tail)
        :let [x (first tail)], y tail :when (collide? x y)]
    [x y]))
比如说,

(select-pairs < (range 4))
;([0 1] [0 2] [0 3] [1 2] [1 3] [2 3])
(选择配对<(范围4))
;([0 1] [0 2] [0 3] [1 2] [1 3] [2 3])
  • 这将适用于任何序列,甚至是无休止的序列
  • collide?
    只是选择对的标准的名称

注意,在大O表示法中,
/2
被丢弃,因此您只剩下
O(N^2)
对,我如何强调我关心这个细节?我可以把O去掉吗?我可以把它放在
n^2/2
上吗?这很难做到,因为你计算事情需要多长时间的方式一开始就有点不稳定。有时设置变量可能需要花费不同的时间。。检查条件。我认为你写它的方式是最好的。//,@JasonBasanese,只要所有对象都互相检查,那么它在对象上的迭代顺序是否重要?注意,在大O表示法中,
/2
被丢弃,所以你只剩下
O(N^2)
对,我怎么强调我关心这个细节?我可以把O去掉吗?我可以把它放在
n^2/2
上吗?这很难做到,因为你计算事情需要多长时间的方式一开始就有点不稳定。有时设置变量可能需要花费不同的时间。。检查条件。我认为你写它的方式是最好的。//,@JasonBasanese,迭代对象的顺序是否重要,只要所有对象都相互检查?//,它看起来确实不错。尽管如此,它看起来确实不错。在没有计数器的情况下做得很好。我一定要试试。不用柜台做得很好。我一定要试试这个。