Khoảng một năm trước, một người bạn và tôi đã nghĩ ra một cách để thực hiện thuật toán của Kruskal cho các đồ thị dày đặc hơn so với giới hạn thông thường (mà không giả sử các cạnh được sắp xếp trước). Cụ thể, chúng ta đạt được trong mọi trường hợp, tương tự như Prim khi thực hiện sử dụng ma trận kề.
Tôi đã đăng một chút về thuật toán trong blog của mình , bao gồm mã C ++ và điểm chuẩn, nhưng đây là ý tưởng chung:
Duy trì một nút đại diện cho mỗi thành phần được kết nối. Ban đầu, tất cả các nút đại diện cho chính họ.
Duy trì một vectơ
dist[i]
sao cho, đối với mọi thành phầni
, có sự cố cạnh chéo thành phần nhẹ nhấti
.Khi tìm cạnh nhẹ nhất vượt qua các phân vùng, chỉ cần tìm
i
rằng giảm thiểu trọng lượng củadist[i]
, trong thời gian tuyến tính.
Do đó, việc ký hợp đồng của cạnh nhẹ nhất và việc tìm ra cạnh đã nói có thể được thực hiện trong thời gian tuyến tính. Chúng tôi làm điều này lần để tìm MST. Một ít sổ sách kế toán là cần thiết để thực sự tìm ra cạnh nào chúng ta muốn thêm vào MST, nhưng không làm tăng sự phức tạp. Do đó, thời gian chạy là . Việc thực hiện chỉ là một vài vòng lặp.
Đây có phải là phiên bản của Kruskal nổi tiếng trong văn học?