Đây là một bài tập trong Algorithm Design Manual.Cách tìm hình tam giác bên trong biểu đồ?
Xét bài toán xác định xem một đồ thị vô hướng G được = (V, E) có chứa một hình tam giác hoặc chu kỳ dài 3.
(a) Hãy cho một O (| V |^3) để tìm một hình tam giác nếu có.
(b) Cải thiện thuật toán của bạn để chạy trong thời gian O (| V | · | E |). Bạn có thể giả định | V | ≤ | E |.
Quan sát rằng những giới hạn cho bạn thời gian để chuyển đổi giữa các kề ma trận và danh sách kề đại diện của G.
Đây là suy nghĩ của tôi:
(a) Nếu đồ thị được đưa ra như một danh sách kề, tôi có thể chuyển đổi danh sách thành ma trận bằng O (| V |^2). sau đó tôi làm:
for (int i = 0;i < n;i++)
for (int j = i+1;j < n;j++)
if (matrix[i][j] == 1)
for (int k = j+1;k < n;k++)
if (matrix[i][k] == 1 && matrix[j][k] == 1)
return true;
Điều này sẽ cung cấp O (| V |^3) để kiểm tra tam giác.
(b) Trực quan đầu tiên của tôi là nếu biểu đồ được đưa ra dưới dạng danh sách kề, thì tôi sẽ thực hiện bfs. Bất cứ khi nào tìm thấy cạnh chéo, ví dụ: if y-x is a cross edge
, thì tôi sẽ check whether parent[y] == parent[x], if true, then a triangle is found
.
Bất cứ ai có thể cho tôi biết liệu suy nghĩ của tôi có chính xác hay không?
Cũng cho điều này (b), tôi không chắc chắn sự phức tạp của nó. Nếu nó là O (| V | + | E |), phải không?
Làm cách nào để thực hiện điều đó trong O (| V | * | E |)?
Ba dòng đầu tiên (a) đang lặp qua tất cả các cạnh ... – uty
@uty, ý của bạn là gì? –
Vì bạn đã tối ưu hóa (a) một chút, vòng lặp bên trong chỉ chạy nếu ij là một cạnh. Do đó, phân tích cẩn thận hơn cho chi phí O (V^2) khi ij là nonedge và O (EV) khi ij là một cạnh, với tổng số O (EV) giả định rằng E> = V. – uty