Знаходження вершин-близнюків у графіках


22

Нехай - графік. Для вершини , визначають , щоб бути (відкрита) околиця в . Тобто . Визначте дві вершини у для близнюків, якщо і мають однаковий набір сусідів, тобто якщо .x V N ( x ) x G N ( x ) = { y VG=(V,E)xVN(x)xGu , v G u v N ( u ) = N ( v )N(x)={yV|{x,y}E}u,vGuvN(u)=N(v)

Враховуючи графік на вершинах і ребрах як вхідний, наскільки швидко ми можемо знайти пару близнюків у , якщо така пара існує?н м ГGnmG

Ми можемо перевірити, чи є дві задані вершини близнюками за час, порівнявши їх сусідства. Простий алгоритм пошуку близнюків - це, таким чином, для кожної пари вершин перевірити, чи вони є близнюками. Це займає час (а також знаходить усі пари близнюків). Чи є значно швидший спосіб знайти (якщо існує) пара близнюків у графі? Чи відома робота в літературі, яка займається вирішенням цієї проблеми?O ( n 3 )O(n)O(n3)


Ви можете повторити квартали та додати їх до хештету. Пов’язано: cstheory.stackexchange.com/q/3390/236
Radu GRIGо

1
Це вправа 2.17 тут books.google.co.uk/…
Раду ГРИГо

Хтось із правом редагування повинен виправити визначення близнюків. (Дивіться коментарі до відповіді TheMachineCharmer, або визначення у книзі, яку я пов’язав.)
Раду ГРИГо,

Відповіді:


21

Близнюки в графі - це просто модулі розміром 2. Модульне розкладання графіка можна знайти в час. Модульне дерево декомпозиції неявно представляє всі модулі графіка і складається з трьох типів внутрішніх вузлів: послідовних, паралельних і простих вузлів, а листя складається з окремих вузлів. Набір щонайменше двох вершин - це модуль тоді і лише тоді, коли це якийсь вузол у дереві або об'єднання деякого набору дочірніх рядів або паралельний вузол.S VO(n+m)SV

Отже, щоб знайти пару близнюкових вузлів, якщо вони існують, ми можемо побудувати модульне дерево декомпозиції за час . Потім подивіться на листя, якщо батьківський лист будь-якого листа є послідовним або паралельним вузлом, то у цього вузла повинно бути принаймні двоє дітей, які утворюють парну парню. Отже загальний час роботи лінійний.O(n+m)

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


Дякую, також за те, що ви познайомили мене з модульним розкладом!
gphilip

12

Проблема рівнозначна визначенню, чи існує два рівних рядки в матриці графіка. Ми можемо побудувати трійку на рядах графічної матриці. Час, що закінчується, буде O (n ^ 2)


6
Та ж ідея у списках суміжності дає . O(m+n)
Раду ГРИГо

Тепер я щукаю муху;)
Сісен-Чі Чанг 張顯 之

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, сортуйте їх і перевірте відсортований список на наявність дублікатів. Трійка - це ефективно радіаційний сорт.
Пітер Тейлор

8

EDIT: рішення @MikleB та @Travis набагато розумніші. Вибачте за відповідь про зайву кількість.


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

Наскільки я розумію проблема множення матриці може бути вирішена в час з альфа 2,376 по алгоритму Медник-Виноград . Якщо потрібні практичні рішення, будь-які алгоритми множення матриць добре працюють на практиці, це добре.O(nα)α2.376


Дивовижно це працює! : DI думаю, що буде достатньо оцінити лише верхню половину . як ти гадаєш? A2
Pratik Deoghare

1
@TheMachineCharmer: Дякую :) Так, якщо графік непрямий.
Hsien-Chih Chang 張顯 之

Так. Саме так! :)
Pratik Deoghare

5

Через шалену систему на цьому сайті я не можу коментувати безпосередньо, але у мене є кілька спостережень щодо існуючих відповідей.

Я цілком впевнений , що потреби рішення Сянь-чжі Чанга , щоб виправити до A A T .A2AAT

Спостереження TheMachineCharmer 4 повернеться спереду (зустрічний приклад: [0,0,1], [0,1,0], [0,1,1] має визначник 0, але близнюків немає). Якщо близнюки існують, то визначальник дорівнює нулю.


Я не бачу проблем з . Будь-які приклади? btw, система на цьому сайті НЕ божевільна! :)A2
Pratik Deoghare

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

Система може бути не божевільною, але, можливо, контрунтною для плакатів першого разу. Ви можете відповісти, але не коментувати ... але ваші коментарі були досить приємні ІМХО, щоб виправдати публікацію. Після того, як ви створили більше репутації, я думаю, що ця система виявиться досить захоплюючою.
хардмат

3
Вміти відповісти, але не коментувати, це шалено. Це змушує нових користувачів вибирати між тим, чи не допомогти вам, чи відповісти в неправильному місці.
Пітер Тейлор

3

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


2

Цей потік старий, і на питання ОП відповіли, але я хотів би додати ще один алгоритм для пошуку всіх таких пар у лінійний час. Ніхто не згадував доопрацювання розділів !

Цей алгоритм знаходить класи еквівалентності помилкових близнюків. Алгоритм спирається на ефективну процедуру, яка уточнює розділ. Дано набір 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,bVabcdcN(a)dN(b)

  2. |N(a)||N(b)|ab

  3. bN(a)ab

  4. Якщо близнюки існують, то визначник матриці суміжності дорівнює нулю.

Фантазія:

  1. Побудуйте повне двійкове дерево висотою = | V |.
  2. Потім починайте читати один рядок матриці суміжності.
  3. Якщо у вас зустрічається 0, виберіть ліворуч, інакше візьміть праворуч.
  4. Коли ви дістанетесь до листового магазину, ваша вершина там.
  5. Зробіть це для всіх рядів. Отже, врешті-решт кожен листочок матиме сусідів.

Викрадений з алгоритму стиснення Хаффмана натхненний! :)


2
ab

1
N(a)b=N(b)a
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.