Saya sedang mengerjakan masalah H dalam ACM ICPC 2004–2005 kontes Eropa Timur Laut .
Masalahnya pada dasarnya adalah untuk menemukan kasus terburuk yang menghasilkan jumlah maksimal dari pertukaran dalam algoritma (sift down) untuk membangun heap.
- Input: File input berisi ( ).
- Output: Output array yang berisi angka integer yang berbeda dari ke , sedemikian rupa sehingga merupakan heap, dan ketika mengonversinya menjadi array yang diurutkan, jumlah total pertukaran dalam operasi pengayakan maksimal mungkin.
Input sampel: 6
Output yang sesuai:6 5 3 2 4 1
Dan dasar-dasar output:
[2, 1]
[3, 2, 1]
[4, 3, 1, 2]
[5, 4, 3, 2, 1]
[6, 5, 3, 4, 1, 2]
algorithms
data-structures
algorithm-analysis
sorting
Jonaprieto
sumber
sumber
Jawaban:
Diberikan kasus terburuk untukn , kita dapat membuat kasus terburuk untuk n+1 sebagai berikut: kami melakukan 'siklus swap' sebagai berikut: kami ambil n+1 , masukkan a[0] , dan kami bertukar a[0] dengan elemen maksimal anak-anaknya, yaitu a[1] atau a[2] , yang kami tukar lagi dengan elemen maksimum anak-anaknya dan seterusnya, hingga kami meninggalkan n tumpukan elemen, pada titik mana kita meletakkan elemen terakhir di n+1 posisi ke-5.
Contoh: kasus terburuk untukn=5 adalah [5,4,3,2,1] . Kami bertukar dalam 6 yang menciptakan tumpukan[6,5,3,4,1] , setelah itu kita berakhir dengan 2, yang kita masukkan di akhir: [6,5,3,4,1,2] .
Metode di atas bekerja dengan induksi: kita mulai dari hasil terburuk untukn−1 elemen dan melakukan operasi sift-down secara terbalik, memaksimalkan jumlah swap yang harus dilakukan (⌊log(n)⌋ swap). Anda tidak dapat melakukan lebih banyak swap daripada ini, jadi Anda memaksimalkan jumlah swap setelah operasi ekstrak-min pertama, setelah itu Anda dibiarkan dengan kasus terburuk untukn−1 elemen untuk operasi ekstrak-min berikutnya. Ini menyiratkan bahwa jumlah swap memang maksimal.
Perhatikan bahwa metode ini memberikan hasil yang berbeda dari yang Anda dapatkan:
Namun, kedua solusi itu benar:
sumber