Menemukan simpul kembar dalam grafik


22

Biarkan menjadi grafik. Untuk titik , mendefinisikan menjadi (terbuka) lingkungan dari di . Yaitu, . Tentukan dua simpul dalam menjadi kembar jika dan memiliki tetangga yang sama, yaitu, jika .x V N ( x ) x G N ( x ) = { y VG=(V,E)xVN(x)xGu , v GN(x)={yV|{x,y}E}u,vGv N ( u ) = N ( v )uvN(u)=N(v)

Diberikan grafik pada simpul dan tepi sebagai input, seberapa cepat kita dapat menemukan sepasang kembar di , jika pasangan seperti itu ada?n m GGnmG

Kita dapat memeriksa apakah dua simpul yang diberikan adalah kembar dalam waktu , dengan membandingkan lingkungan mereka. Algoritma yang mudah adalah untuk menemukan si kembar dengan demikian untuk memeriksa, untuk setiap pasangan simpul, apakah mereka kembar. Ini membutuhkan waktu (dan juga menemukan semua pasangan kembar). Apakah ada cara yang jauh lebih cepat untuk menemukan (jika ada) sepasang kembar dalam grafik? Adakah karya yang diketahui dalam literatur yang membahas masalah ini?O ( n 3 )O(n)O(n3)


Anda dapat beralih melalui lingkungan dan menambahkannya ke hashtable. Terkait: cstheory.stackexchange.com/q/3390/236
Radu GRIGore

1
Ini adalah latihan 2.17 di sini books.google.co.id/...
Radu GRIGore

Seseorang dengan kekuatan edit harus memperbaiki definisi si kembar. (Lihat komentar pada jawaban TheMachineCharmer, atau definisi dalam buku yang saya
tautkan

Jawaban:


21

Kembar dalam sebuah grafik hanyalah modul ukuran 2. Penguraian modular dari sebuah grafik dapat ditemukan dalam waktu . Pohon dekomposisi modular secara implisit mewakili semua modul grafik dan terdiri dari tiga jenis node internal: seri, paralel dan node utama, dan daun terdiri dari masing-masing node. Satu set setidaknya dua simpul adalah modul jika dan hanya jika itu adalah beberapa simpul di pohon atau penyatuan beberapa anak-anak dari rangkaian atau simpul paralel.S VO(n+m)SV

Jadi untuk menemukan sepasang node kembar, jika ada, kita dapat membangun pohon dekomposisi modular dalam waktu . Kemudian lihat dedaunan, jika induk dari sembarang daun adalah seri atau simpul paralel maka simpul tersebut harus memiliki setidaknya dua anak yang membentuk pasangan kembar. Jadi total waktu berjalan adalah linier.O(n+m)

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


Terima kasih, juga karena telah memperkenalkan saya pada Dekomposisi Modular!
gphilip

12

Masalahnya setara dengan menentukan apakah ada dua baris yang sama dalam matriks grafik. Kita dapat membuat trie pada baris-baris matriks grafik. Compleixty waktu akan menjadi O (n ^ 2)


6
Gagasan yang sama pada daftar adjacency memberikan . O(m+n)
Radu GRIGore

Sekarang saya nuking seekor lalat;)
Hsien-Chih Chang 張顯

2
Ini agak bisa digeneralisasi. Jika kita ulangi masalahnya sebagai "Diberikan (di sini di sini ) menemukan berbeda , sedemikian sehingga " maka untuk dipesan sepenuhnya satu pendekatan adalah mengevaluasi untuk setiap , mengurutkannya, dan memeriksa daftar yang diurutkan untuk duplikat. Trie ini secara efektif jenis radix. 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
Peter Taylor

8

EDIT: solusi oleh @MikleB dan @Travis jauh lebih pintar. Maaf atas jawaban berlebihan.


Tampaknya masalah dapat direduksi menjadi masalah perkalian matriks pada matriks adjacency dari grafik, dengan mengganti perkalian dengan EQU (yaitu, NXOR) dan penambahan dengan AND. Jadi jika ada sepasang kembar dalam grafik, maka matriks yang dihasilkan tidak akan menjadi matriks identitas, dan indeks mana nilai bukan nol persis kembar pasangan node.A A T ( i , j ) a i , jAAAT(i,j)ai,j

Sejauh pengetahuan saya, masalah multiplikasi matriks dapat diselesaikan dalam waktu dengan oleh algoritma Coppersmith-Winograd . Jika solusi praktis diperlukan, setiap algoritma multiplikasi matriks berfungsi dengan baik dalam praktiknya bagus.α 2.376O(nα)α2.376


Luar biasa ini bekerja! : Saya rasa cukup untuk mengevaluasi hanya bagian atas . apa yang kamu pikirkan? A2
Pratik Deoghare

1
@TheMachineCharmer: Terima kasih :) Ya, jika grafik tidak diarahkan.
Hsien-Chih Chang 張顯 之

Iya nih. Persis! :)
Pratik Deoghare

5

Karena sistem gila di situs ini saya tidak dapat berkomentar secara langsung, tetapi saya memiliki beberapa pengamatan pada jawaban yang ada.

Aku cukup yakin kebutuhan solusi Hsien-Chih Chang untuk benar ke . A A TA2AAT

Pengamatan TheMachineCharmer 4 adalah kembali ke depan (contoh konter: [0,0,1], [0,1,0], [0,1,1] memiliki determinan 0 tetapi tidak kembar. Jika kembar ada maka determinannya adalah nol.


Saya tidak melihat masalah dengan . Ada contoh? btw, sistem di situs ini BUKAN gila! :)A2
Pratik Deoghare

A A TA2 akan bekerja untuk grafik yang tidak diarahkan (yang == ) tetapi tidak, secara umum, untuk grafik yang diarahkan. AND lebih dari XNOR perlu membandingkan dua baris A, dan perkalian matriks beroperasi pada baris dari matriks pertama dengan kolom dari yang kedua. AAT
Peter Taylor

Sistem mungkin tidak gila, tapi mungkin berlawanan dengan poster pertama kali. Anda dapat menjawab tetapi tidak berkomentar ... tetapi komentar Anda IMHO cukup bagus untuk membenarkan posting. Setelah Anda membangun lebih banyak reputasi, saya pikir Anda akan menemukan sistem yang cukup membuat ketagihan.
hardmath

3
Mampu menjawab tetapi tidak berkomentar itu gila. Ini memaksa pengguna baru untuk memilih antara tidak membantu atau menjawab di tempat yang salah.
Peter Taylor

3

Utas ini cukup lama; namun, tampaknya tidak ada yang berhasil dalam pendekatan yang paling elegan dan sederhana. Secara Lexicographically mengurutkan adjacency-list dalam O (n + m) waktu kemudian memeriksa duplikat (lihat Aho, Hopcroft, Ullman, 74 '). Anda dapat menggunakan dekomposisi modular, tetapi ini adalah pembunuhan total yang berlebihan.


2

Utas ini sudah tua dan pertanyaan OP telah dijawab tetapi saya ingin menambahkan algoritma lain untuk menemukan semua pasangan seperti itu dalam waktu linier. Tidak ada yang menyebutkan Perbaikan Partisi !

Algoritma ini menemukan kelas kesetaraan dari kembar palsu. Algoritma ini bergantung pada prosedur yang efisien yang memperbaiki partisi. Diberikan satu set Sdan partisi P = {X1, ..., Xn}. refine(P, S) = {X1 ^ S, X1 - S, X2 ^ S, X2 - S, ..., Xn ^ S, Xn - S}. ^menunjukkan set persimpangan dan -set perbedaan. Partisi stabil jika tidak dapat disempurnakan lebih lanjut. Prosedur ini membutuhkan waktu O (| S |) (lihat artikel Wikipedia tentang perbaikan partisi), jadi ini cepat.

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

Total waktu adalah O (| V | + | E |). Ini mudah diprogram juga.


1

Beberapa pengamatan yang mungkin membantu

  1. a,bVabcdcN(a)dN(b)

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

  3. bN(a)ab

  4. Jika kembar ada maka determinan dari matriks adjacency adalah nol.

Ide mewah:

  1. Bangun pohon biner lengkap dengan tinggi = | V |.
  2. Kemudian mulai membaca satu baris matriks adjacency.
  3. Jika Anda menemukan 0 ambil ke kiri sebaliknya ambil ke kanan.
  4. Ketika Anda mencapai daun, simpan simpul Anda di sana.
  5. Lakukan ini untuk semua baris. Jadi, pada akhirnya setiap daun akan memiliki tetangga.

Dicuri dari Terinspirasi oleh algoritma kompresi Huffman! :)


2
ab

1
N(a)b=N(b)a
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.