Пусть - граф. Для вершины , определим , чтобы быть (открытая) окрестность в . То есть . Определим две вершины в какдвойники,если и имеют одинаковый набор соседей, то есть если .
Учитывая граф на вершинах и ребрах в качестве входных данных, как быстро мы можем найти пару близнецов в , если такая пара существует?
Мы можем проверить, являются ли две данные вершины близнецами за времени, сравнивая их окрестности. Простой алгоритм состоит в том, чтобы найти близнецов, то есть для каждой пары вершин проверять, являются ли они близнецами. Это занимает времени (а также находит все пары близнецов). Существует ли значительно более быстрый способ найти (если есть) пару близнецов в графе? Есть ли в литературе известная работа, посвященная этой проблеме?
Ответы:
Близнецы в графе - это просто модули размера 2. Модульная декомпозиция графа может быть найдена за время . Модульное дерево декомпозиции неявно представляет все модули графа и состоит из трех типов внутренних узлов: рядов, параллельных и простых узлов, а листья состоят из отдельных узлов. Набор из по крайней мере двух вершин S ⊂ V является модулем тогда и только тогда, когда он является некоторым узлом в дереве или объединением некоторого набора дочерних элементов ряда или параллельного узла.O(n+m) S⊂V
Таким образом, чтобы найти пару узлов-близнецов, если они существуют, мы можем построить дерево модульного разложения за времени. Затем посмотрите на листья, если родитель любого листа является последовательным или параллельным узлом, то у этого узла должно быть как минимум два потомка, которые образуют двойную пару. Таким образом, общее время работы является линейным.O(n+m)
http://en.wikipedia.org/wiki/Modular_decomposition
источник
Проблема эквивалентна определению, есть ли две равные строки в матрице графа. Мы можем построить три на строках матрицы графа. Время завершения будет O (n ^ 2)
источник
РЕДАКТИРОВАТЬ: решения @MikleB и @Travis намного умнее. Извините за излишний ответ.
Кажется, что эту проблему можно свести к задаче умножения матриц на матрице смежности графа, заменив умножение на EQU (то есть NXOR) и сложение на AND. Таким образом, если в графе есть пара близнецов, то результирующая матрица A A T не будет единичной матрицей, и индексы ( i , j ), где значение a i , j не равно нулю, являются в точности узлами пары пар. ,A AAT (i,j) ai,j
Насколько мне известно, проблема умножения матриц может быть решена за время с α ≈ 2.376 по алгоритму Копперсмита – Винограда . Если нужны практические решения, любые алгоритмы матричного умножения хорошо работают на практике.O(nα) α≈2.376
источник
Из-за сумасшедшей системы на этом сайте я не могу комментировать напрямую, но у меня есть пара замечаний по поводу существующих ответов.
Я вполне уверен , что потребности решения Сянь-чжи Чанга , чтобы исправить до A A T .A2 AAT
Наблюдение 4MachineCharmer задом наперед (контрпример: [0,0,1], [0,1,0], [0,1,1] имеет определитель 0, но без двойников). Если близнецы существуют, то детерминант равен нулю.
источник
Эта тема довольно старая; однако никто, кажется, не использовал самый элегантный и простой подход. Лексикографически сортируйте список смежности по времени O (n + m), затем проверяйте наличие дубликатов (см. Aho, Hopcroft, Ullman, 74 '). Вы можете использовать модульную декомпозицию, но это полный перебор.
источник
Эта ветка старая, и на вопрос OP ответили, но я хотел бы добавить еще один алгоритм, чтобы найти все такие пары за линейное время. Никто не упомянул уточнение разделов !
Этот алгоритм находит классы эквивалентности ложных близнецов. Алгоритм основан на эффективной процедуре, которая уточняет раздел. Дан набор
S
и разделP = {X1, ..., Xn}
.refine(P, S) = {X1 ^ S, X1 - S, X2 ^ S, X2 - S, ..., Xn ^ S, Xn - S}
,^
обозначает пересечение-
множества и разность множества. Раздел стабилен, если его невозможно доработать. Эта процедура занимает время O (| S |) (см. Статью Википедии об уточнении раздела), поэтому она быстрая.Общее время O (| V | + | E |). Это также легко программировать.
источник
Некоторые наблюдения, которые могут помочь
Дляa , b ∈ V если a не близнец б тогда с а также d не может быть близнецов где c ∈ N( а ) а также d∈ N( б ) .
Ifb∈N(a) then a and b can't be twins. This works only if you are looking for non-adjacent twins.
If twins exist then determinant of the adjacency matrix is zero.
Fancy idea:
Stolen fromInspired by Huffman compression algorithm! :)источник