Как минимум, вам необходимо поддерживать очередь самых последних 1000 элементов.
Чтобы сохранить среднее значение, поддерживайте общее количество последних 1000 элементов; когда вы добавляете новый элемент в очередь, вы добавляете его значение в общую сумму, а также вычитаете значение самого старого элемента, который вы только что удалили из очереди. Верните общее количество, разделенное на 1000, и вы идете.
Чтобы сохранить работоспособность Nth процентили, поддерживайте две кучи и сохраняйте количество элементов в кучах; «нижняя» куча имеет более низкий N% значений, а «верхняя» куча имеет верхний (1-N)% (например, нижняя 95-ая процентильная куча будет иметь 950 элементов, а верхняя пятая процентильная куча будет имеют 50 элементов). В любой момент вы можете вернуть самый низкий элемент из верхней кучи, и это ваш процентиль. Когда вы удаляете элемент из очереди последних значений, удалите также значение из кучек. Если это оставляет кучи несбалансированными (например, нижняя куча имеет 951 элемент, а верхняя куча имеет 49 элементов), то сдвигайте элементы, чтобы сбалансировать их (например, удалите верхний элемент из нижней кучи и добавьте его в верхнюю кучу).
Поскольку вы хотите два процентиля, используйте три кучи - нижняя куча имеет нижние 950 элементов, средняя - 40, а верхняя - самая высокая 10. Верните самый нижний элемент средней кучи для 95-го процентиля , и самый нижний элемент верхней кучи для 99-го процентиля.
Добавление и удаление кучевых элементов - это O (lg (n)), так что это затраты на добавление нового элемента в очередь и три кучи: удаление самого старого элемента очереди из кучек (O (lg (n)), добавьте новый элемент очереди в соответствующую кучу (O (lg (n)) и, если нужно, сравните кучи (опять же, O (lg (n)). Добавьте новый элемент в самую низкую кучу, больше, чем элемент кучи, т.е.
if (newElement < lowestHeap.maxElement) {
lowestHeap.add(newElement)
} else if (newElement < middleHeap.maxElement) {
middleHeap.add(newElement)
} else {
highestHeap.add(newElement)
}
Убедитесь, что ваши отвалы позволяют дублирующие элементы
Я думаю, что вы можете держать массив из 1000 записей без особых проблем или штрафа за память. Проблема в том, что заказ данных (вам нужно будет заказать его, если хотите получить процентиль, я думаю) – Barranka
ya, сортировка - это та часть, которая вызовет наибольшие проблемы – jamesatha
Я не думаю, что есть способ вычислить любой из процентилей, если вы не храните данные в массиве, поэтому алгоритм (как мне кажется, должен быть): 1. Хранить данные; 2. Сортировка данных (с помощью вашего любимого метода); 3. Получите значение в нужном месте ('array [n]' где 'n = round (array.length * p)' и '0 <= p <= 1'). – Barranka