Предположим, у меня есть квадрат boolean
grid
(2D-массив) размером N
. Некоторые из значений: true
, а некоторые - false
(отношение <true values>/<false values>
не указано). Я хочу случайным образом выбрать показатель (x, y)
так, чтобы grid[x][y]
был true
. Если бы я хотел время эффективное решение, я бы что-то вроде этого (Python):Случайный показатель булевой сетки
x, y = random.choice([(x, y) for x in range(N) for y in range(N) if grid[x][y]])
Но это O(N^2)
, что более чем достаточно для, скажем, реализация крестики-нолики игра, но я предполагаю, что это принесет гораздо больше памяти для больших N
.
Если бы я хотел то, что не потребляющих память, я бы:
x, y = 0, 0
t = N - 1
while True:
x = random.randint(0, t)
y = random.randint(0, t)
if grid[x][y]:
break
Но вопрос, если у меня есть сетка с размером порядка 10^4
и есть только один или два true
значения в это, может потребоваться навсегда, чтобы «догадаться», какой индекс является тем, который меня интересует. Как мне сделать оптимальный алгоритм?