Разбиение N массивов на K групп с ограничениями

Я застрял в этой проблеме и не могу найти эффективное решение этой проблемы.

У меня есть массивы N (до 10 миллионов), скажем, максимум 100 элементов. Эти массивы содержат числа от 1 до 10000.

Теперь моя проблема состоит в том, чтобы разделить эти массивы на K групп, чтобы минимизировать дубликаты во всех массивах, т.е. для массива, содержащего 1, 4, 10, 100 и другого, содержащего 1, 100. Я хотел бы, чтобы они вошли в одну группу, потому что что сводит к минимуму двуличие. Два ограничения, которые имеет моя проблема, заключаются в следующем:

  1. я не хочу увеличивать размер уникальных элементов более чем на 110 для группы массивов. Итак, у меня есть массив размером 100, и есть еще один массив размером 100, который соответствует 60%, я бы предпочел создать новую группу, потому что это не увеличивает. уникальных элементов до 140, и это будет увеличиваться.

  2. Количество векторов в группах должно быть равномерно распределено.

Группировка этих массивов по размеру в порядке убывания. Затем поиск уникальных векторов с уникальным хешированием и применение жадного алгоритма максимального совпадения с ограничениями, но жадный алгоритм, похоже, не работает, потому что это будет полностью зависеть от разделов, которые я выбрал первым. Я не мог понять, как можно применить DP, потому что количество комбинаций с учетом общего количества векторов просто огромно. Я не уверен, какую методологию мне следует выбрать.

некоторые из неудачных случаев моего алгоритма: скажем, есть два вектора, которые взаимно исключают друг друга, но если я сформирую с ними группу, я мог бы сопоставить 100% с третьим вектором, который в противном случае совпадал бы только на 30% в группе и сделал эта группа будет заполнена после добавления к этой группе, это увеличит мою двуличность, потому что третий вектор должен был образовать группу с первыми двумя векторами.


person Nikhil Chauhan    schedule 18.07.2019    source источник
comment
Пара вопросов: как вы измеряете двуличность? Основано ли оно на количестве групп, в которых содержится число? Я не хочу увеличивать размер уникальных элементов более чем на 110 -› Увеличение с чего? От исходного размера массива? т.е. массив из N элементов может состоять только из групп, состоящих не более чем из N+110 уникальных элементов? Количество векторов в группах должно быть равномерно распределено. -› Что именно это означает? Вы хотите, чтобы в группах было как можно равное количество векторов?   -  person Nico Schertler    schedule 18.07.2019
comment
Повторяю вопросы в предыдущем комментарии. Пример был бы весьма полезен.   -  person Jim Mischel    schedule 18.07.2019
comment
@NicoSchertler Пожалуйста, найдите ответы. Как вы измеряете двойственность ----› Да, это количество групп, в которых присутствует определенное число (усреднение дает мне среднюю двойственность, которая является функцией стоимости, которую я хочу минимизировать) -- -- Что я имею в виду под Увеличить размер со 110 ----› (Абсолютное количество уникальных чисел в группах) считайте это минимизацией чтения диска, я не хочу читать слишком много зависимых файлов в одном процессе (максимум 110) ------- Равномерное распределение означает, как вы поняли, сделать так, чтобы группы имели как можно равное количество векторов б>   -  person Nikhil Chauhan    schedule 19.07.2019
comment
Для меня непонятно, что вы ищете, вы говорите: минимизирует дубликаты. Как? потому что вы все еще храните оба? Как вы можете видеть, у многих людей есть вопросы, поэтому я предлагаю вам попытаться улучшить свой вопрос с помощью более конкретных примеров. мне нравится проблема..   -  person Aldert    schedule 19.07.2019
comment
@Aldert Как я уже сказал, считаю, что это минимизация чтения с диска, я не хочу читать слишком много зависимых файлов в одном процессе, ** важно не хранение массивов, а уникальные элементы в них, единообразие массивов с точки зрения количества и максимального количества присутствующих уникальных элементов**   -  person Nikhil Chauhan    schedule 19.07.2019


Ответы (1)


Простой, но требовательный к вычислительным ресурсам и памяти алгоритм повторяется 10 миллионов раз для каждого массива, чтобы соответствовать максимальному количеству совпадений. Теперь сохраните числа совпадений в массиве и найдите совпадение таких массивов аналогичным образом, перебирая критерии, которые должны составлять не менее 60%.

person anand    schedule 19.07.2019
comment
это критерии, которые я выбрал для своего жадного алгоритма, но это не работает в случае, о котором я упоминал в исходном вопросе. Более того, мне нужно выполнить это вычисление не более чем за 2-3 минуты, поэтому алгоритм n^2 у меня не работает. - person Nikhil Chauhan; 19.07.2019