Kompleksitas waktu dari loop bersarang tiga


13

Harap pertimbangkan loop bertingkat tiga berikut:

for (int i = 1; i <= n; ++i)
    for (int j = i; j <= n; ++j)
        for (int k = j; k <= n; ++k)
            // statement

Pernyataan di sini dijalankan dengan tepat n(n+1)(n+2)6 kali. Bisakah seseorang tolong jelaskan bagaimana formula ini diperoleh? Terima kasih.


1
Pertanyaan Rumus kompleksitas waktu dari loop bersarang mungkin juga menarik.
— Juho

Jawaban:


14

Anda dapat menghitung berapa kali loop terdalam dieksekusi dengan menghitung jumlah triplet (i,j,k) yang dieksekusi.

Dengan kondisi loop kita tahu bahwa: . Kita bisa menguranginya menjadi masalah kombinatorik sederhana berikut.1≤i≤j≤k≤n

  • Bayangkan kotak warna merah ditempatkan dalam array dari kiri ke kanan.n+2
  • Pilih 3 kotak dari kotak dan beri warna biru.n+2
  • Bentuk triplet sebagai berikut: (i,j,k)
    • = 1 + jumlah kotak berwarna merah di sebelah kiri kotak biru pertama.i
    • = 1 + jumlah kotak berwarna merah di sebelah kiri kotak biru kedua.j
    • = 1 + jumlah kotak berwarna merah di sebelah kiri kotak biru ketiga.k

Jadi, kita hanya perlu menghitung jumlah cara memilih 3 kotak dari kotak yaitu ( n + 2n+2 .(n+23)


2
Jawaban bagus! Nilai tepat i, j, k tidak penting. Kita hanya perlu tahu bahwa setiap kotak biru dapat ditempatkan di posisi yang mungkin dan bahwa posisi mereka dibatasi: yang ke-2 selalu datang setelah tanggal 1 dan sebelum ke-3.
— Dávid Natingga

@rizwanhudda Hapus kecuali untuk bagian di n + 2 . Bisakah Anda jelaskan? n + 3 terlihat seperti angka yang benar. +2n+2n+3
— saadtaame

1
@saadtaame Ya. Anda dapat membayangkan memiliki kotak merah, tetapi memiliki kebebasan untuk memilih 3 kotak merah untuk melukis biru dari antara " n + 2 kotak merah", karena Anda tidak dapat mewarnai kotak pertama sebagai biru (Karena saya ≥ 1 )n+3n+2i≥1
— rizwanhudda

3

bagi saya, lebih mudah untuk melihat loop dalam dieksekusi kali dan jumlah total eksekusi dalam loop dalam adalahn−i

(n−i)+(n−i−1)+(n−i−2)+…+1

ini dapat ditulis ulang sebagai dan dieksekusi n kali, sehingga jumlah total eksekusi adalah∑j=0n−in−i−jn

∑i=0n∑j=0n−in−i−j=n(n+1)(n+2)6

Tantangan bagi Anda: Bayangkan Anda memiliki loop bersarang-x. Menurut jawaban sebelumnya yang akan dieksekusi (n + x-1) pilih x kali. Bagaimana Anda menghitung formula Anda?
— Dávid Natingga

untungnya OP tidak meminta x-nested! Bagaimana jawaban lain yang diberikan meluas ke loop bersarang x? Jawaban saya seharusnya mendapatkan lebih banyak jumlah dari 0 hingga n, 0 hingga n-i_1, 0 hingga n-i_2, ..., 0 hingga n-i_x. Tetapi saya tidak tahu bagaimana cara menghitungnya.
— andy mcevoy

1
Jawabannya tidak berkembang secara eksplisit untuk x umum, tetapi proses penalaran yang disajikan mudah diikuti untuk loop bersarang x. Anda hanya menambahkan lebih banyak kotak biru. Saya juga tidak tahu bagaimana saya akan menghitung jumlah yang lebih banyak.
— Dávid Natingga
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.