Bagaimana Anda membuktikan bahwa ketinggian yang diharapkan dari pohon pencarian biner yang dibangun secara acak dengan node adalah ? Ada bukti dalam CLRS Pengantar Algoritma (bab 12.4), tapi saya tidak memahaminya.O ( log n )
data-structures
algorithm-analysis
binary-trees
search-trees
average-case
pengguna1675999
sumber
sumber
Jawaban:
Mari kita pikirkan hal ini secara intuitif. Dalam skenario kasus terbaik, pohon itu seimbang sempurna; dalam skenario terburuk, pohon sepenuhnya tidak seimbang:
Mulai dari simpul akar , pohon kiri ini memiliki dua kali lebih banyak node pada setiap kedalaman berikutnya, sehingga pohon tersebut memiliki node dan tinggi (yang dalam hal ini 3). Dengan sedikit matematika, , yang artinya memiliki tinggi. Untuk pohon yang sama sekali tidak seimbang, ketinggian pohon hanyalah . Jadi kita punya batasan.n = ∑ h i = 0 2 i = 2 h + 1 - 1 h n ≤ 2 h + 1 - 1 → h ≤ ⌈ log 2 ( n + 1 ) - 1 ⌉ ≤ ⌊ l o g 2 n ⌋ O ( log n ) n - 1 → O ( n )hal n = ∑hi = 02saya= 2h + 1- 1 h n ≤ 2h + 1- 1 → h ≤ ⌈ log2( N + 1 ) - 1 ⌉ ≤ ⌊ l o g2n ⌋ O ( logn ) n - 1 → O ( n )
Jika kami membangun pohon seimbang dari daftar yang diurutkan , kami akan memilih elemen tengah untuk menjadi simpul akar kami. Jika kita sebaliknya membangun pohon secara acak, salah satu dari simpul tersebut kemungkinan besar akan dipetik dan ketinggian pohon kita adalah: Kita tahu bahwa di pohon pencarian biner, subtree kiri hanya boleh berisi kunci kurang dari simpul root. Jadi, jika kita secara acak memilih elemen , subtree kiri memiliki elemen dan subtree kanan memiliki elemen , jadi lebih kompak:n h e i g h t t r e e = 1 + max ( h e i g h t l e f t s u b t r e e , h e i g h t r i g h t s u b t r e e{ 1 , 2 , ... , n } n i t h i - 1 n - i h n = 1 + maks ( h i - 1 , h n - i ) E [ h n ] = 1
Seperti yang saya yakin Anda perhatikan, saya telah sedikit menyimpang dari bagaimana CLRS membuktikan ini, karena CLRS menggunakan dua teknik bukti yang relatif umum yang membingungkan bagi yang belum tahu. Yang pertama adalah menggunakan eksponen (atau logaritma) dari apa yang ingin kita temukan (dalam hal ini tinggi), yang membuat matematika bekerja sedikit lebih bersih; yang kedua adalah menggunakan fungsi indikator (yang saya akan abaikan saja di sini). CLRS mendefinisikan tinggi eksponensial sebagai , sehingga perulangan analognya adalah . Y n = 2 × maks ( Y i - 1 , Y n - i )Yn= 2hn Yn= 2 × maks ( Yi - 1, Yn - i)
Dengan asumsi independensi (bahwa setiap undian elemen (dari elemen yang tersedia) untuk menjadi akar subtree terlepas dari semua undian sebelumnya), kami masih memiliki hubungan: mana saya melakukan dua langkah: (1) memindahkan luar karena itu adalah konstanta dan salah satu sifat penjumlahan adalah , dan (2) memindahkan 2 di luar karena juga merupakan konstanta dan salah satu sifat dari nilai yang diharapkan adalah . Sekarang kita akan mengganti1
Pada titik ini, CLRS menarik bukti induksi dari ... repertoar pengalaman matematika, yang termasuk identitas mereka serahkan kepada pengguna untuk dibuktikan. Yang penting tentang pilihan mereka adalah istilah terbesarnya adalah , dan ingat bahwa kita menggunakan tinggi eksponensial sedemikian rupa sehingga . Mungkin seseorang akan berkomentar mengapa binomial khusus ini dipilih. Gagasan umum adalah untuk mengikat dari atas pengulangan kita dengan ekspresi untuk beberapa konstanta .E[ Yn] ≤ 14( n+33) ∑n - 1i = 0( i+33) = ( n+34) n3 Yn= 2hn hn= log2n3= 3 log2n → O ( logn ) nk k
Untuk mengakhiri dengan satu liner:
sumber
n^k
), kesimpulannya sama karenak
dijatuhkan dalam notasi O-besar (cara 3 dijatuhkan). Tetapi jika kita menggantikannya dengan sesuatu yang eksponensial (e^n
), itu akan tetap menjadi batas atas yang benar , hanya saja tidak ketat . Kita tahu bahwa ketinggian yang diharapkan setidaknya adalah logaritmik, jadi menentukan bahwa itu adalah paling banyak logaritmik membuatnya ketat.