#algorithm #data-structures
#алгоритм #структуры данных
Вопрос:
Учитывая поток цифрового ввода, требуется среднее значение последнего последнего значения k, и при вычислении требуется удалить верхние 5% и нижние 5% из k чисел.
Можем ли мы сделать это за линейное время. Решением O (n log k) было бы использование очередей с приоритетом, но я не могу придумать более оптимального решения.
Комментарии:
1. Поскольку вы должны сохранить отсортированную версию всего входного потока, чтобы отслеживать верхние и нижние 5%, вы как бы застряли с решением O (n log n) (т. Е. Вставкой журнала (n) в отсортированную структуру ввода).).
2. вы хотите вычислить
n
средние числа за меньшееO(n log k)
время?3. @Yola Я думаю, вам нужно сохранить все
n
значения, поскольку вам нужно запомнить их, чтобы узнать новый рейтинг для каждого нового входного значения. например, вы всегда должны помнить самое первое значение, потому что оно может входить и выходить из верхних / нижних 5% в любой момент в будущем.4. @wcochran вам нужно запомнить 5% только для,
k
не дляn
, я думаю.5. @Yola Я думаю, вы правы … поскольку вся статистика относится к последним
k
числам, мы можем забыть о тех, которые были до этого. Итак, вы хотите удалить самое старое число и добавить самое новое число, чтобы сохранитьk
значения.
Ответ №1:
Вот O(n log(k))
подход. Я использовал deque для хранения последних k
значений в порядке ввода и упорядоченный набор для сохранения отсортированной версии последних k
значений:
deque<T> d;
set<T> s; // e.g., red-black tree
for each new value x {
d.push_back(x);
s.insert(x);
if (d.size() > k) {
old = d.front(); d.pop_front();
s.erase(old);
// s holds sorted k-values
// traverse to find mean
// traverse in order, pass over the first and last 0.05*k values
}
}