duy trì một cây bao trùm cân bằng của đồ thị vô hướng đang phát triển


19

Tôi đang tìm cách để duy trì một cây bao trùm tương đối cân bằng của đồ thị, khi tôi thêm các nút / cạnh mới vào biểu đồ.

Tôi có một đồ thị vô hướng bắt đầu như một nút duy nhất, "root".

Ở mỗi bước, tôi thêm vào biểu đồ một nút mới và một cạnh kết nối nó với biểu đồ, hoặc chỉ một cạnh mới, kết nối hai nút cũ. Khi tôi phát triển biểu đồ, tôi duy trì một cây bao trùm. Hầu hết thời gian, điều này có nghĩa là khi tôi thêm một nút và cạnh mới, tôi đặt nút mới là con của nút cũ mà nó kết nối.

Tôi không có quyền kiểm soát thứ tự các nút mới được thêm vào, vì vậy thuật toán xây dựng cây ở trên rõ ràng có thể dẫn đến các cây bao trùm mất cân bằng.

Có ai biết các heuristic trực tuyến sẽ giữ cho cây bao trùm "tương đối cân bằng", trong khi giảm thiểu số lượng công việc được thực hiện trong việc trồng lại cây không? Tôi có toàn quyền kiểm soát cấu trúc cây. Những gì tôi không kiểm soát là kết nối đồ thị hoặc thứ tự các nút mới được thêm vào.

Lưu ý rằng các phản hồi tiêu chuẩn của Google đối với các thuật ngữ như "cân bằng" "kéo dài" và "cây" dường như là cây nhị phân và cây B, không áp dụng cả hai. Các nút biểu đồ của tôi có thể có bất kỳ số lượng lân cận nào, vì vậy các nút cây có thể có bất kỳ số lượng con nào, không phải là 2 như cây nhị phân. Cây B duy trì sự cân bằng bằng cách thay đổi danh sách kề của chúng và tôi không thể thay đổi kết nối đồ thị.


3
Có lẽ nó sẽ hữu ích nếu bạn cụ thể hơn về cây bao trùm cân bằng lý tưởng của bạn về đồ thị tĩnh. Là cây BFS tự động là một lựa chọn tốt như một cây cân bằng (nó càng nông càng tốt, nếu bạn chọn đúng gốc, hoặc trong một hệ số hai bất kể gốc nào)? Bạn có cần số lượng nút trong mỗi cây con nhỏ hơn bởi một hệ số không đổi so với số lượng nút tại cha mẹ, ở mọi nơi trên cây và nếu vậy bạn sẽ làm gì cho các biểu đồ không có cây như vậy?
David Eppstein

Cây BFS thực sự sẽ là một cây bao trùm cân bằng lý tưởng nếu tôi đang chạy ngoại tuyến này, với toàn bộ biểu đồ được đưa ra cùng một lúc. Không cần số lượng nút trong mỗi cây con nhỏ hơn bởi một yếu tố không đổi so với số lượng nút trong cha mẹ.
SuperElectric

Bạn đã kiểm tra cây hàng đầu? vi.wikipedia.org/wiki/Top_tree
Peer Sommerlund

Câu trả lời:


4

Mỗi khi bạn thêm một đỉnh mới có cạnh, bạn không có tùy chọn. Mỗi khi bạn thêm cạnh mới, nếu khoảng cách hiện tại đến gốc lớn hơn khoảng cách qua cạnh mới, bạn xóa cạnh cũ trong đường dẫn ngắn nhất cũ và thêm cạnh mới. Nếu không, bạn chỉ cần giữ cho cây của bạn không thay đổi. Tôi nghĩ theo cách này bạn có được thứ gì đó rất giống với cây BFS theo nghĩa là các cấp của cây sẽ chứa cùng một đỉnh và khoảng cách từ đỉnh đến gốc sẽ giống như khoảng cách trong cây BFS (và trong biểu đồ), nhưng tôi không biết liệu điều đó có đủ để đáp ứng điều kiện "cây bao trùm cân bằng lý tưởng" của bạn không.


2

Tôi đã kết thúc việc làm như sau:

Câu trả lời của Vinicius Santos là phần đầu tiên của nó. Như anh ấy nói, ở bất kỳ khung hình nào, tôi đều thêm một nút mới và cạnh cha-con kết nối với nó, hoặc chỉ thêm một cạnh chéo giữa hai nút hiện có. Các cạnh cha-con không có cơ hội thay đổi cấu trúc cây, chỉ có các cạnh chéo mới làm được. Xem xét thêm E cạnh chéo giữa các nút A và B, trong đó B có độ sâu cây lớn hơn. Nếu (A.depth + 1) <B.depth, thì chúng ta có thể giảm B.depth bằng cách biến nó thành con của A.

Đã giảm độ sâu của B, bây giờ chúng ta phải kiểm tra hàng xóm của B, để xem liệu họ có thể giảm độ sâu của mình bằng cách trở thành con của B. Do đó, chúng ta thực hiện một giao dịch đầu tiên từ B, đi qua một cạnh từ X đến Y nếu X. độ sâu + 1 <Y.depth và đặt Y là con của X.

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.