Учитывая, что целые числа читаются из потока данных. Найдите медиану элементов, прочитанную так, для эффективного способа. Для простоты предположим, что нет дубликатов. Например, рассмотрим поток 5, 15, 1, 3…
After reading 1st element of stream - 5 -> median - 5 After reading 2nd element of stream - 5, 15 -> median - 10 After reading 3rd element of stream - 5, 15, 1 -> median - 5 After reading 4th element of stream - 5, 15, 1, 3 -> median - 4, so on...
Чтобы было ясно, когда размер ввода нечетный, мы берем средний элемент отсортированных данных. Если входной размер четный, мы выбираем среднее из двух средних элементов в отсортированном потоке.
Обратите внимание, что результат — это эффективная медиана целых чисел, прочитанных из потока. Такой алгоритм называется онлайн-алгоритмом. Любой алгоритм, который может гарантировать вывод i -элементов после обработки i-го элемента, называется онлайн-алгоритмом . Давайте обсудим три решения вышеуказанной проблемы.
Метод 1: вставка сортировки
Если мы можем отсортировать данные так, как они появляются, мы можем легко найти медианный элемент. Insertion Sort — это один из таких онлайн-алгоритмов, который сортирует данные, появившиеся до сих пор. В любом случае сортировки, скажем, после сортировки i-го элемента, сортируются первые элементы i массива. Сортировка вставки не зависит от будущих данных, чтобы сортировать ввод данных до этой точки. Другими словами, сортировка вставкой учитывает данные, отсортированные до сих пор при вставке следующего элемента. Это ключевая часть сортировки вставок, которая делает его онлайн-алгоритмом.
Однако сортировка вставкой занимает O (n 2 ) время, чтобы отсортировать n элементов. Возможно, мы можем использовать бинарный поиск при вставке, чтобы найти местоположение следующего элемента за O (log n). Тем не менее, мы не можем сделать перемещение данных за O (log n). Независимо от того, насколько эффективна реализация, в случае сортировки вставкой требуется полиномиальное время.
Заинтересованный читатель может попробовать реализацию метода 1.
Метод 2: Дополненное самоуравновешенное дерево двоичного поиска (AVL, RB и т. Д.)
На каждом узле BST сохраняйте количество элементов в поддереве с корнем в этом узле. Мы можем использовать узел в качестве корня простого двоичного дерева, левый дочерний элемент которого самобалансирующийся BST с элементами, меньшими, чем root, а правый дочерний элемент самобалансирующего BST с элементами, большими, чем корень. Корневой элемент всегда содержит эффективную медиану .
Если левое и правое поддеревья содержат одинаковое количество элементов, корневой узел содержит среднее значение корневых данных левого и правого поддерева. В противном случае корень содержит те же данные, что и корень поддерева, в котором содержится больше элементов. После обработки входящего элемента левое и правое поддеревья (BST) отличаются максимально на 1.
Самостоятельная балансировка BST является дорогостоящей в управлении фактором балансировки BST. Однако они предоставляют отсортированные данные, которые нам не нужны. Нам нужна только медиана. Следующий метод использует кучи для отслеживания медианы.
Метод 3: Кучи
Подобно балансировке BST в методе 2 выше, мы можем использовать максимальную кучу с левой стороны, чтобы представить элементы, которые меньше эффективной медианы , и минимальную кучу с правой стороны, чтобы представить элементы, которые превышают эффективную медиану .
После обработки входящего элемента количество элементов в кучах максимально отличается на 1 элемент. Когда обе кучи содержат одинаковое количество элементов, мы выбираем среднее значение корневых данных кучи в качестве эффективной медианы . Когда кучи не сбалансированы, мы выбираем эффективную медиану из корня кучи, содержащей больше элементов.
Ниже приводится реализация вышеуказанного метода. Для алгоритма построения этих куч, пожалуйста, прочитайте выделенный код.
|
Сложность времени: если мы опускаем способ чтения потока, сложность медианного поиска равна O (N log N) , так как нам нужно прочитать поток, и из-за вставки / удаления кучи.
На первый взгляд приведенный выше код может показаться сложным. Если вы внимательно читаете код, это простой алгоритм.
Медиана потока бегущих целых чисел с использованием STL
— Венки . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Медиана потока бегущих целых чисел с использованием STL
- Медиана после K дополнительные целые числа
- Минимальное произведение k целых чисел в массиве положительных целых чисел
- Найдите два целых числа A и B, таких что A ^ N = A + N и B ^ N = B + N
- Максимальное GCD из N целых чисел с данным продуктом
- Как сложить два целых числа без использования арифметических операторов в C / C ++?
- Армстронг Числа между двумя целыми числами
- Проверьте, пропорциональны ли заданные целые числа a, b, c и d
- Количество решений для x <y, где a <= x <= b и c <= y <= d и x, y являются целыми числами
- Факториал массива целых чисел
- Сумма последней цифры всех целых чисел от 1 до N, делимая на M
- Сумма f (a [i], a [j]) по всем парам в массиве из n целых чисел
- Найти простое число P, используя заданные четыре целых числа
- Генерация N целых чисел, удовлетворяющих заданным условиям
- Найдите три целых числа, меньших или равных N, так чтобы их LCM был максимальным
0.00 (0%) 0 votes