2013-08-20 53 views
6

Tôi gặp vấn đề khi tìm chiều sâu tối thiểu có thể có của biểu đồ ngụ ý rằng tôi phải tìm độ sâu tối đa từ mỗi nút và trả lại ít nhất tất cả. Rõ ràng là một DFS đơn giản từ mỗi nút sẽ thực hiện thủ thuật nhưng khi mọi thứ trở nên điên rồ với đầu vào cực lớn, thì DFS trở nên không hiệu quả (giới hạn thời gian). Tôi đã cố gắng giữ khoảng cách của mỗi chiếc lá đến nút đang được khám phá trong bộ nhớ nhưng điều đó không giúp được gì nhiều.Tìm hiểu độ sâu của biểu đồ từ mỗi nút

Làm cách nào để tìm hiệu quả độ sâu tối thiểu của biểu đồ rất lớn. Điều đáng lưu ý là biểu đồ được đề cập có không có chu kỳ.

+0

Bạn đang cố gắng tìm [trung tâm đồ thị] (http://en.wikipedia.org/wiki/Graph_center) của biểu đồ cây không bị hư không? –

+0

@PeterdeRivaz Yeah, một cái gì đó như thế –

Trả lời

9

Để tìm đồ thị trung tâm/trung tâm của một đồ thị dưới cây vô hướng bạn có thể:

  1. Đừng một DFS để tìm một danh sách tất cả các nút lá O (n)
  2. Hủy bỏ tất cả các nút lá từ đồ thị và lưu ý trong việc xóa mà nút mới trở thành nút lá
  3. Lặp lại bước 2 cho đến khi đồ thị là hoàn toàn bị xóa

nút/nút xóa trong giai đoạn cuối cùng của thuật toán sẽ là đồ thị trung tâm của cây của bạn.

Mỗi nút bị xóa một lần, vì vậy toàn bộ quá trình này có thể được thực hiện trong O (n).

+0

Số lần lặp lại sau đó sẽ là giá trị trả về? Đúng? –

+0

Nếu có nhiều nút bị xóa ở giai đoạn cuối, thì câu trả lời sẽ là số lần lặp lại. Tuy nhiên, nếu có một nút bị xóa ở giai đoạn cuối, thì câu trả lời sẽ là số lần lặp lại -1. (Cây A-B sẽ bị loại bỏ trong 1 lần lặp và có độ sâu 1, trong khi cây A cũng sẽ bị xóa trong 1 lần lặp và độ sâu ha 0) –

+0

Tôi thiếu cái gì đó hoặc nút cuối cùng sẽ bị xóa sẽ luôn là khóa của DFS? – tumasgiu

0

gì bạn dường như tìm đường kính /2. Bạn có thể tính toán đường kính của một cây như dưới đây và gọi nó là như findDiameter(n, null), cho một nút tùy ý n của cây.

public findDiameter(node n, node from) returns <depth, diameter> 

    // apply recursively on all children 
    foreach child in (neighbors(n) minus from) do 
     <de, di> = findDiameter(child, n) 

    // depth of this node is 1 more than max depth of children 
    depth = 1 + max(de) 

    // max diameter either uses this node, then it is 1 + the 2 largest depths 
    // or it does not use this node, then it's the max depth of the neighbors 
    diameter = max(max(di), 1 + max(de) + oneButLargest(de)) 

Tất cả những gì bạn cần làm là lặp lại những người hàng xóm theo dõi đường kính lớn nhất và 2 độ sâu lớn nhất.

+0

từ định nghĩa "đường kính của biểu đồ" khi tôi đọc [ở đây] (http://en.wikipedia.org/wiki/Eccentricity_ (graph_theory) #Related_concepts), tôi nghi ngờ nếu điều này giải quyết được vấn đề của tôi. Bạn có thể giải thích điều này liên quan đến vấn đề của tôi không. Cảm ơn. –

+0

@OlayinkaSF Đường kính 'd' của một cây là chiều dài của con đường dài nhất giữa hai lá. Xem xét nút giữa 'm' trong đường dẫn đó (giả sử' d' là chẵn; nếu 'd' là lẻ, có 2 nút như vậy).Độ sâu tối đa từ 'm' là' d/2' (độ sâu tối đa của nó phải được tìm thấy dọc theo con đường dài nhất, hoặc chúng ta sẽ có mâu thuẫn và một số đường dẫn khác sẽ dài hơn). Đối với mỗi nút khác, độ sâu tối đa là ít nhất là 'd/2 + 1' (định tuyến thông qua' m' và sau đó đến một trong các đầu của con đường dài nhất). Do đó, 'm' là một trung tâm đồ thị và giá trị mà bạn tìm kiếm là' d/2'. –