MST: Độ phức tạp thuật toán của Prim, tại sao không phải là


8

Theo CLRS, các thuật toán của Prim được triển khai như dưới đây -

MST-PRIM(G,w,r)

  • với mỗi làmuV[G]
    • key[u]
    • π[u]NIL
  • key[r]0
  • QV[G]
  • trong khi làm // ... O ( V )QO(V)
    • EXTRACT-MIN ( u ) // ... O ( lg V )u EXTRACT-MIN(u)O(lgV)
      • với mỗi làm // ... O ( E )vadj[u]O(E)
        • nếu w ( u , v ) > khóa [ v ]vQw(u,v)>key[v]
          • sau đó π[v]u
            • // KHAI THÁC-KHÓA ... O ( lg V )keyw(u,v)DECREASE-KEYO(lgV)

Cuốn sách nói rằng tổng độ phức tạp là . Tuy nhiên, điều tôi hiểu là vòng lặp bên trong với thao tác sẽ có giá O ( E lg V ) và vòng lặp bên ngoài bao quanh cả vòng lặp và vòng trong , do đó tổng độ phức tạp phải là O ( V ( lg V + E lg V ) ) = O (O(VlgV+ElgV)O(ElgV)forDECREASE-KEYO(ElgV)whileEXTRACT-MINfor .O(V(lgV+ElgV))=O(VlgV+EVlgV)O(EVlgV)

Tại sao phân tích phức tạp không được thực hiện như vậy? và điều gì là sai với công thức của tôi?

Câu trả lời:


9

Sự phức tạp có nguồn gốc như sau. Giai đoạn khởi tạo có chi phí O(V) . Các while vòng lặp được thực hiện |V|lần Các for vòng lặp lồng nhau trong while vòng lặp được thực hiện degree(u) lần. Cuối cùng, Bổ đề bắt tay ngụ ý rằng có Θ(E) của ngầm GIẢM-KEY. Do đó, độ phức tạp là: Θ(V)TEXTRACTMIN+Θ(E)TDECREASEKEY .

TEXTRACTMIN=O(V),TDECREASEKEY=O(1)O(V2)

TEXTRACTMIN=O(logV),TDECREASEKEY=O(logV)O(ElogV)|E||V|1EV2

TEXTRACTMIN=O(logV)TDECREASEKEY=O(1)O(E+VlogV)


1

V(lgv+Elgv)V(lgv+Vlgv)Vlgv+V2lgvV2EVlgv+Elgv=(V+E)lgvVEElgv


vV

Thật ra, tôi không hiểu điều này chút nào. Có nghĩa gì khi nói "Hãy lấy sự phức tạp làm [biểu thức 1]" và sau đó "sửa đổi một chút thành [biểu thức 2]"? Bạn không thể chỉ cho rằng thời gian chạy là một thứ và sau đó thay đổi nó thành một thứ khác.
David Richerby 7/03/2016
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.