Inilah sumber pertanyaan saya.
Diberi pohon penyeimbang sendiri (AVL), kode metode yang mengembalikan median.
(Median: nilai numerik yang memisahkan separuh lebih tinggi dari sampel data dari bagian bawah. Contoh: jika seri adalah
2, 7, 4, 9, 1, 5, 8, 3, 6
maka median adalah 5.)
Saya dapat menawarkan solusi berikut:
- Lintasi pohon yang diberikan, kembalikan jumlah elemen.
- Lintasi
n / 2 + 1
(jikan
ganjil) pohon itu kembali menerapkan berjalan pohon berurutan. Nilain / 2 + 1
elemen th adalah median.
Tapi saya bisa melakukannya dengan pohon pencarian biner, bukan? Apakah ada algoritma yang lebih baik untuk AVL?
data-structures
search-trees
selection-problem
balanced-search-trees
Maksim Dmitriev
sumber
sumber
Jawaban:
Jika Anda memodifikasi pohon AVL dengan menyimpan ukuran subtree pada setiap node daripada hanya ketinggiannya, maka Anda dapat menemukan median dalam waktu menggunakan fakta bahwa pohon seimbang. Untuk mencapai hal ini, Anda menulis prosedur yang lebih umum Pilih yang menerima simpul dan sejumlah , dan menemukan th simpul terkecil di subpohon berakar pada .O ( logn ) v k k v
Misalkan subtree kiri (jika ada) memiliki node. Jika maka kita kembali ke subtree kiri. Jika maka kita mengembalikan . Kalau tidak, kita berulang ke subtree kanan, mengurangi oleh .L. k ≤ L k = L + 1 v k L + 1
Waktu berjalan dari algoritma ini adalah linear pada ketinggian pohon, yaitu .O ( logn )
sumber
AVL adalah pohon pencarian biner dengan beberapa properti khusus: itu adalah pohon self-balancing. Ketinggiannya selalu logaritmik. Pohon biner biasa dalam beberapa skenario terburuk dapat ditautkan daftar (jika Anda menambahkan data yang diurutkan) sehingga tingginya n. Pohon AVL dalam skenario terburuk adalah Pohon fibonacci.
sumber