Нахождение вершин-близнецов в графах


22

Пусть G=(V,E) - граф. Для вершины xV , определим N(x) , чтобы быть (открытая) окрестность x в G . То есть N(x)={yV|{x,y}E} . Определим две вершиныu,v вG какдвойники,еслиu иv имеют одинаковый набор соседей, то есть еслиN(u)=N(v) .

Учитывая граф G на n вершинах и m ребрах в качестве входных данных, как быстро мы можем найти пару близнецов в G , если такая пара существует?

Мы можем проверить, являются ли две данные вершины близнецами за O(n) времени, сравнивая их окрестности. Простой алгоритм состоит в том, чтобы найти близнецов, то есть для каждой пары вершин проверять, являются ли они близнецами. Это занимает O(n3) времени (а также находит все пары близнецов). Существует ли значительно более быстрый способ найти (если есть) пару близнецов в графе? Есть ли в литературе известная работа, посвященная этой проблеме?


Вы можете перебирать окрестности и добавлять их в хеш-таблицу. Связано: cstheory.stackexchange.com/q/3390/236
Раду ГРИГОР

1
Это упражнение 2.17 здесь books.google.co.uk/…
Radu GRIGore

Кто-то с правами редактирования должен исправить определение близнецов. (См. Комментарии к ответу TheMachineCharmer или определение в книге, которую я связал.)
Раду ГРИГОР

Ответы:


21

Близнецы в графе - это просто модули размера 2. Модульная декомпозиция графа может быть найдена за время . Модульное дерево декомпозиции неявно представляет все модули графа и состоит из трех типов внутренних узлов: рядов, параллельных и простых узлов, а листья состоят из отдельных узлов. Набор из по крайней мере двух вершин S V является модулем тогда и только тогда, когда он является некоторым узлом в дереве или объединением некоторого набора дочерних элементов ряда или параллельного узла.O(n+m)SV

Таким образом, чтобы найти пару узлов-близнецов, если они существуют, мы можем построить дерево модульного разложения за времени. Затем посмотрите на листья, если родитель любого листа является последовательным или параллельным узлом, то у этого узла должно быть как минимум два потомка, которые образуют двойную пару. Таким образом, общее время работы является линейным.O(n+m)

http://en.wikipedia.org/wiki/Modular_decomposition


Спасибо также за то, что познакомили меня с модульной декомпозицией!
gphilip

12

Проблема эквивалентна определению, есть ли две равные строки в матрице графа. Мы можем построить три на строках матрицы графа. Время завершения будет O (n ^ 2)


6
То же самое в списках смежности дает . O(m+n)
Раду GRIGore

Теперь я стреляю мухой;)
Сянь-Чи Чанг 之 之

2
Это можно обобщить несколько. Если мы перефразируем задачу как «Учитывая (где здесь f ( x ) : = N ( x ) ), находим различный x 1 , x 2 такой, что f ( x 1 ) = f ( x 2 ) », то для вполне упорядоченного Y одним из подходов является оценка f ( x ) для каждого x Xf:X>Yf(x):=N(x)x1x2f(x1)=f(x2)Yf(x)xXсортируйте их и проверяйте отсортированный список на наличие дубликатов. Trie эффективно сортировать по кругу.
Питер Тейлор

8

РЕДАКТИРОВАТЬ: решения @MikleB и @Travis намного умнее. Извините за излишний ответ.


Кажется, что эту проблему можно свести к задаче умножения матриц на матрице смежности графа, заменив умножение на EQU (то есть NXOR) и сложение на AND. Таким образом, если в графе есть пара близнецов, то результирующая матрица A A T не будет единичной матрицей, и индексы ( i , j ), где значение a i , j не равно нулю, являются в точности узлами пары пар. ,AAAT(i,j)ai,j

Насколько мне известно, проблема умножения матриц может быть решена за время с α 2.376 по алгоритму Копперсмита – Винограда . Если нужны практические решения, любые алгоритмы матричного умножения хорошо работают на практике.O(nα)α2.376


Круто, это работает! : D Думаю, будет достаточно оценить только верхнюю половину . что вы думаете? A2
Pratik Deoghare

1
@TheMachineCharmer: Спасибо :) Да, если график не ориентирован.
Сянь-Чи Чан 之 之

Да. В точку! :)
Pratik Deoghare

5

Из-за сумасшедшей системы на этом сайте я не могу комментировать напрямую, но у меня есть пара замечаний по поводу существующих ответов.

Я вполне уверен , что потребности решения Сянь-чжи Чанга , чтобы исправить до A A T .A2AAT

Наблюдение 4MachineCharmer задом наперед (контрпример: [0,0,1], [0,1,0], [0,1,1] имеет определитель 0, но без двойников). Если близнецы существуют, то детерминант равен нулю.


Я не вижу проблем с . Есть примеры? Кстати, система на этом сайте НЕ сумасшедшая! :)A2
Pratik Deoghare

будет работать для неориентированных графов (для которых== Т )но, вообще, для ориентированных графов. AND over XNOR должен сравнивать две строки A, а умножение матриц выполняется для строки из первой матрицы со столбцом из второй. A2AAT
Питер Тейлор

Система может быть не сумасшедшей, но, возможно, противоречащей интуитивно понятным новостным постерам. Вы можете отвечать, но не комментировать ... но ваши комментарии были достаточно хороши, ИМХО, чтобы оправдать размещение. Как только вы наберете больше репутации, я думаю, вы найдете систему довольно захватывающей.
hardmath

3
Возможность отвечать, но не комментировать - это безумие. Это заставляет новых пользователей выбирать между бесполезностью или ответом не в том месте.
Питер Тейлор

3

Эта тема довольно старая; однако никто, кажется, не использовал самый элегантный и простой подход. Лексикографически сортируйте список смежности по времени O (n + m), затем проверяйте наличие дубликатов (см. Aho, Hopcroft, Ullman, 74 '). Вы можете использовать модульную декомпозицию, но это полный перебор.


2

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

Этот алгоритм находит классы эквивалентности ложных близнецов. Алгоритм основан на эффективной процедуре, которая уточняет раздел. Дан набор Sи раздел P = {X1, ..., Xn}. refine(P, S) = {X1 ^ S, X1 - S, X2 ^ S, X2 - S, ..., Xn ^ S, Xn - S}, ^обозначает пересечение -множества и разность множества. Раздел стабилен, если его невозможно доработать. Эта процедура занимает время O (| S |) (см. Статью Википедии об уточнении раздела), поэтому она быстрая.

Algorithm:

P = {V} // initial partition consists of the vertex set
for every vertex v:
    P = refine(P, N(v)) // refine with the open neighborhood of v

Общее время O (| V | + | E |). Это также легко программировать.


1

Некоторые наблюдения, которые могут помочь

  1. Для a,бВ если a не близнец б тогда с а также d не может быть близнецов где сN(a) а также dN(b).

  2. |N(a)||N(b)| then a and b can't be twins.

  3. If bN(a) then a and b can't be twins. This works only if you are looking for non-adjacent twins.

  4. If twins exist then determinant of the adjacency matrix is zero.

Fancy idea:

  1. Build a complete binary tree with height = |V|.
  2. Then start reading one row of adjacency matrix.
  3. If you encounter 0 take left otherwise take right.
  4. When you reach a leaf store your vertex there.
  5. Do this for all the rows. So, in the end each leaf will have neighbors.

Stolen from Inspired by Huffman compression algorithm! :)


2
The 3rd point is true only if we look for non-adjacent twins. In the usual notion of twins, a and b are allowed to be adjacent.
Mathieu Chapelle

1
Peter Taylor, Mathieu Chapelle: Thanks! I have edited the answer to reflect the changes. @Serge Gaspers: I guess in that case the condition must be N(a)b=N(b)a.
Pratik Deoghare
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.