My first Magazine pemrograman-kompetitif-dasar | Page 118
10 Struktur Data NonLinear
Pak Blangkon, sahabat karib Pak Dengklek, sering mengunjungi Pak Dengklek untuk mem-
beli batu akik. Sebagai penggemar berat batu akik, ia hanya tertarik dengan batu akik
paling berharga. Pak Blangkon akan meminta Pak Dengklek menunjukkan harga tertinggi
yang ada, dan apabila disukai, batu tersebut akan dibeli. Pak Dengklek kadang-kadang
kewalahan, karena batu akik yang ia miliki bisa jadi sangat banyak sehingga pencarian batu
paling berharga menjadi repot. Ia meminta bantuan Anda untuk melakukan pencatatan atas
batu yang dimiliki dan melayani Pak Blangkon secara efisien.
Bantulah Pak Dengklek!
Contoh
Misalkan:
• simpan(x) menyatakan Pak Dengklek membawa pulang batu akik seharga x.
• lihat() menyatakan Pak Blangkon ingin tahu harga tertinggi untuk batu akik yang dimiliki
Pak Dengklek pada saat ini.
• jual() menyatakan Pak Dengklek menjual batu akik dengan harga tertinggi kepada Pak
Blangkon.
Berikut contoh operasinya dan perilaku yang diharapkan:
•
•
•
•
•
•
simpan(5), harga-harga batu akik yang disimpan: [5].
simpan(7), harga-harga batu akik yang disimpan: [5, 7].
simpan(3), harga-harga batu akik yang disimpan: [5, 7, 3].
lihat(), laporkan bahwa 7 merupakan harga tertinggi dari batu akik yang disimpan.
jual(), harga-harga batu akik yang tersisa: [5, 3].
lihat(), laporkan bahwa 5 merupakan harga tertinggi dari batu akik yang disimpan.
Mari kita mulai dengan solusi sederhana. Solusi paling mudah adalah membuat sebuah
array dan variabel yang menunjukkan posisi terakhir elemen pada array . Untuk setiap operasi
simpan(x), isikan nilai x pada elemen array yang ditunjuk, geser variabel penunjuk ke belakang,
lalu urutkan data secara menaik. Operasi lihat() dapat dilayani dengan mengembalikan elemen
terbesar yang dipastikan berada di paling belakang array . Operasi jual() dapat dilayani dengan
menggeser variabel penunjuk ke depan, sehingga elemen terbesar kini tidak dianggap berada di
dalam array .
Misalkan N menyatakan banyaknya elemen yang terisi pada array . Jika pengurutan yang
digunakan adalah quicksort , maka operasi simpan(x) berlangsung dalam O(N log N). Operasi
lihat() dan jual() berlangsung dalam O(1). Perhatikan bahwa pengurutan akan lebih efisien jika
digunakan insertion sort, sehingga kompleksitas simpan(x) menjadi O(N). Kompleksitas dari
solusi sederhana ini ditunjukkan pada Tabel 10.1.
Tabel 10.1: Kompleksitas solusi Hobi Batu Akik dengan solusi sederhana.
Operasi
Dengan insertion sort
simpan(x)
O(N)
lihat()
O(1)
jual()
O(1)
Solusi sederhana ini tidak efisien ketika banyak dilakukan operasi add(x). Kita akan mempe-
lajari bagaimana heap mengatasi masalah ini secara efisien.
108