Khi nào tôi nên sử dụng Kruskal trái ngược với Prim (và ngược lại)?


192

Tôi đã tự hỏi khi nào nên sử dụng thuật toán của Prim và khi nào Kruskal tìm thấy cây bao trùm tối thiểu? Cả hai đều có logic dễ dàng, các trường hợp xấu nhất giống nhau và chỉ có sự khác biệt là việc thực hiện có thể liên quan đến một số cấu trúc dữ liệu khác nhau. Vậy yếu tố quyết định là gì?

Câu trả lời:


199

Sử dụng thuật toán của Prim khi bạn có một biểu đồ có nhiều cạnh.

Đối với biểu đồ có các đỉnh V cạnh E , thuật toán của Kruskal chạy trong thời gian O (E log V) và thuật toán của Prim có thể chạy trong thời gian khấu hao O (E + V log V) , nếu bạn sử dụng Heap Fibros .

Thuật toán của Prim nhanh hơn đáng kể trong giới hạn khi bạn có một biểu đồ thực sự dày đặc với nhiều cạnh hơn các đỉnh. Kruskal thực hiện tốt hơn trong các tình huống điển hình (đồ thị thưa thớt) vì nó sử dụng các cấu trúc dữ liệu đơn giản hơn.


8
Tôi sẽ nói "các tình huống điển hình" thay vì trung bình .. Tôi nghĩ đó là một thuật ngữ tối nghĩa để sử dụng, ví dụ "kích thước trung bình" của bảng băm là gì? không ý kiến.
yairchu

2
@SplmitField: Tôi tin rằng bạn đang so sánh táo và cam. Phân tích khấu hao tương tự như một cách để đo lường chức năng (có thể nói) --- đó là trường hợp xấu nhất hay trường hợp trung bình phụ thuộc vào những gì bạn đang chứng minh. Trong thực tế (như tôi tìm kiếm bây giờ), bài viết wiki sử dụng ngôn ngữ ngụ ý rằng nó chỉ được sử dụng để phân tích trường hợp xấu nhất. Bây giờ, sử dụng phân tích như vậy có nghĩa là bạn không thể đưa ra những lời hứa mạnh mẽ về chi phí của một hoạt động cụ thể, nhưng vào thời điểm thuật toán được thực hiện, nó thực sự sẽ bằng O (E + VlogV), thậm chí là trường hợp xấu nhất.
agorenst

10
Về mặt lý thuyết nghe có vẻ tốt, nhưng tôi cá rằng rất ít người có thể thực hiện một đống Fibonacci
Alexandru

2
@tgamblin, có thể có các cạnh C (V, 2) trong trường hợp xấu nhất. Vì vậy, không phải thời gian kết hợp thuật toán của Prim sôi xuống O (V ^ 2 + VlogV) tức là O (V ^ 2) trong trường hợp của đống heap?
tinh xanh

7
Ngoài ra còn có một yếu tố quan trọng khác: đầu ra của Prims chỉ là MST nếu đồ thị được kết nối (đầu ra dường như không có tác dụng gì khác), nhưng đầu ra của Kruskal là rừng Spanning tối thiểu (với một số sử dụng).
Andrei I

100

Tôi tìm thấy một chủ đề rất hay trên mạng giải thích sự khác biệt theo cách rất đơn giản: http://www.thestudentroom.co.uk/showthread.php?t=232168 .

Thuật toán của Kruskal sẽ phát triển một giải pháp từ cạnh rẻ nhất bằng cách thêm cạnh rẻ nhất tiếp theo, miễn là nó không tạo ra một chu kỳ.

Thuật toán của Prim sẽ phát triển một giải pháp từ một đỉnh ngẫu nhiên bằng cách thêm đỉnh rẻ nhất tiếp theo, đỉnh hiện không có trong giải pháp mà được kết nối với nó bằng cạnh rẻ nhất.

Ở đây đính kèm là một tờ thú vị về chủ đề đó.nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đây

Nếu bạn thực hiện cả Kruskal và Prim, ở dạng tối ưu của chúng: với một kết hợp tìm kiếm và một đống finbonacci tương ứng, thì bạn sẽ lưu ý cách Kruskal dễ thực hiện so với Prim.

Prim khó hơn với một đống heap của trò chơi chủ yếu vì bạn phải duy trì một bảng giữ sách để ghi lại liên kết hai chiều giữa các nút đồ thị và các nút heap. Với Liên minh Tìm kiếm, điều ngược lại, cấu trúc đơn giản và thậm chí có thể sản xuất trực tiếp mst mà hầu như không mất thêm chi phí.


2
Nitpick: 'slide' cuối cùng trong mỗi nên đọc "lặp lại cho đến khi bạn có một cây bao trùm"; cho đến khi MST, một nhiệm vụ đệ quy - làm sao tôi biết nó tối thiểu - đó là lý do tại sao tôi theo dõi Prim's / Kruskal để bắt đầu!
OJFord

@OllieFord Tôi tìm thấy chủ đề này vì đã tìm kiếm một minh họa đơn giản về thuật toán Prim và Kruskal. Các thuật toán đảm bảo rằng bạn sẽ tìm thấy một cây và cây đó là MST. Và bạn biết rằng bạn đã tìm thấy một cái cây khi bạn có các cạnh chính xác V-1 .
mikedu95

@ mikedu95 Bạn đã đúng, đưa ra quan điểm giống như nhận xét trước đây của tôi từ một góc độ khác.
OJFord

Nhưng đó không phải là điều kiện tiên quyết mà bạn chỉ phải chọn với một trọng số duy nhất giữa các đỉnh, bạn không thể chọn trọng số 2 nhiều hơn một lần từ biểu đồ trên, bạn phải chọn trọng số tiếp theo: 3 @Snicolas
ani0904071

30

Tôi biết rằng bạn đã không yêu cầu điều này, nhưng nếu bạn có nhiều đơn vị xử lý hơn, bạn nên luôn luôn xem xét thuật toán của Borůvka , bởi vì nó có thể dễ dàng song song - do đó nó có lợi thế về hiệu suất so với thuật toán Kruskal và Jarník-Prim.


23

Kruskal có thể có hiệu suất tốt hơn nếu các cạnh có thể được sắp xếp theo thời gian tuyến tính hoặc đã được sắp xếp.

Prim tốt hơn nếu số cạnh của đỉnh cao.


19

Trường hợp xấu nhất thời gian KruskalO (E log E) , điều này bởi vì chúng ta cần sắp xếp các cạnh. Prim thời gian phức tạp trường hợp xấu nhất là O (E log V) với hàng đợi ưu tiên hoặc thậm chí tốt hơn, O (E + V log V) với Fibonacci Heap . Chúng ta nên sử dụng Kruskal khi đồ thị thưa thớt, số lượng các cạnh, như E = O (V), khi các cạnh đã được sắp xếp hoặc nếu chúng ta có thể sắp xếp chúng theo thời gian tuyến tính. Chúng ta nên sử dụng Prim khi đồ thị dày đặc, tức là số cạnh cao, như E = O (V²).


Đối với tôi, Prim không bao giờ tệ hơn Kruskal về tốc độ. Vì E nên ít nhất V-1 có một cây bao trùm. Tôi nghĩ lý do chúng ta có thể thích Kruskal cho một biểu đồ thưa thớt là vì cấu trúc dữ liệu của nó đơn giản.
Yu Gu

16

Nếu chúng ta dừng thuật toán trong thuật toán giữa của primer luôn tạo cây được kết nối, nhưng mặt khác kruskal có thể cung cấp cho cây hoặc rừng bị ngắt kết nối


5

Một ứng dụng quan trọng của thuật toán Kruskal là trong phân cụm liên kết đơn .

Hãy xem xét n đỉnh và bạn có một đồ thị hoàn chỉnh. Để có được các cụm ak của n điểm đó. Thuật toán của Krunal trên các cạnh n- (k-1) đầu tiên của tập hợp các cạnh được sắp xếp. Bạn có được cụm k của đồ thị với mức tối đa khoảng cách.


3

Thời gian tốt nhất cho Kruskal là O (E logV). Đối với Prim sử dụng đống xơ, chúng ta có thể nhận được O (E + V lgV). Do đó, trên một biểu đồ dày đặc, Prim tốt hơn nhiều.


2

Prim là tốt hơn cho các biểu đồ dày đặc hơn, và trong điều này, chúng tôi cũng không phải chú ý nhiều đến các chu kỳ bằng cách thêm một cạnh, vì chúng tôi chủ yếu xử lý các nút. Prim là nhanh hơn Kruskal trong trường hợp đồ thị phức tạp.


2

Trong Thuật toán kruskal, chúng tôi có số cạnh và số đỉnh trên một biểu đồ đã cho nhưng trên mỗi cạnh chúng tôi có một số giá trị hoặc trọng số thay cho chúng tôi có thể chuẩn bị một biểu đồ mới không phải theo chu kỳ hoặc không đóng từ bất kỳ bên nào Ví dụ

biểu đồ như thế này. | | | | | | | Đặt tên cho bất kỳ đỉnh a, b, c, d, e, f.

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.