thedeemon: (office)
[personal profile] thedeemon
А вот задачка, может кто подскажет, как такие решаются.
Есть набор из 65000 множеств, в каждом множестве от 1 до 35000 элементов (элементы - 16-битные целые числа), причем распределение размеров весьма неравномерное: среднее число элементов около 50, медианное - 13, т.е. большая часть множеств имеет менее 20 элементов, но есть и содержащие десятки тысяч. Мне нужно уменьшить этот набор путем объединения "похожих" множеств так, чтобы минимизировать сумму размеров множеств, но с таким ограничением: объединение множеств A,В,С... в некое Х возможно лишь тогда, когда размер получающегося Х не более чем в К раз (скажем, К=4) больше, чем размер каждого из А,В,С... Т.е., например, нельзя объединять множество из 10 элементов с множеством из 100. Объединять непересекающиеся множества нет смысла, а чем сильнее множества пересекаются ("похожи"), тем выгоднее их объединить.

Самое оптимальное решение не требуется, можно предлагать эвристики. Наивные переборные решения многовато операций и/или памяти требуют. Желательно уложиться в 2 гига памяти и час процессорного времени.

Date: 2014-02-27 11:47 am (UTC)
From: [identity profile] nivanych.livejournal.com
Функция "похожести" множеств (или величина "невкусности" операции объединения) может быть сделана метрикой?
Если метрика, то можно сделать метрическое дерево.

Date: 2014-02-27 01:30 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Ну вот d(A,B) = |A ⊖ B| = |A ∪ B - A ∩ B| вроде бы метрика. Как будет выглядеть такое дерево, что оно даст и сколько стоит его построение?

Date: 2014-02-27 01:48 pm (UTC)
From: [identity profile] nivanych.livejournal.com
Видимо, ещё надо учитывать размер множеств — сильно разные размеры должны ещё дополнительно расстояния добавлять.
Метрическое дерево предназначено для поиска ближайшего соседа.
Даёшь элемент метрического пространства, оно быстро отыскивает ближайший или N ближайших по этой метрики.
Построение дерева — NlogN, поиск — logN.
Поиск K ближайших соседей — logN + K.
Есть B-подобная вариация (видел про это статью от того самого тов. Брина).
Ещё такое реализуется внутри постгреса (GiST).
http://en.wikipedia.org/wiki/Metric_tree
Позволит относительно несложно выбирать группки достаточно похожих множеств.
Взял элемент и выбрал по какому-то признаку похожие с ним. Хоть бы и тупо всё в таком-то радиусе. С остатком поступил как-то так же.
Можно и просто идти от корня дерева и компрессировать, добавляя диффы.

Date: 2014-02-27 12:50 pm (UTC)
wizzard: (Default)
From: [personal profile] wizzard
крайне любопытная задача, да

sample data будет?

Date: 2014-02-27 01:19 pm (UTC)
From: [identity profile] sorhed.livejournal.com
Можно сгенерировать в три секунды. Генерируешь число в power-law distribution, t = 1 / (random(0..1)^(1/α)) (альфу подобрать по вкусу), это будет размер множества. Заполняешь его случайными числами, можно тоже в power-law, чтобы было много похожих. Должно работать.

Date: 2014-02-27 01:21 pm (UTC)
wizzard: (Default)
From: [personal profile] wizzard
Резонно, хотя не уверен что именно оно

Date: 2014-02-27 02:37 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Вот прореженные в 8 раз данные:
http://stuff.thedeemon.com/lj/sample.json.gz

Date: 2014-02-27 02:03 pm (UTC)
wizzard: (Default)
From: [personal profile] wizzard
так, а если мы обьединяем A,B,C в D, а потом D и E в F - то размер F все равно не может быть более K*min(|A|,|B|,|C|,|E|)?

Date: 2014-02-27 02:40 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Да, именно так.

Date: 2014-02-27 03:16 pm (UTC)
From: [identity profile] os80.livejournal.com
А какой "физический смысл" задачи? Я не математик и не понимаю, как можно решать эту (нечётко поставленную) задачу, не понимая цели?

Date: 2014-02-27 04:54 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
В общих чертах: есть множество сменяющих друг друга состояний, в которых возможны разные множества событий. Когда в некотором состоянии какое-то событие происходит первый раз, это "дорого", а если оно в этом состоянии уже происходило раньше, это "дешевле", причем чем меньше множество возможных событий в этом состоянии, тем "дешевле". Хочется объединить некоторые состояния, тем самым уменьшив число случаев, когда событие происходит впервые.

Подробнее не могу вдаваться, это секретный проект для ВМФ Монголии. :)

Date: 2014-02-27 05:54 pm (UTC)
wizzard: (Default)
From: [personal profile] wizzard
Context mixing, поди

simhash ftr

Date: 2014-02-28 02:42 am (UTC)
From: [identity profile] ygrek (from livejournal.com)
По описанию попадает под область применения simhash

Date: 2014-02-28 08:56 pm (UTC)
From: [identity profile] sleepy-drago.livejournal.com
интересно, но когда мозг задолбан овертаймами нечеткие условия почему-то плохо воспринимаются. примеры, требования ... хоть что-нибудь =)
а то пузомерки из этого в нынешнем виде не выйдет, а алгоритм разрабатывать слишком неблагодарное дело

Date: 2014-03-01 12:19 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Пример 1:
На входе набор множеств 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, например.

Date: 2014-03-02 08:00 am (UTC)
From: [identity profile] sleepy-drago.livejournal.com
первые впечатления 0)поглотить все подмножества. Дальше локальный критерий который выбирает пару текущих на объединение. Ограничение (K) заданное на исходные выглядит весьма произвольно и таким образом может создавать локальные минимумы ... Надо бы тренироваться на кошках чтобы понять. Правда сейчас после пары месяцев овертаймов нам разрешили побыть дома и это явно не один день =)
В сторону в очередной раз скачал golang и его парсер json мне пожаловался на последнюю запятую. Рукалицо. К тому же они не могут разобрать неполный объект и когда весь датасет это один объект ... =)

Date: 2014-03-01 11:02 am (UTC)
From: [identity profile] swizard.livejournal.com
Если работа одноразовая, я бы, всё же, попробовал начать с брутфорса. 2014-ый год на дворе, 65k * 65k * 50 -- это всего порядка 200 млрд достаточно простых действий, современный компьютер за час вполне должен прожевать на четырёх ядрах. Опять же, есть видеокарта :)

Date: 2014-03-01 12:02 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
> 200 млрд достаточно простых действий

Это только на одну итерацию, коих может потребоваться множество. Что именно даст один проход по всем парам?

Но вообще, как мне на рсдн продемонстрировали, пара простых приемов этот перебор могут очень заметно ускорить, так что вероятно он будет задействован.

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 28th, 2026 03:08 pm
Powered by Dreamwidth Studios