2010-04-03 50 views
5

Tôi có rất nhiều chu kỳ (thể hiện bằng giá trị số, ví dụ, 1-2-3-4 tương ứng với một chu kỳ, với 4 cạnh, mép 1{1:2}, cạnh 2{2:3}, cạnh 3{3,4}, cạnh 4{4,1}, v.v.).Thuật toán cho Tập đoàn Tất cả các Cycles Cùng

Chu kỳ được cho là được kết nối với một chu kỳ khác nếu chúng chia sẻ một và chỉ một cạnh. Ví dụ: giả sử tôi có hai chu kỳ 1-2-3-45-6-7-8, thì có hai nhóm chu kỳ vì hai chu kỳ này không kết nối với nhau. Nếu tôi có hai chu kỳ 1-2-3-43-4-5-6, thì tôi chỉ có một nhóm chu kỳ vì hai chu kỳ này chia sẻ cùng một cạnh.

Hình bên dưới sẽ có thể để minh họa cho quan điểm của tôi:

alt text http://lh5.ggpht.com/_SDci0Pf3tzU/SuBhd07xbWI/AAAAAAAAFMs/9OlMhN8uzzQ/s640/mst.jpg

Các R1, R2-R7 là những gì tôi gọi là "chu kỳ". Trong hình trên, chỉ có một nhóm chu kỳ bao gồm tất cả các R1 đến R7.

Cách hiệu quả nhất để tìm tất cả các nhóm chu kỳ là gì?

+0

Đầu vào của bạn được cung cấp như thế nào? Giống như trong các ví dụ của bạn hoặc bạn được đưa ra một đồ thị hoặc một cái gì đó như thế? – IVlad

+0

Câu hỏi này có thể phù hợp hơn với Math Overflow. –

+0

Có lẽ bạn nên giải thích những gì bạn đang cố gắng hoàn thành, điều đó có thể đưa ra manh mối về lý do tại sao bạn gọi nó là "chu kỳ" và tại sao nó có "cạnh" và ý nghĩa của nó. – Guffa

Trả lời

3

Đầu tiên tìm tất cả các chu kỳ trong biểu đồ và gắn nhãn cho chúng ví dụ A, B, C, v.v. Bây giờ, hãy tạo một biểu đồ mới trong đó mỗi chu kỳ được tìm thấy trong biểu đồ được chuyển đổi thành một nút trong biểu đồ mới. Tham gia các nút với một cạnh trong biểu đồ mới nếu các chu kỳ tương ứng được "kết nối" trong biểu đồ cũ, sử dụng định nghĩa của bạn (không bình thường) được kết nối.

Số lượng "nhóm chu kỳ" sau đó là số lượng connected components trong biểu đồ mới.

+0

@ Thanks Mark, nhưng là có anyway để lấy lại tất cả các chu kỳ bên trong mỗi nhóm chu kỳ? – Graviton

+0

@Mark, tôi cũng đặt câu hỏi là làm thế nào để biết liệu các chu trình có được kết nối không, nhưng trong câu trả lời của bạn, bạn nói rằng tôi cần phải tham gia các nút, có thể rõ ràng hơn về điều này? – Graviton

+0

@Ngu: Tôi sẽ để lại phần chu kỳ phát hiện cho người khác. Để xác định xem hai chu trình có được kết nối hay không, hãy đếm số cạnh mà chúng chia sẻ. Một khi bạn đã phát hiện ra các chu kỳ thì bạn có thể tạo một đồ thị mới, G '. Trong ví dụ của bạn G 'sẽ chứa 7 nút, một nút cho mỗi chu kỳ mà bạn đã phát hiện. Gọi các nút mới R1, R2, ..., R7. Nếu hai chu trình được kết nối thì tạo một cạnh giữa chúng trong G '. R1 nên có một cạnh để R6 và R7. R2 phải có một cạnh để R3 và R7, vv ... Đếm các thành phần được kết nối của đồ thị đó bằng cách sử dụng bất kỳ thuật toán chuẩn nào từ Wikipedia - câu trả lời là 1. –

0

Tôi khá chắc chắn, rằng đây không phải là cách hiệu quả nhất, nhưng điều này sẽ nỗ lực ban đầu của tôi:

trao đổi đầu tiên cạnh với đỉnh: Vì vậy, ví dụ chu kỳ của bạn 1-2-3-4, 3-4-5-65-6-7-8, bạn sẽ cần:

"12" => "A" 
"23" => "B" 
"34" => "C" 
"45" => "D" 
"56" => "E" 
"67" => "F" 
"78" => "G" 
"41" => "H" 
"63" => "I" 
"85" => "J" 

Điều này cho phép bạn (v * (v-1))/2 đỉnh, nhưng không sao - nó vẫn có thể đủ tốt cho thuật toán O (v^2).

Sau đó, đại diện cho các chu kỳ như bitfields: "1-2-3-4" trở thành ABCH

ABCDEFGHIJ 
1110000100 

và "3-4-5-6" trở thành CDEI

ABCDEFGHIJ 
0011100010 

Vì vậy, họ có chính xác một điểm chung, có nghĩa là trong biểu đồ ban đầu, họ có chính xác một cạnh chung. Điều này có thể được kiểm tra từng chút một với O (v^2), hoặc với tìm kiếm nhị phân (kiểm tra đầu tiên bởi ANDing, nếu chúng có điểm chung, sau đó kiểm tra VÀO nửa đầu tiên của bit, v.v.)

+0

Đừng nghĩ rằng giải pháp của bạn hoạt động, còn nếu hai chu kỳ không kết nối trực tiếp, thì vẫn không thuộc về cùng một nhóm chu kỳ? – Graviton

+0

@Ngu: ý định của tôi là kiểm tra hai chu kỳ trước, và kết hợp chúng thành một, nếu chúng được kết nối (việc kết hợp có thể được thực hiện dễ dàng bằng thao tác OR). Sau đó tiếp tục với chu kỳ tiếp theo. Tôi hy vọng tôi hiểu được nhóm chính xác, vì nó được sử dụng ở đây! –

+0

Nếu bạn muốn cải thiện hiệu suất, bạn cũng có thể thử thử nghiệm ba hoặc bốn chu kỳ cùng một lúc bằng cách ANDING chúng (tùy thuộc vào khả năng của nó, các chu kỳ đó nằm trong một nhóm, bạn có thể tinh chỉnh hiệu suất theo cách này). Sau đó, "khoan xuống" theo từng chu kỳ, nếu một trận đấu xảy ra. Nó thậm chí có thể có thể bắt đầu với ANDing một nửa của chu kỳ và "khoan" xuống đệ quy ... –

Các vấn đề liên quan