MST: Kompleksitas algoritma Prim, mengapa tidak ?

8

Menurut CLRS, algoritma Prim diimplementasikan seperti di bawah ini -

MST-PRIM(G,w,r)

  • untuk setiap lakukanuV[G]
    • key[u]
    • π[u]NIL
  • key[r]0
  • QV[G]
  • sementara lakukan // ...QO(V)
    • u EXTRACT-MIN(u) // ...O(lgV)
      • untuk setiap do // ...vadj[u]O(E)
        • jika danvQw(u,v)>key[v]
          • laluπ[v]kamu
            • kunciw(kamu,v) // ...PENURUNAN-KUNCIHAI(lgV)

Buku itu mengatakan kompleksitas totalnya adalah . Namun, apa yang saya pahami adalah bahwa loop dalam dengan operasi akan dikenakan biaya , dan loop luar mencakup baik loop dan dalam , sehingga kompleksitas total harus .HAI(VlgV+ElgV)HAI(ElgV)forDECREASE-KEYHAI(ElgV)whileEXTRACT-MINforHAI(V(lgV+ElgV))=HAI(VlgV+EVlgV)HAI(EVlgV)

Mengapa analisis kompleksitas tidak dilakukan seperti itu? dan Apa yang salah dengan formulasi saya?

ramgorur
sumber

Jawaban:

9

Kompleksitas diturunkan sebagai berikut. Fase inisialisasi menghabiskan . The loop dieksekusiwaktu. The lingkaran bersarang dalam loop dieksekusi kali. Akhirnya, lemma handshaking menyiratkan bahwa ada implisit DECREASE-KEY. Karenanya, kerumitannya adalah: .HAI(V)while|V|fHairwhsayaledegree(kamu)Θ(E)Θ(V)TEXTRSEBUAHCT-M.sayaN+Θ(E)TDECRESEBUAHSE-KEY

Kompleksitas aktual tergantung pada struktur data yang sebenarnya digunakan dalam algoritma. Menggunakan array, , kompleksitas adalah dalam kasus terburuk.TEXTRSEBUAHCT-M.sayaN=HAI(V),TDECRESEBUAHSE-KEY=HAI(1)HAI(V2)

Menggunakan tumpukan biner, , kompleksitasnya adalah dalam kasus terburuk. Inilah sebabnya: karena grafik terhubung, maka , dan paling banyak (kasus terburuk, untuk grafik padat). Mungkin, Anda melewatkan poin ini.TEXTRSEBUAHCT-M.sayaN=HAI(catatanV),TDECRESEBUAHSE-KEY=HAI(catatanV)HAI(EcatatanV)|E||V|-1EV2

Menggunakan Fibonacci Heap, diamortisasi, diamortisasi, kompleksitasnya adalah dalam kasus terburuk.TEXTRSEBUAHCT-M.sayaN=HAI(catatanV)TDECRESEBUAHSE-KEY=HAI(1)HAI(E+VcatatanV)

Massimo Cafaro
sumber
1

Ide Anda sepertinya benar. Mari kita ambil kompleksitas sebagai . Kemudian perhatikan bahwa di bagian dalam untuk loop, kita benar-benar melewati semua simpul, dan bukan tepi, jadi mari kita modifikasi sedikit ke , yang berarti . Tetapi untuk analisis kasus terburuk (grafik padat), kira-kira sama dengan jumlah sisi, , memberikan tetapi karena , maka .V(lgv+Elgv)V(lgv+Vlgv)Vlgv+V2lgvV2EVlgv+Elgv=(V+E)lgvVEElgv

pengguna3473400
sumber
Apa v? Kesalahan ketik untukV?
David Richerby
Sebenarnya, saya tidak mengerti ini sama sekali. Apa artinya mengatakan "Mari kita ambil kompleksitas sebagai [ekspresi 1]" dan kemudian "modifikasi sedikit ke [ekspresi 2]"? Anda tidak bisa hanya menganggap waktu berjalan adalah satu hal dan kemudian mengubahnya ke hal lain.
David Richerby