то, что является наиболее эффективным алгоритмом, в основном зависит от исходного состояния.
если большинство ячеек мертвы, вы можете сэкономить много процессорного времени, пропуская пустые части и не вычисляя содержимое ячейки за ячейкой.
По моему мнению, имеет смысл сначала проверить наличие полностью мертвых пространств, когда ваше начальное состояние напоминает «случайное, но с вероятностью жизни менее 5%».
Я бы просто разделил матрицу пополам и начал бы сначала проверять большие.
поэтому, если у вас есть поле 10 000 * 10 000, вы сначала накапливаете состояния верхней левой четверти 5000 * 5000.
и если сумма состояний равна нулю в первом квартале, вы можете полностью проигнорировать этот первый квартал прямо сейчас и проверить в правом верхнем углу 5000 * 5000 на будущее.
если его сумма состояний> 0, вы теперь разделите второй квартал на 4 части снова - и повторите эту проверку на срок службы для каждого из этих подпространств.
теперь вы можете перейти к субкадрам 8 * 8 или 10 * 10 (не уверен, что здесь имеет наибольший смысл).
всякий раз, когда вы находите жизнь, вы отмечаете эти подпространства как "имеющие жизнь".
только пробелы, которые "имеют жизнь", должны быть разделены на меньшие подпространства - пустые могут быть пропущены.
Когда вы закончите присваивать атрибут «имеет жизнь» всем возможным подпространствам, вы получите список подпространств, который вы теперь просто расширяете на +1 для каждого направления - с пустыми ячейками - и выполняете обычные (или измененные) ) игра правил жизни им.
Вы можете подумать, что разделить 10 000 * 10 000 точек на подпространства 8 * 8 - это много задач, но накапливать значения их состояний на самом деле гораздо, гораздо меньше вычислительной работы, чем выполнение алгоритма GoL для каждой ячейки плюс их 8 соседей плюс сравнение числа и сохранение нового состояния для сетевой итерации где-то ...
но, как я сказал выше, для случайного состояния инициации с 30% населения это не имеет большого смысла, так как не будет много полностью мертвых 8 * 8 подпространств для поиска (оставьте в покое мертвые 256 * 256 подпространств)
и, конечно, путь идеальной оптимизации будет длиться, но не в последнюю очередь, зависит от вашего языка.
-110