Tìm đỉnh đôi trong đồ thị


22

Đặt là đồ thị. Đối với một đỉnh , xác định là (mở) khu phố của trong . Nghĩa là, . Xác định hai đỉnh trong là cặp song sinh nếu và có cùng tập hợp lân cận, nghĩa là, nếu .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)

Cho một đồ thị trên đỉnh và cạnh làm đầu vào, chúng ta có thể tìm thấy một cặp sinh đôi trong nhanh như thế nào , nếu một cặp như vậy tồn tại?n m GGnmG

Chúng ta có thể kiểm tra xem hai đỉnh đã cho có phải là cặp song sinh trong thời gian , bằng cách so sánh các vùng lân cận của chúng. Do đó, một thuật toán đơn giản là tìm cặp song sinh để kiểm tra, đối với từng cặp đỉnh, cho dù chúng là cặp song sinh. Điều này làm mất thời gian (và cũng tìm thấy tất cả các cặp sinh đôi). Có cách nào nhanh hơn đáng kể để tìm (nếu có) một cặp sinh đôi trong biểu đồ? Có công việc được biết đến trong các tài liệu giải quyết vấn đề này?O ( n 3 )O(n)O(n3)


Bạn có thể lặp lại các vùng lân cận và thêm chúng vào một hashtable. Liên quan: cstheory.stackexchange.com/q/3390/236
Radu GRIGore

1
Đây là bài tập 2.17 đây books.google.co.uk/...
Radu Grigore

Ai đó có quyền chỉnh sửa nên sửa định nghĩa của cặp song sinh. (Xem các nhận xét về câu trả lời của TheMachineCharmer hoặc định nghĩa trong cuốn sách tôi đã liên kết.)
Radu GRIGore

Câu trả lời:


21

Sinh đôi trong đồ thị chỉ là các mô-đun có kích thước 2. Phân rã mô-đun của đồ thị có thể được tìm thấy trong thời gian . Cây phân rã mô-đun đại diện ngầm cho tất cả các mô-đun của biểu đồ và bao gồm ba loại nút bên trong: chuỗi, nút song song và nút chính và các lá bao gồm các nút riêng lẻ. Một tập hợp ít nhất hai đỉnh là một mô-đun khi và chỉ khi nó là một nút trong cây hoặc liên kết của một số tập hợp con của một chuỗi hoặc một nút song song.S VO(n+m)SV

Vì vậy, để tìm một cặp nút sinh đôi, nếu chúng tồn tại, chúng ta có thể xây dựng cây phân rã mô-đun trong thời gian . Sau đó nhìn vào các lá, nếu cha mẹ của bất kỳ lá nào là một chuỗi hoặc nút song song thì nút đó phải có ít nhất hai con tạo thành một cặp sinh đôi. Vì vậy, tổng thời gian chạy là tuyến tính.O(n+m)

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


Cảm ơn bạn, cũng đã giới thiệu cho tôi về Phân tích mô-đun!
gphilip

12

Vấn đề tương đương với việc xác định là có hai hàng bằng nhau trong ma trận đồ thị. Chúng ta có thể xây dựng trie trên các hàng của ma trận đồ thị. Thời gian kết hợp sẽ là O (n ^ 2)


6
Ý tưởng tương tự trên danh sách kề là . O(m+n)
Radu GRIGore

Bây giờ tôi đang bay một con ruồi;)
Hsien-Chih Chang

2
Điều này có thể được khái quát phần nào. Nếu chúng ta viết lại vấn đề là "Cho (ở đây ), hãy tìm , sao cho " sau đó cho hoàn toàn một cách tiếp cận là đánh giá cho mỗi , sắp xếp chúng và kiểm tra danh sách đã sắp xếp để tìm các bản sao. Các trie có hiệu quả sắp xếp 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: các giải pháp của @MikleB và @Travis rất thông minh. Xin lỗi vì câu trả lời quá mức.


Dường như vấn đề có thể được giảm xuống thành vấn đề nhân ma trận trên ma trận kề của đồ thị, bằng cách thay thế phép nhân bằng THIẾT BỊ (nghĩa là NXOR) và thêm bằng AND. Vì vậy, nếu có một cặp sinh đôi trong biểu đồ, thì ma trận kết quả sẽ không phải là ma trận danh tính và các chỉ số trong đó giá trị không phải là chính xác cặp nút.A A T ( i , j ) a i , jAAAT(i,j)ai,j

Theo hiểu biết tốt nhất của tôi, vấn đề nhân ma trận có thể được giải quyết trong thời gian với bằng thuật toán Coppersmith Thẻ Win giác . Nếu cần các giải pháp thực tế, bất kỳ thuật toán nhân ma trận nào hoạt động tốt trong thực tế đều tốt.α 2,376O(nα)α2.376


Tuyệt vời này hoạt động! : DI nghĩ rằng sẽ chỉ đủ để đánh giá nửa trên của . bạn nghĩ sao? A2
Pratik Deoghare

1
@TheMachineCharmer: Cảm ơn bạn :) Có, nếu đồ thị không bị ảnh hưởng.
Hsien-Chih Chang 張顯

Vâng. Chính xác! :)
Pratik Deoghare

5

Do hệ thống điên rồ trên trang này, tôi không thể bình luận trực tiếp, nhưng tôi có một vài quan sát về các câu trả lời hiện có.

Tôi khá chắc chắn Hsien-Chih Chang nhu cầu giải pháp cho đúng đến Một Một T .A2AAT

Quan sát 4 của TheMachineCharmer trở lại phía trước (ví dụ ngược lại: [0,0,1], [0,1,0], [0,1,1] có 0 xác định nhưng không có cặp song sinh). Nếu cặp song sinh tồn tại thì yếu tố quyết định bằng không.


Tôi thấy không có vấn đề gì với . Ví dụ nào? btw, hệ thống trên trang này KHÔNG điên! :)A2
Pratik Deoghare

sẽ hoạt động đối với các đồ thị vô hướng (trong đó A == A T ) nhưng nói chung, không phải cho các đồ thị có hướng. AND over XNOR cần so sánh hai hàng A và phép nhân ma trận hoạt động trên một hàng từ ma trận thứ nhất với một cột từ cột thứ hai. A2AAT
Peter Taylor

Hệ thống có thể không điên, nhưng có lẽ trái ngược với áp phích lần đầu tiên. Bạn có thể trả lời nhưng không bình luận ... nhưng bình luận của bạn đã đủ đẹp để IMHO chứng minh việc đăng bài. Khi bạn đã tạo dựng được danh tiếng nhiều hơn, tôi nghĩ bạn sẽ thấy hệ thống này khá gây nghiện.
hardmath

3
Có thể trả lời nhưng không bình luận điên. Nó buộc người dùng mới phải lựa chọn giữa việc không hữu ích hoặc trả lời sai.
Peter Taylor

3

Chủ đề này khá cũ; tuy nhiên, dường như không ai đánh vào cách tiếp cận đơn giản và thanh lịch nhất. Sắp xếp theo thứ tự thời gian danh sách kề trong thời gian O (n + m) sau đó kiểm tra các bản sao (xem Aho, Hopcroft, Ullman, 74 '). Bạn có thể sử dụng phân rã mô-đun, nhưng đây là tổng số quá mức cần thiết.


2

Chủ đề này đã cũ và câu hỏi của OP đã được trả lời nhưng tôi muốn thêm một thuật toán khác để tìm tất cả các cặp như vậy trong thời gian tuyến tính. Không ai đề cập đến sàng lọc phân vùng !

Thuật toán này tìm thấy các lớp tương đương của cặp song sinh giả. Thuật toán dựa trên một quy trình hiệu quả tinh chỉnh một phân vùng. Cho một bộ Svà một phân vùng P = {X1, ..., Xn}. refine(P, S) = {X1 ^ S, X1 - S, X2 ^ S, X2 - S, ..., Xn ^ S, Xn - S}. ^biểu thị thiết lập giao cắt và -thiết lập sự khác biệt. Một phân vùng ổn định nếu nó không thể được tinh chỉnh thêm. Quy trình này cần có thời gian O (| S |) (xem bài viết của Wikipedia về sàng lọc phân vùng), vì vậy nó rất nhanh.

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

Tổng thời gian là O (| V | + | E |). Điều này là đơn giản để lập trình là tốt.


1

Một số quan sát có thể giúp

  1. Đối với nếu một không phải là song sinh của b thì cd không thể cặp song sinh nơi c N ( một )d N ( b ) .a,bVabcdcN(a)dN(b)

  2. sau đó a b không thể là anh em sinh đôi.|N(a)||N(b)|ab

  3. Nếu thì ab không thể là anh em sinh đôi. Điều này chỉ hoạt động nếu bạn đang tìm kiếm cặp song sinh không liền kề.bN(a)ab

  4. Nếu cặp song sinh tồn tại thì yếu tố quyết định của ma trận kề là bằng không.

Ý tưởng lạ mắt:

  1. Xây dựng một cây nhị phân hoàn chỉnh với chiều cao = | V |.
  2. Sau đó bắt đầu đọc một hàng của ma trận kề.
  3. Nếu bạn gặp 0 hãy rẽ trái nếu không phải.
  4. Khi bạn đạt đến một lá lưu trữ đỉnh của bạn ở đó.
  5. Làm điều này cho tất cả các hàng. Vì vậy, cuối cùng mỗi chiếc lá sẽ có hàng xóm.

Lấy cắp từ Lấy cảm hứng từ thuật toán nén Huffman! :)


2
Điểm thứ 3 chỉ đúng nếu chúng ta tìm kiếm cặp song sinh không liền kề . Trong khái niệm thông thường của cặp song sinh , b được phép liền kề nhau. ab
Mathieu Chapelle

1
Peter Taylor, Mathieu Chapelle: Cảm ơn! Tôi đã chỉnh sửa câu trả lời để phản ánh những thay đổi. @Serge Gaspers: Tôi đoán trong trường hợp đó điều kiện phải là . N(a)b=N(b)a
Pratik Deoghare
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.