Является ли эта функция O (n) , где n - количество бомб?
Да, это очень много, и все же не: -)
Это так, потому что два внутренних цикла не имеют абсолютно никакого отношения к количеству столбцов или строк. Они просто перебирают previous/current/next
row/column
, фактически делая их постоянными.
Вы действительно затронули аспект анализа сложности, который пропускает большинство новичков:
Что такое n
?
Здесь есть много возможностей: бомбы, строки, столбцы, ячейки или какой-то их продукт.
Однако, использование бомб определенно не правильно, потому что само это ограничено количеством клеток. Если предположить, что нормальные правила Сапера не более одной бомбы на клетку, то ограничивающим фактором является количество ячеек, поэтому это то, что вы должны использовать для n
.
Отсюда и цикл обработки бомбы (с его телом постоянного времени, см. Выше) и инициализация поля:
field = [[0 for i in range(num_cols)] for j in range(num_rows)]
в конечном итоге ограничены количеством клеток.
И, поскольку две последовательные (не вложенные) O(n)
операции по-прежнему O(n)
, это сложность, которую вы имеете.
Один момент, который я хотел бы затронуть, связан с реальными последствиями. Анализ сложности очень хорош для определения того, что происходит, когда входные данные становятся большими. Это означает такие вещи, как сортировка, когда вам может потребоваться отсортировать двадцать предметов или сто миллиардов.
Это , а не , что так полезно в такой игре, как Сапер, где вы, скорее всего, ограничены разрешением примерно 3840x2160. Если учесть крошечные ячейки размером 20х20, то получится 192х108 или около 20000 ячеек. Это то, что ваши компьютеры собираются пройти не сразу, а, вероятно, даже раньше, чем сигналы вашей автономной нервной системы достигнут вашего века, чтобы начать процесс: -)