Вам действительно нужен точный медиан и квантили?
Много времени, вам лучше всего получать приблизительные значения и работать с ними, в частности, если вы используете это для, например, разделение данных.
В самом деле, вы можете использовать приближенные квантили для ускорения нахождения точных квантилей (на самом деле в O(n/p)
времени), здесь грубый набросок стратегии:
- Есть картографа для каждого partition вычислить требуемые квантили и вывести их в новый набор данных. Этот набор данных должен быть в несколько порядков меньших величин (если вы не запрашиваете слишком много квантилей!)
- В этом наборе данных вычислите квантили снова, похожее на «медиану медианов». Это ваши первоначальные оценки.
- Перегруппируйте данные в соответствии с этими квантилями (или даже дополнительные разделы, полученные таким образом). Цель состоит в том, что в конечном итоге истинный квантиль гарантированно находится в одной секции, и в каждом разделе должно быть не более одного из желаемых квантилей.
- В каждом из разделов выполните QuickSelect (в
O(n)
), чтобы найти истинный квантиль.
Каждый из этапов находится в линейном времени. Самым дорогостоящим шагом является часть 3, так как потребуется перераспределение всего набора данных, поэтому он генерирует сетевой трафик O(n)
. Возможно, вы можете оптимизировать процесс, выбрав «альтернативные» квантиля для первой итерации. Скажем, вы хотите найти глобальную медиану. Вы не можете легко найти его в линейном процессе, но вы можете, возможно, сузить его до 1/kth набора данных, когда он разбит на k разделов. Поэтому вместо того, чтобы каждый узел сообщал свою медиану, каждый узел дополнительно сообщает об объектах в (k-1)/(2k) и (k + 1)/(2k). Это должно позволить вам сузить диапазон значений, где истинный медианный должен подписать. Итак, на следующем шаге вы можете каждый узел отправлять те объекты, которые находятся в пределах требуемого диапазона, на один главный узел и выбирать медианную только в этом диапазоне.
Поиском точных квантилей могут быть очень дорогостоящими в таком подходе Amy быть лучше, чем наивный подход, хотя , Шаг 1 - 4 действительно помогает разделить набор на половину и решить ту же проблему в меньшем пространстве. Но в этом подходе для выполнения квантиля могут потребоваться логические итерации с шага 1 до шага 4. – Sourabh