Struktur & Algoritma Data

Tutorial Struktur Data Tumpukan

Tutorial Struktur Data Tumpukan
Data adalah sekumpulan nilai. Data dapat dikumpulkan dan diletakkan dalam satu baris, atau dalam kolom, atau dalam tabel atau dalam bentuk pohon. Struktur data tidak hanya penempatan data dalam bentuk-bentuk ini. Dalam komputasi, struktur data adalah salah satu dari format ini, ditambah hubungan antara nilai-nilai, ditambah operasi (fungsi) yang dilakukan pada nilai-nilai. Anda seharusnya sudah memiliki pengetahuan dasar tentang struktur data pohon sebelum datang ke sini, karena konsep di sana, akan digunakan di sini dengan sedikit atau tanpa penjelasan. Jika Anda tidak memiliki pengetahuan itu, maka bacalah tutorial berjudul, Tutorial Struktur Data Pohon untuk Pemula, di tautan, https://linuxhint.com/tree_data_structure_tutorial_beginners/. Setelah itu, lanjutkan membaca tutorial ini.Struktur data heap adalah pohon biner yang lengkap atau hampir lengkap, di mana anak dari setiap simpul nilainya sama atau lebih kecil dari nilai induknya. Atau, itu adalah pohon di mana nilai orang tua sama dengan atau lebih kecil dari nilai anak-anaknya. Nilai (datum) dari sebuah pohon juga disebut kunci.

Ilustrasi Struktur Data Heap

Ada dua jenis heap: max-heap dan min-heap. Struktur max-heap adalah di mana nilai maksimum adalah root, dan nilainya menjadi lebih kecil saat pohon diturunkan; setiap orang tua sama dengan atau lebih besar nilainya daripada salah satu dari anak-anak langsungnya. Struktur min-heap adalah di mana nilai minimum adalah root, dan nilainya menjadi lebih besar saat pohon diturunkan; setiap orang tua sama atau lebih kecil nilainya daripada salah satu dari anak-anak langsungnya. Dalam diagram berikut, yang pertama adalah max-heap dan yang kedua adalah min-heap:

Untuk kedua tumpukan, perhatikan bahwa untuk sepasang anak, tidak masalah apakah yang di sebelah kiri adalah nilai yang lebih besar. Baris dalam tingkat di pohon, tidak harus diisi dari minimum ke maksimum, dari kiri; itu juga tidak harus diisi dari maksimum ke minimum, dari kiri.

Mewakili Tumpukan dalam Array

Agar perangkat lunak dapat menggunakan heap dengan mudah, heap harus direpresentasikan dalam array. Max-heap di atas, yang direpresentasikan dalam array adalah:

89,  85,  87,  84,  82,  79, 73,  80,  81,    ,    ,  65,  69

Ini dilakukan dimulai dengan nilai root sebagai nilai pertama untuk array. Nilai terus ditempatkan dengan membaca pohon dari kiri ke kanan, dari atas ke bawah. Jika suatu elemen tidak ada, posisinya dalam array dilewati. Setiap simpul memiliki dua anak. Jika sebuah node berada pada indeks (posisi) n, anak pertamanya dalam array berada pada indeks 2n+1, dan anak berikutnya pada indeks 2n+2. 89 berada pada indeks 0; anak pertamanya, 85 berada pada indeks 2(0)+1=1 sedangkan anak keduanya berada pada indeks 2(0)+2=2. 85 berada pada indeks 1; anak pertamanya, 84, berada pada indeks 2(1)+1=3 sedangkan anak keduanya, 82, berada pada indeks 2(1)+2=4. 79 berada pada indeks 5; anak pertamanya, 65 berada pada indeks 2(5)+1=11 sedangkan anak keduanya berada pada indeks 2(5)+2=12. Rumus diterapkan ke elemen lainnya dalam array.

Array seperti itu, di mana makna elemen dan hubungan antar elemen, tersirat oleh posisi elemen, disebut Struktur Data Implisit.

Struktur data implisit untuk min-heap di atas adalah:

65,  68,  70,  73,  71,  83,  84,    ,    ,  79,  80,   ,    ,  85,  89

Max-heap di atas adalah pohon biner lengkap tetapi bukan pohon biner penuh. Itulah mengapa beberapa lokasi (posisi) kosong dalam array. Untuk pohon biner penuh, tidak ada lokasi yang kosong dalam array.

Sekarang, jika heap adalah pohon yang hampir lengkap, misalnya, jika nilai 82 hilang, maka lariknya akan menjadi:

89,  85,  87,  84,    ,  79, 73,  80,  81,    ,    ,  65,  69

Dalam situasi ini, tiga lokasi kosong. Namun, rumusnya masih berlaku.

Operasi

Struktur data adalah format data (mis.g. pohon), ditambah hubungan di antara nilai-nilai, ditambah operasi (fungsi) yang dilakukan pada nilai-nilai. Untuk heap, hubungan yang berjalan melalui seluruh heap adalah, bahwa induk harus sama atau lebih besar nilainya daripada anak-anak, untuk max-heap; dan orang tua harus sama atau kurang nilainya dari anak-anak, untuk min-heap. Hubungan ini disebut properti heap. Operasi tumpukan dikelompokkan di bawah judul Penciptaan, Dasar, Internal dan Inspeksi. Ringkasan operasi heap berikut:

Ringkasan Operasi Tumpukan

Ada operasi perangkat lunak tertentu yang umum dengan heap, sebagai berikut:

Pembuatan Tumpukan

create_heap: Membuat heap berarti membentuk objek yang mewakili heap. Dalam bahasa C, Anda dapat membuat heap dengan tipe objek struct. Salah satu anggota struct akan menjadi heap array. Anggota lainnya akan menjadi fungsi (operasi) untuk heap. Create_heap berarti membuat heap kosong.

Heapify: Array heap adalah array yang diurutkan sebagian (diurutkan). Heapify artinya, sediakan heap array dari unsorted array - lihat detailnya di bawah.

Gabungkan:  Ini berarti, bentuk tumpukan gabungan dari dua tumpukan berbeda - lihat detailnya di bawah. Kedua heap harus max-heap atau keduanya min-heap. Heap baru sesuai dengan properti heap, sedangkan heap asli dipertahankan (tidak terhapus).

Meld:  Artinya, gabungkan dua heap dengan jenis yang sama untuk membentuk heap baru, pertahankan duplikat - lihat detail di bawah. Heap baru sesuai dengan properti heap, sedangkan heap asli dimusnahkan (dihapus). Perbedaan utama antara penggabungan dan penggabungan adalah, untuk penggabungan, satu pohon cocok sebagai subpohon ke akar pohon lainnya, memungkinkan nilai duplikat di pohon baru, sedangkan untuk penggabungan, pohon tumpukan baru dibentuk, menghapus duplikat. Tidak perlu mempertahankan dua tumpukan asli dengan penggabungan.

Operasi Tumpukan Dasar

find_max (find_min): Temukan nilai maksimum dalam array max-heap dan kembalikan salinannya, atau temukan nilai minimum dalam array min-heap dan kembalikan salinannya.

Sisipkan: Tambahkan elemen baru ke array heap, dan atur ulang array sehingga properti heap diagram dipertahankan.

extract_max (extract_min): Temukan nilai maksimum dalam array max-heap, hapus dan kembalikan; atau temukan nilai minimum dalam larik min-heap, hapus dan kembalikan.

delete_max (delete_min): Cari node root dari max-heap, yang merupakan elemen pertama dari array max-heap, hapus tanpa harus mengembalikannya; atau temukan simpul akar dari min-heap, yang merupakan elemen pertama dari larik min-heap, hapus tanpa harus mengembalikannya;

Ganti: Temukan simpul akar dari salah satu tumpukan, hapus dan ganti dengan yang baru. Tidak masalah apakah root lama dikembalikan.

Operasi Tumpukan Internal

peningkatan_key (penurunan_key): Meningkatkan nilai simpul apa pun untuk tumpukan-maks dan mengatur ulang sehingga properti heap dipertahankan, atau mengurangi nilai simpul apa pun untuk tumpukan-min dan mengatur ulang sehingga properti heap dipertahankan.

Hapus: hapus simpul apa pun, lalu atur ulang, sehingga properti heap dipertahankan untuk max-heap atau min-heap.

shift_up: pindahkan node ke atas dalam max-heap atau min-heap selama diperlukan, atur ulang untuk mempertahankan properti heap.

shift_down: memindahkan node ke bawah dalam max-heap atau min-heap selama diperlukan, mengatur ulang untuk mempertahankan properti heap.

Inspeksi Tumpukan

Ukuran: Ini mengembalikan jumlah kunci (nilai) di heap; itu tidak termasuk lokasi kosong dari susunan tumpukan. Heap dapat direpresentasikan dengan kode, seperti pada diagram, atau dengan array.

kosong: Ini mengembalikan Boolean true jika tidak ada node di heap, atau Boolean false jika heap memiliki setidaknya satu node.

Menyaring dalam Tumpukan

Ada saringan ke atas dan ke bawah:

penyaringan: Ini berarti menukar simpul dengan induknya. Jika properti heap tidak terpenuhi, tukar induk dengan induknya sendiri. Lanjutkan cara ini di jalan sampai properti heap terpenuhi. Prosedurnya mungkin mencapai root.

Saring-Turun: Ini berarti menukar simpul bernilai besar dengan yang lebih kecil dari dua anaknya (atau satu anak untuk tumpukan yang hampir lengkap). Jika properti heap tidak terpenuhi, tukar node yang lebih rendah dengan node yang lebih kecil dari dua anaknya sendiri. Lanjutkan cara ini di jalan sampai properti heap terpenuhi. Prosedurnya mungkin mencapai daun.

menumpuk

Heapify berarti mengurutkan array yang tidak disortir agar properti heap terpenuhi untuk max-heap atau min-heap. Ini berarti mungkin ada beberapa lokasi kosong di array baru. Algoritma dasar untuk heapify max-heap atau min-heap adalah sebagai berikut:

- jika simpul akar lebih ekstrem dari salah satu simpul anaknya, maka tukarkan akar dengan simpul anak yang kurang ekstrem.

- Ulangi langkah ini dengan node anak-anak dalam Skema Traversing Pohon Pra-Pesanan.

Pohon terakhir adalah pohon tumpukan yang memenuhi properti tumpukan. Tumpukan dapat direpresentasikan sebagai diagram pohon atau dalam array. Tumpukan yang dihasilkan adalah pohon yang diurutkan sebagian, i.e. array yang diurutkan sebagian.

Detail Operasi Tumpukan

Bagian artikel ini memberikan rincian operasi heap.

Pembuatan Detail Heap

buat_tumpukan

Lihat di atas!

menumpuk

Lihat di atas

menggabungkan

Jika tumpukan array,

89,  85,  87,  84,  82,  79, 73,  80,  81,    ,    ,  65,  69

dan

89,  85,  84,  73,  79,  80,  83,  65,  68,  70,  71

digabungkan, hasilnya tanpa duplikat mungkin duplicate,

89,  85,  87,  84,  82,  83,  81,  80,  79,    ,    73,  68,  65,  69,  70,  71

Setelah beberapa penyaringan. Perhatikan bahwa pada larik pertama, 82 tidak memiliki anak. Dalam array yang dihasilkan, berada di indeks 4; dan lokasinya pada indeks 2(4)+1=9 dan 2(4)+2=10 kosong. Ini berarti ia juga tidak memiliki anak dalam diagram pohon baru. Dua tumpukan asli tidak boleh dihapus karena informasinya tidak benar-benar ada di tumpukan baru (array baru). Algoritma dasar untuk menggabungkan tumpukan dari jenis yang sama adalah sebagai berikut:

- Bergabunglah dengan satu array ke bagian bawah array lainnya.

- Heapify menghilangkan duplikat, memastikan bahwa node yang tidak memiliki anak di heap asli, masih tidak memiliki anak di heap baru.

berbaur

Algoritma untuk menggabungkan dua heap dengan tipe yang sama (baik dua max- atau dua min-) adalah sebagai berikut:

- Bandingkan dua simpul akar.

- Jadikan akar yang kurang ekstrim dan sisa pohonnya (subtree), anak kedua dari akar ekstrim extreme.

- Ayak anak nyasar dari akar sekarang subpohon ekstrem, ke bawah di subpohon ekstrem.

Tumpukan yang dihasilkan masih sesuai dengan sifat heap, sedangkan heap aslinya dimusnahkan (terhapus). Tumpukan asli dapat dihancurkan karena semua informasi yang mereka miliki masih ada di tumpukan baru.

Operasi Tumpukan Dasar

temukan_maks (temukan_min)

Ini berarti menemukan nilai maksimum dalam array max-heap dan mengembalikan salinan, atau menemukan nilai minimum dalam array min-heap dan mengembalikan salinan. Array heap menurut definisi sudah memenuhi properti heap. Jadi, kembalikan saja salinan elemen pertama dari array.

memasukkan

Ini berarti menambahkan elemen baru ke array heap, dan mengatur ulang array sehingga properti heap diagram dipertahankan (puas). Algoritma untuk melakukan ini untuk kedua jenis tumpukan adalah sebagai berikut:

- Asumsikan pohon biner penuh. Ini berarti array harus diisi di akhir dengan lokasi kosong jika perlu. Jumlah total node dari tumpukan penuh adalah 1, atau 3 atau 7 atau 15 atau 31, dll.; terus gandakan dan tambahkan 1.

- Letakkan simpul di lokasi kosong yang paling sesuai berdasarkan besarnya, menjelang akhir tumpukan (menuju akhir susunan tumpukan). Jika tidak ada lokasi yang kosong, maka mulailah baris baru dari kiri bawah.

- Saring jika perlu, sampai properti heap terpenuhi.

ekstrak_maks (ekstrak_min)

Temukan nilai maksimum dalam array max-heap, hapus dan kembalikan; atau temukan nilai minimum dalam larik min-heap, hapus dan kembalikan. Algoritma untuk extract_max (extract_min) adalah sebagai berikut:

- Hapus simpul akar.

- Ambil (hapus) node paling kanan bawah (node ​​terakhir dalam array) dan tempatkan di root.

- Saring seperlunya, sampai properti heap terpenuhi.

delete_max (hapus_min)

Temukan simpul root dari max-heap, yang merupakan elemen pertama dari array max-heap, hapus tanpa harus mengembalikannya; atau cari node root dari min-heap, yang merupakan elemen pertama dari array min-heap, hapus tanpa harus mengembalikannya. Algoritma untuk menghapus node root adalah sebagai berikut:

- Hapus simpul akar.

- Ambil (hapus) node paling kanan bawah (node ​​terakhir dalam array) dan tempatkan di root.

- Saring seperlunya, sampai properti heap terpenuhi.

menggantikan

Temukan simpul akar dari salah satu tumpukan, hapus dan ganti dengan yang baru. Tidak masalah apakah root lama dikembalikan. Saring jika sesuai, sampai properti heap terpenuhi.

Operasi Tumpukan Internal

tambah_kunci (kurangi_kunci)

Meningkatkan nilai setiap node untuk max-heap dan mengatur ulang sehingga properti heap dipertahankan, atau menurunkan nilai setiap node untuk min-heap dan mengatur ulang sehingga properti heap dipertahankan. Ayak ke atas atau ke bawah yang sesuai, sampai properti heap terpenuhi.

menghapus

Hapus node yang diinginkan, lalu atur ulang, sehingga properti heap dipertahankan untuk max-heap atau min-heap. Algoritma untuk menghapus node adalah sebagai berikut:

- Hapus simpul yang menarik.

- Ambil (hapus) simpul paling kanan bawah (simpul terakhir dalam array) dan tempatkan pada indeks simpul yang dihapus. Jika node yang dihapus berada di baris terakhir, maka ini mungkin tidak diperlukan.

- Ayak ke atas atau ke bawah yang sesuai, sampai properti heap terpenuhi.

shift_up

Pindahkan node ke atas dalam max-heap atau min-heap selama diperlukan, atur ulang untuk mempertahankan properti heap - saring.

shift_down

Pindahkan node ke bawah dalam max-heap atau min-heap selama diperlukan, atur ulang untuk mempertahankan properti heap - saring ke bawah.

Inspeksi Tumpukan

ukuran

Lihat di atas!

kosong

Lihat di atas!

Kelas Tumpukan Lainnya

Tumpukan yang dijelaskan dalam artikel ini dapat dianggap sebagai tumpukan utama (umum). Ada kelas tumpukan lain. Namun, dua yang harus Anda ketahui di luar ini adalah Tumpukan Biner dan Tumpukan d-ary.

Tumpukan Biner

Tumpukan biner mirip dengan tumpukan utama ini, tetapi dengan lebih banyak batasan. Secara khusus, tumpukan biner harus berupa pohon yang lengkap. Jangan bingung antara pohon lengkap dan pohon penuh.

tumpukan d-ary

Tumpukan biner adalah tumpukan 2-ary. Tumpukan di mana setiap simpul memiliki 3 anak adalah tumpukan 3-ary. Tumpukan di mana setiap simpul memiliki 4 anak adalah tumpukan 4-ary, dan seterusnya. Tumpukan d-ary memiliki kendala lain.

Kesimpulan

Heap adalah pohon biner lengkap atau hampir lengkap, yang memenuhi properti heap. Properti heap memiliki 2 alternatif: untuk max-heap, induk harus sama atau lebih besar nilainya daripada anak langsung; untuk min-heap, orang tua harus sama atau kurang nilainya dari anak-anak langsung. Tumpukan dapat direpresentasikan sebagai pohon atau dalam array. Ketika direpresentasikan dalam sebuah array, node root adalah node pertama dari array; dan jika sebuah node berada pada indeks n, anak pertamanya dalam array berada pada indeks 2n+1 dan anak berikutnya pada indeks 2n+2. Heap memiliki operasi tertentu yang dilakukan pada array.

Chrys

Tambahkan gerakan Mouse ke Windows 10 menggunakan alat gratis ini
Dalam beberapa tahun terakhir, komputer dan sistem operasi telah berkembang pesat. Ada saat ketika pengguna harus menggunakan perintah untuk menavigas...
Kontrol & kelola gerakan mouse di antara beberapa monitor di Windows 10
Manajer Mouse Tampilan Ganda memungkinkan Anda mengontrol & mengonfigurasi gerakan mouse di antara beberapa monitor, dengan memperlambat gerakannya di...
WinMouse memungkinkan Anda menyesuaikan & meningkatkan gerakan penunjuk tetikus di PC Windows
Jika Anda ingin meningkatkan fungsi default penunjuk tetikus Anda, gunakan freeware WinMouse. Ini menambahkan lebih banyak fitur untuk membantu Anda m...