检索二进制矩阵中未占用点的最有效方法

时间:2014-12-08 12:10:37

标签: java algorithm random matrix

假设我们有一个二进制矩阵(0或1,无论如何),其中0表示未占用,1表示占用。矩阵随机填充这些值。

我知道所有被占用的点,但不知道那些不是那些......也就是说,我可以获得一系列被占用的点,但不是那些不被点的点。

从矩阵中获取随机非占据点的最有效方法是什么?

我试过在矩阵中得到一个随机点,如下所示:

x = random number from 0 to maxX
y = random number from 0 to maxY

while (x, y) is occupied:
    x = random number from 0 to maxX
    y = random number from 0 to maxY

return (x, y)

这是最好的运行时间,没有什么,最坏的情况是永远的。

我尝试过的另一件事是

point[] unoccupied

for each y in matrix
    for each x int matrix
        if (x, y) is unoccupied
            push (x, y) to unoccupied

shuffle unoccupied

return unoccupied[0]

这具有至少为O(x * y)的时间复杂度。大部分时间它比第一种方法慢,但它更稳定。

这项任务很简单,但有更有效的方法可以实现这一目标吗?


这不是任何类型的家庭作业或那种。我正在实施一个类似蛇的游戏,并试图将一个新的苹果/饼干放到一个空置的地方。

2 个答案:

答案 0 :(得分:2)

我建议您使用Quadtree。通过这种方式,您可以跟踪已占用的单元格,同时可以轻松找到未占用的区域。四叉树上的大多数操作都是矩阵大小的O(log n)。

答案 1 :(得分:0)

使用随机,如果被占用,则迭代地递增x和y,直到到达未占用的单元格。