Ответ 1
Не полный ответ, и я не знаю, насколько он будет полезен вам. Но здесь идет:
Расстояние от помех поражает меня как красную селедку. В заявлении о проблеме говорится, что оно должно быть не менее 1, но может быть 1000. Достаточно сказать, что кодировка бит для каждого набора node уникальна.
В вашей постановке проблемы не указано, но ваше решение выше предполагает, что каждый node должен быть членом хотя бы 1 набора. то есть. бит-кодировка всех 0 не допускается для любого набора node.
Игнорирование подключенных узлов на мгновение, непересекающиеся узлы просты: просто последовательно их последовательно группируйте с неиспользуемой битовой кодировкой. Сохраните их для последнего.
В приведенном выше примере используются направленные ребра, но опять же это поражает меня как красную селедку. Если A не может находиться в том же наборе, что и D, потому что A = > D, D не может находиться в том же наборе, что и A, независимо от того, D = > A.
Вы упомянули, что вам нужны хотя бы log (N) множества. У вас также будет не более N наборов. Полностью связанный граф (с (N ^ 2-N)/2 неориентированными ребрами) потребует N множеств, каждый из которых содержит один node.
Фактически, если ваш граф содержит полностью связанный симплекс размерности M (M в 1..N-1) с M + 1 вершинами и (M ^ 2 + M)/2 неориентированными ребрами, вам потребуется не менее M + 1.
В приведенном выше примере у вас есть один такой симплекс (M = 1) с 2 вершинами {A, D} и 1 (неориентированный) ребро {(A, D)}.
Казалось бы, ваша проблема сводится к поиску самых больших полностью связанных симплексов в вашем графике. Иными словами, у вас есть проблема маршрутизации: сколько измерений необходимо для маршрутизации ваших кромок, чтобы никто не пересек? Это не похоже на очень масштабируемую проблему.
Первый большой симплекс найден легко. Каждая вершина node получает новый набор со своим собственным битом.
Непересекающиеся узлы легки. Как только подключенные узлы будут обработаны, просто пронумеруйте непересекающиеся узлы, последовательно пропуская любые ранее использованные битовые шаблоны. Из приведенного выше примера, поскольку A и D принимают 01 и 10, следующая доступная битовая диаграмма для B равна 11.
Теперь сложная часть заключается в том, как максимально сбрасывать любые оставшиеся симплексы в существующий диапазон перед созданием новых наборов с новыми битами. При сгибании для каждого node необходимо использовать 2 или более бита (множества), а биты (наборы) не должны пересекаться с битами (наборами) для любого смежного node.
Рассмотрим, что происходит с вашим примером выше, когда вы добавляете еще один пример node, C:
Если C соединяется непосредственно с A и D, то исходной задачей становится нахождение 2-симплекса с 3 вершинами {A, C, D} и 3 ребра {(A, c), (A, D), ( CD)}. После того, как A, C и D принимают битовые шаблоны 001, 010 и 100, младший доступный битовый шаблон для непересекающегося B равен 011.
Если, с другой стороны, C соединяет непосредственно A или D, но не оба, график имеет два 1-симплекс. Предположим, что мы находим 1-симплекс с вершинами {A, D}, сначала задавая им битовые паттерны 01 и 10, тогда возникает проблема сложения C в этот диапазон. Единственный битовый шаблон с по меньшей мере 2 битами - 11, но он пересекается с тем, что связано с node C, поэтому нам нужно создать новый набор и поместить в него C. На этом этапе решение аналогично решению выше.
Если C непересекается, либо B, либо C получит бит-шаблон 11, а оставшемуся будет нужен новый набор и получить бит-шаблон 100.
Предположим, что C соединяется с B, но не с A или D. Снова, граф имеет два 1-симплекса, но на этот раз не пересекается. Предположим, что {A, D} находится первым, как указано выше, давая A и D битовые шаблоны 10 и 01. Мы можем сбрасывать B или C в существующий диапазон. Единственный доступный битовый шаблон в диапазоне составляет 11, и либо B, либо C могут получить этот шаблон, так как ни один из них не смежна с A или D. После того, как используется 11, никакие битовые шаблоны с двумя или более битами не останутся, и нам нужно будет создать новый набор для оставшегося node, дающий ему битовый шаблон 100.
Предположим, что C соединяется со всеми 3 A, B и D. В этом случае граф имеет 2-симплекс с 3 вершинами {A, C, D} и 1-симплекс с 2 вершинами {B, C}. Действуя так, как описано выше, после обработки самого большого симплекса, A, C и D будут иметь битовые шаблоны 001, 010, 100. Для складывания B в этот диапазон доступные битовые шаблоны с двумя или более установленными битами: 011, 101, 110 и 111. Все из них, кроме 101, пересекаются с C, поэтому B получит бит 101.
Затем возникает вопрос: Насколько эффективно вы можете найти самые большие полностью связанные симплексы?
Если найти самый большой полностью подключенный симплекс слишком дорого, можно было бы установить приблизительную верхнюю границу потенциальных полностью связанных симплексов, найдя максимальные минимумы в терминах связей:
-
Проведите по краям, обновляя вершины с подсчетом соединительные края.
-
Для каждого подключенного node, создайте массив из Cn-отсчетов, начиная с нуля где Cn - количество ребер подключен к node n.
-
Проведите по краям снова, для подключенных узлов n1 и n2, увеличивать счетчик в n1 соответствующие Cn2 и наоборот. Если Cn2 > Cn1, обновите последний счетчик в массиве n1 и наоборот.
-
Снова разверните подключенные узлы, вычисляя верхнюю границу самый большой симплекс каждый node мог быть частью. Вы можете построить массив с голубями со списком вершин для каждой верхней границы при прохождении через узлы.
-
Работайте через решетку с голубями от самых больших до самых маленьких складывающиеся узлы в уникальные множества.
Если ваши узлы находятся в наборе N и ваших ребрах в наборе E, сложность будет: O (| N | + | E | + O (этап 5))
Если вышеприведенное приближение будет достаточным, вопрос будет следующим: Как эффективно вы можете сворачивать узлы в существующие диапазоны с учетом требований?