Thuật toán ghi nhãn thời gian tuyến tính cho một cây?


12

Tôi có một cây vô hướng có đỉnh mà tôi muốn dán nhãn. Các nút lá nên được dán nhãn một. Sau đó, giả sử những chiếc lá đã được gỡ bỏ. Trong cây còn lại, lá nên được dán nhãn hai. Quá trình này tiếp tục theo cách rõ ràng cho đến khi tất cả các đỉnh có nhãn. Lý do tôi làm điều này là vì tôi muốn lưu trữ các đỉnh trong một hàng đợi và đi qua chúng "lá đầu tiên". Có cách nào dễ dàng để thực hiện thời gian O(n+m) này không?

Tôi có thể giải quyết vấn đề bằng cách thực hiện BFS trên mỗi bước. Nhưng trong trường hợp xấu nhất, trên mỗi bước tôi đi qua mọi đỉnh, loại bỏ chính xác hai lá và chinh phục chúng. Tôi tin rằng điều này cần thời gian bậc hai.

Một ý tưởng khác là đầu tiên tìm thấy tất cả các lá, và sau đó thực hiện BFS từ mỗi lá. Điều này không cho tôi giải pháp mong muốn. Ví dụ, hãy xem xét một loại "biểu đồ vương miện" như trong hình dưới đây. Giải pháp mong muốn được hiển thị, nhưng khởi chạy BFS từ mỗi lá sẽ chỉ dẫn đến hai nhãn được sử dụng.

nhập mô tả hình ảnh ở đây

Lý tưởng nhất, thuật toán thời gian tuyến tính cũng sẽ dễ dàng để giải thích và thực hiện.

Câu trả lời:


8

Cây chưa trồng

Bạn có thể sử dụng hàng đợi ưu tiên để giải quyết vấn đề này trong :O(E+VlogV)

  • Đặt tất cả các đỉnh trong một hàng ưu tiên, với ưu tiên của chúng là mức độ của chúng.
  • Trong khi hàng đợi không trống:
    • Xóa một đỉnh có mức độ ưu tiên tối thiểu, phải là 1 (hoặc 0 ở cuối).v10
    • σ(v)=1+maxσ(u)uv
    • Trừ từ mức ưu tiên của hàng xóm duy nhất còn lại của (nếu có).1u

Trên thực tế, chúng tôi không thực sự cần một hàng đợi ưu tiên và thuật toán này có thể được thực hiện bằng cách sử dụng một hàng đợi đơn giản trong thời gian :O(E+V)

  • Khởi tạo một mảng có chiều dài với độ của tất cả các đỉnh.V
  • Khởi tạo một mảng có độ dài bằng "còn sống".V
  • Đi một lần qua mảng đầu tiên và đẩy tất cả các đỉnh cấp đến hàng đợi.1
  • Trong khi hàng đợi không trống:
    • Pop một đỉnh .v
    • Đặt , trong đó đi qua tất cả các hàng xóm ban đầu của .σ(v)=1+maxσ(u)uv
    • Đánh dấu là "chết".v
    • Nếu có một số lân cận "còn sống" , trừ từ mức độ .vu1u
    • Nếu mức độ mới của là , đẩy đến hàng đợi.u1u

Cây có rễ

Sử dụng DFS thay thế. Dưới đây là một bản phác thảo của thuật toán.

  • Cho một nút , nếu là một chiếc lá, đặt .vvd(v)=1
  • Nếu không phải là một chiếc lá, hãy chạy thuật toán trên tất cả các phần tử con của nó, sau đó cho , trong đó đi qua tập hợp tất cả các phần tử con.vd(v)=1+maxd(u)u

Bạn chạy thuật toán này trên thư mục gốc.


Thê nay đung không? Xét cây 1-> 2-> 3-> 4-> 5, trong đó 1 là gốc. 2 nên lấy nhãn 1, nhưng bạn cho 3? Hay bởi con bạn có nghĩa là hàng xóm? Nút nào chúng ta bắt đầu dfs từ đó?
Knoothe

Việc triển khai của tôi là "tắt bởi một", nhưng theo mô tả của bạn, nên lấy nhãn 4 , vì bạn phải xóa 5 , rồi 4 , rồi 3 , và chỉ sau đó 2 mới trở thành một chiếc lá. 245432
Yuval Filmus

Tôi không đặt câu hỏi :-). Tôi giải thích câu hỏi là: Một cây vô hướng. Dán nhãn tất cả các lá. Xóa chúng. Tái diễn trên cây kết quả. Trong trường hợp đó, cây thực sự là 1-2-3-4-5, Bước 1, bạn xóa 1 và 5, sau đó 2 và 4 và sau đó 3. Xem đoạn văn về "biểu đồ vương miện". Đây là một trong những thuật toán cổ điển để tìm trung tâm của cây.
Knoothe

1 không phải là một chiếc lá. Nó là rất xa từ một chiếc lá, nó là gốc. Tôi giải thích câu hỏi là nhắm mục tiêu cây gốc. Có lẽ chúng ta nên chờ OP phản hồi.
Yuval Filmus

2
@YuvalFilmus, chỉ cần ném 2 xu của tôi vào, không nên là ? Các lá là 1 , nếu bạn xóa chúng thì các mới sẽ là 2 , vì vậy đây là thước đo xem bạn phải xóa bao nhiêu lớp trước khi đỉnh trở thành một chiếc lá. Với min, bất kỳ đỉnh nào liền kề với một chiếc lá đều có 2, nhưng nó có thể không trở thành một chiếc lá khi những chiếc lá bị xóa. Câu đó có quá nhiều lá trong đó. Tôi cần một cây chổi. 1+max{d(u)}12
Luke Mathieson

2

Một câu trả lời đơn giản như sau:

  • (u,v)uv

  • Topo sắp xếp đồ thị.

  • vv

O(n+m)O(n+m)

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.