Я создаю итерационный алгоритм (метод Монте-Карло). Алгоритм возвращает значение на каждой итерации, создавая поток значений.
Мне нужно проанализировать эти значения и остановить алгоритм, когда, скажем, 1000
возвращенных значений находятся в пределах некоторого эпсилона
.
Я решил реализовать вычисление max
и min
значений из последних 1000
значений, а затем вычислить error
по этой формуле (max-min)/min
и сравнить его с epsilon
: error. И если это условие достигнуто, остановите итерации и верните результат.
Первая идея была использовать список
и добавлять
в него новые значения, вычисляя max
и min
для последних 1000
значений после каждого добавления.
Затем я решил, что нет смысла хранить более 1000
последних значений. Поэтому я вспомнил о deque
. Это была очень хорошая идея, поскольку сложность добавления и удаления на обоих концах объекта deque
составляет O(1)
. Но это не решило проблему необходимости перебора всех последних 1000 значений на каждой итерации для вычисления min
и max
.
Затем я вспомнил, что есть модуль heapq
. Он хранит данные таким образом, чтобы эффективно возвращать наименьшее в каждый момент времени. Но мне нужны и самые маленькие, и самые большие. Кроме того, мне нужно сохранить порядок элементов, чтобы я мог сохранить 1000
последних возвращенных элементов алгоритма, и я не вижу, как я могу добиться этого с помощью heapq
.
Имея в голове все эти мысли, я решил спросить здесь:
Как я могу решить эту задачу наиболее эффективно?