Saya mencoba memahami apa yang salah dengan bukti pengulangan berikut
T(n)≤2(c⌊n
Dokumentasi mengatakan itu salah karena hipotesis induktif bahwa Apa yang saya lewatkan?
Saya mencoba memahami apa yang salah dengan bukti pengulangan berikut
T(n)≤2(c⌊n
Dokumentasi mengatakan itu salah karena hipotesis induktif bahwa Apa yang saya lewatkan?
Jawaban:
Katakanlah tujuan akhirnya adalah membuktikan . Anda mulai dengan hipotesis induksi:
i < n untuk semua .
Dan untuk melengkapi buktinya, Anda harus menunjukkan bahwa juga.
Namun, yang dapat Anda simpulkan adalah , yang tidak membantu untuk melengkapi buktinya; Anda memerlukan satu konstanta untuk (hampir) semua . Oleh karena itu, kami tidak dapat menyimpulkan apa pun dan tidak terbukti.c n T ( n ) = O ( n )
Perhatikan bahwa Anda bingung antara hasil dan proses pembuktian. Dan satu hal lagi, sebenarnya dalam kasus ini sehingga Anda dapat mempertimbangkan hipotesis induksi yang tepat untuk dapat membuktikannya.Θ ( n log n )
Anda telah menghilangkan beberapa langkah. Sepertinya Anda berusaha membuktikan dengan induksi bahwa , dan buktinya Anda:
Misalkan untuk k < n . Ini berarti T ( k ) ≤ c untuk beberapa c . Kemudian T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n ≤ 2 c ⌊ n / 2 ⌋ + n ≤ ( c + 1 ) , jadi T ( n ) = O ( n ) .
Bukti ini salah sejak awal: “ untuk k < n ” tidak masuk akal. Besar oh adalah gagasan asimptotik: T ( k ) = O ( k ) berarti ada beberapa konstanta c dan ambang N sehingga ∀ k ≥ N , T ( k ) ≤ c . Dan lagi pada akhirnya, Anda tidak dapat menyimpulkan bahwa " T ( n ) = O ( n ) ", karena itu mengatakan sesuatu tentang fungsi T secara keseluruhan dan Anda hanya membuktikan sesuatu tentang nilai T tertentu ( n ) .
Anda harus eksplisit tentang apa yang berarti. Jadi mungkin buktinya:
Misalkan untuk semua k < n . Kemudian T ( n ) = 2 T ( ⌊ n / 2 ⌋ ) + n ≤ 2 c ⌊ n / 2 ⌋ + n ≤ ( c + 1 ) .
Ini tidak membuktikan langkah induktif: Anda mulai dari , dan Anda membuktikan bahwa untuk k = n , T ( k ) ≤ ( c + 1 ) . Ini adalah batas yang lebih lemah. Lihatlah apa artinya ini: T ( k ) ≤ c berarti bahwa c adalah terikat untuk tingkat pertumbuhan T . Tetapi Anda memiliki tingkat c yang tumbuh ketika k tumbuh. Itu bukan pertumbuhan linear!
Jika Anda melihat lebih dekat, Anda akan melihat bahwa tingkat tumbuh sebesar 1 setiap kali k berlipat ganda. Jadi, secara informal, jika m = 2 p k maka c m = c k + p ; dengan kata lain, c k = c 0 log 2 k .
Ini bisa dibuat tepat. Buktikan dengan induksi bahwa untuk , T ( k ) ≤ c log 2 ( k ) .
Relasi perulangan adalah tipikal untuk algoritma divide-and-conquer yang membagi data menjadi dua bagian yang sama dalam waktu linier. Algoritma tersebut beroperasi di waktu (bukan O ( n ) ).
Untuk melihat apa hasil yang diharapkan, Anda dapat memeriksa hubungan perulangan terhadap teorema master . Divisi ini dan pekerjaan ekstra yang dilakukan adalah n ; log 2 ( 2 ) = 1 jadi ini adalah kasus kedua yang pertumbuhannya adalah Θ ( n .
Saya memperluas jawaban yang sudah diberikan, mungkin hanya dengan menjelaskan komentar saya lebih terinci.
Karena menebak jelas sulit dan melelahkan, terkadang ada metode yang lebih baik. Salah satu metode tersebut adalah Teorema Master . Pengulangan kami sekarang dalam bentuk , di mana a ≥ 1 dan b > 1 adalah konstanta dan f ( n ) suatu fungsi. Perhatikan bahwa dalam kasus kami ⌊ n / 2 ⌋ dapat diartikan sebagai n / 2. Secara teknis tepat, perulangan kami mungkin tidak terdefinisi dengan baik karena mungkin bukan bilangan bulat. Namun, ini diizinkan karena tidak akan mempengaruhi perilaku pengulangan asimptotik. Karena itu, kita sering merasa nyaman untuk menjatuhkan lantai dan langit-langit. Bukti formal ini agak membosankan, tetapi pembaca yang tertarik dapat menemukannya misalnya dari Cormen et al. buku .