Минимум и максимум последних 1000 значений изменяющегося списка

Я создаю итерационный алгоритм (метод Монте-Карло). Алгоритм возвращает значение на каждой итерации, создавая поток значений.

Мне нужно проанализировать эти значения и остановить алгоритм, когда, скажем, 1000 возвращенных значений находятся в пределах некоторого эпсилона.

Я решил реализовать вычисление max и min значений из последних 1000 значений, а затем вычислить error по этой формуле (max-min)/min и сравнить его с epsilon: error. И если это условие достигнуто, остановите итерации и верните результат.

  1. Первая идея была использовать список и добавлять в него новые значения, вычисляя max и min для последних 1000 значений после каждого добавления.

  2. Затем я решил, что нет смысла хранить более 1000 последних значений. Поэтому я вспомнил о deque. Это была очень хорошая идея, поскольку сложность добавления и удаления на обоих концах объекта deque составляет O(1). Но это не решило проблему необходимости перебора всех последних 1000 значений на каждой итерации для вычисления min и max.

  3. Затем я вспомнил, что есть модуль heapq. Он хранит данные таким образом, чтобы эффективно возвращать наименьшее в каждый момент времени. Но мне нужны и самые маленькие, и самые большие. Кроме того, мне нужно сохранить порядок элементов, чтобы я мог сохранить 1000 последних возвращенных элементов алгоритма, и я не вижу, как я могу добиться этого с помощью heapq.

Имея в голове все эти мысли, я решил спросить здесь:

Как я могу решить эту задачу наиболее эффективно?

6
задан ovgolovin 14 November 2011 в 17:25
поделиться