Я хотел бы выбрать верхние значения n из набора данных, но игнорировать элементы на основе того, что я уже выбрал, т. Е. С учетом набора точек (x, y) Я хотел бы выбрать первые 100 значений x (которые все различны), но не выбирать какие-либо точки, чтобы y равнялся y любой уже выбранной точки. Я хотел бы убедиться, что самые высокие значения х являются приоритетными.

Есть ли какой-нибудь алгоритм для этого или хотя бы похожие? У меня есть огромное количество данных, и я хотел бы сделать это максимально эффективно. Память не так важна.

0
japem 14 Авг 2019 в 00:00

2 ответа

Лучший ответ

Вы можете сделать это за O (n log k) , где n - это число значений в наборе данных, а k - это число верхних значения, которые вы хотели бы получить.

  1. Сохраните значения, которые вы хотите исключить, в хеш-таблице.
  2. Сделать пустую мин-кучу.
  3. Переберите все значения и для каждого значения:
    1. Если он есть в хеш-таблице, пропустите его.
    2. Если куча содержит менее k значений, добавьте ее в кучу.
    3. Если куча содержит> = k значений, если значение, которое вы просматриваете, больше наименьшего члена minheap, извлеките это значение и добавьте новое.
1
Richard 13 Авг 2019 в 22:35

Я поделюсь своими мыслями, и поскольку автор до сих пор не определил объем данных, которые должны быть обработаны, я предполагаю, что они слишком велики для обработки одной машиной, и я также предполагаю, что автор знаком с Hadoop. < бр / > Поэтому я бы предложил использовать MapReduce следующим образом:

  1. Картографы просто испускают пары (x, y)
  2. Объединители выбирают k пар с наибольшими значениями x (в данном случае k = 100), в то же время сохраняя уникальные y в хэш-наборе, чтобы избежать дубликатов, а затем испускают k найденных пар.
  3. В этом задании должен быть только один редуктор, так как он должен получить все пары от объединителей, чтобы завершить задание, выбрав k пар в последний раз. Реализация редуктора идентична комбинатору.

Количество объединителей должно быть выбрано с учетом ресурсов памяти, необходимых для выбора старших k пар из входящего набора данных, так как какой бы метод ни использовался (сортировка, куча или что-то еще), он будет выполняться в памяти, а также сохраняя этот хэш-набор с уникальный у

0
mangusta 13 Авг 2019 в 22:35