А вот задачка, может кто подскажет, как такие решаются.
Есть набор из 65000 множеств, в каждом множестве от 1 до 35000 элементов (элементы - 16-битные целые числа), причем распределение размеров весьма неравномерное: среднее число элементов около 50, медианное - 13, т.е. большая часть множеств имеет менее 20 элементов, но есть и содержащие десятки тысяч. Мне нужно уменьшить этот набор путем объединения "похожих" множеств так, чтобы минимизировать сумму размеров множеств, но с таким ограничением: объединение множеств A,В,С... в некое Х возможно лишь тогда, когда размер получающегося Х не более чем в К раз (скажем, К=4) больше, чем размер каждого из А,В,С... Т.е., например, нельзя объединять множество из 10 элементов с множеством из 100. Объединять непересекающиеся множества нет смысла, а чем сильнее множества пересекаются ("похожи"), тем выгоднее их объединить.
Самое оптимальное решение не требуется, можно предлагать эвристики. Наивные переборные решения многовато операций и/или памяти требуют. Желательно уложиться в 2 гига памяти и час процессорного времени.
Есть набор из 65000 множеств, в каждом множестве от 1 до 35000 элементов (элементы - 16-битные целые числа), причем распределение размеров весьма неравномерное: среднее число элементов около 50, медианное - 13, т.е. большая часть множеств имеет менее 20 элементов, но есть и содержащие десятки тысяч. Мне нужно уменьшить этот набор путем объединения "похожих" множеств так, чтобы минимизировать сумму размеров множеств, но с таким ограничением: объединение множеств A,В,С... в некое Х возможно лишь тогда, когда размер получающегося Х не более чем в К раз (скажем, К=4) больше, чем размер каждого из А,В,С... Т.е., например, нельзя объединять множество из 10 элементов с множеством из 100. Объединять непересекающиеся множества нет смысла, а чем сильнее множества пересекаются ("похожи"), тем выгоднее их объединить.
Самое оптимальное решение не требуется, можно предлагать эвристики. Наивные переборные решения многовато операций и/или памяти требуют. Желательно уложиться в 2 гига памяти и час процессорного времени.
no subject
Date: 2014-02-27 11:47 am (UTC)Если метрика, то можно сделать метрическое дерево.
no subject
Date: 2014-02-27 01:30 pm (UTC)no subject
Date: 2014-02-27 01:48 pm (UTC)Метрическое дерево предназначено для поиска ближайшего соседа.
Даёшь элемент метрического пространства, оно быстро отыскивает ближайший или N ближайших по этой метрики.
Построение дерева — NlogN, поиск — logN.
Поиск K ближайших соседей — logN + K.
Есть B-подобная вариация (видел про это статью от того самого тов. Брина).
Ещё такое реализуется внутри постгреса (GiST).
http://en.wikipedia.org/wiki/Metric_tree
Позволит относительно несложно выбирать группки достаточно похожих множеств.
Взял элемент и выбрал по какому-то признаку похожие с ним. Хоть бы и тупо всё в таком-то радиусе. С остатком поступил как-то так же.
Можно и просто идти от корня дерева и компрессировать, добавляя диффы.
no subject
Date: 2014-02-27 12:50 pm (UTC)sample data будет?
no subject
Date: 2014-02-27 01:19 pm (UTC)no subject
Date: 2014-02-27 01:21 pm (UTC)no subject
Date: 2014-02-27 02:37 pm (UTC)http://stuff.thedeemon.com/lj/sample.json.gz
no subject
Date: 2014-02-27 02:03 pm (UTC)no subject
Date: 2014-02-27 02:40 pm (UTC)no subject
Date: 2014-02-27 03:16 pm (UTC)no subject
Date: 2014-02-27 04:54 pm (UTC)Подробнее не могу вдаваться, это секретный проект для ВМФ Монголии. :)
no subject
Date: 2014-02-27 05:54 pm (UTC)simhash ftr
Date: 2014-02-28 02:42 am (UTC)no subject
Date: 2014-02-28 08:56 pm (UTC)а то пузомерки из этого в нынешнем виде не выйдет, а алгоритм разрабатывать слишком неблагодарное дело
no subject
Date: 2014-03-01 12:19 pm (UTC)На входе набор множеств A=[1,2,3], B=[1,3,5], C=[4]. Параметр К=4.
На выходе набор А'=[1,2,3,5], C=[4] и указание, что A'=A+B.
Пример 2:
http://stuff.thedeemon.com/lj/sample.json.gz
Требование: сказать, какие множества объединить, чтобы в получившемся наборе множеств сумма их размеров получилась минимальной. С ограничением для К=3, например.
no subject
Date: 2014-03-02 08:00 am (UTC)В сторону в очередной раз скачал golang и его парсер json мне пожаловался на последнюю запятую. Рукалицо. К тому же они не могут разобрать неполный объект и когда весь датасет это один объект ... =)
no subject
Date: 2014-03-01 11:02 am (UTC)no subject
Date: 2014-03-01 12:02 pm (UTC)Это только на одну итерацию, коих может потребоваться множество. Что именно даст один проход по всем парам?
Но вообще, как мне на рсдн продемонстрировали, пара простых приемов этот перебор могут очень заметно ускорить, так что вероятно он будет задействован.