Я пытаюсь отсортировать и найти медиану строки целых чисел, которая содержит только от 3 до 4 различных целых чисел.
Количество чисел, с которыми я имею дело, составляет приблизительно от 20 до 25 миллионов, и я должен сортировать вектор и находить медиану каждый раз, когда в вектор добавляется новое целое число, и медиана добавляется в отдельный " Общая переменная, которая суммирует все медианы каждый раз, когда генерируется медиана.
1 Median: 1 Total: 1
1 , 2 Median: (1+2)/2 = 1 Total: 1 + 1 = 2
1 , 2 , 3 Median: 2 Total: 2 + 2 = 4
1 , 1 , 2 , 3 Median: (1+2)/2 = 1 Total: 4 + 1 = 5
1 , 1 , 1 , 2 , 3 Median: 1 Total: 5 + 1 = 6
Я пытаюсь найти способ дальнейшей оптимизации моего кода, потому что он просто недостаточно эффективен. (Нужно обрабатывать до 2 с или около того) Кто-нибудь знает, как еще больше ускорить мою логику кода?
В настоящее время я использую 2 кучи или очереди приоритетов в C ++. Один функционирует как максимальная куча, а другой - как минимальная куча.
Получил идею от Структура данных, чтобы найти медиану
You can use 2 heaps, that we will call Left and Right.
Left is a Max-Heap.
Right is a Min-Heap.
Insertion is done like this:
If the new element x is smaller than the root of Left then we insert x to
Left.
Else we insert x to Right.
If after insertion Left has count of elements that is greater than 1 from
the count of elements of Right, then we call Extract-Max on Left and insert
it to Right.
Else if after insertion Right has count of elements that is greater than the
count of elements of Left, then we call Extract-Min on Right and insert it
to Left.
The median is always the root of Left.
So insertion is done in O(lg n) time and getting the median is done in O(1)
time.
но это не достаточно быстро ...