BAB I PENDAHULUAN 1.1. Latar Belakang Masalah Queue/antrian

advertisement
BAB I
PENDAHULUAN
1.1. Latar Belakang Masalah
Queue/antrian adalah ordered list dengan penyisipan di satu ujung, sedang
penghapusan di ujung lain. Ujung penyisipan biasa disebut rear/tail, sedang ujung
penghapusan disebut front/head. Fenomena yang muncul adalah elemen yang lebih
dulu disisipkan akan juga lebih dulu diambil. Queue berdisiplin FIFO (First In,
First Out). Queue merupakan kasus khusus ordered list. Dengan karakteristik
terbatas itu maka kita dapat melakukan optimasi representasi ADT Queue untuk
memperoleh kerja paling optimal.
Karakteristik Queue memang terbatas, tetapi Queue merupakan kakas dasar
penyelesaian masalah-masalah besar, seperti simulasi fenomena antrian di dunia
nyata, serta fenomena antrian di pengolahan data. Beberapa fenomena dunia nyata
berupa antrian diantaranya : antrian pembelian tiket di depan loket untuk bis,
kereta api, bioskop; antrian mobil di depan gerbang jalan tol; antrian kendaraan di
jalanan umum dll.
Representasi Queue dapat dilakukan dengan empat cara, yaitu:
1. Representasi Sekuen
2. Representasi Sekuen linear
3. Representasi Sekuen Melingkar
4. Representasi Dinamis
5. Pembahasan Representasi sekuen menggunakan array pada setiap
pengoprasiannya, sedangkan Representasi dinamis
biasanya menempati
memori berupa Record keduanya dideklarasikan menggunakan bahasa
pemograman pascal.
1.2. Judul Makalah
Laporan makalah ini berjudul “Queue (Antrian)”, laporan ini diharapkan
dapat menjadi literatur bagi proses belajar mengajar dalam perkuliahan, terutama
mata kuliah Struktur Data khususnya bagi mahasiswa/i secara cepat dan mudah
dalam memahami konsep antrian yang sesungguhnya.
BAB II
PEMBAHASAN I
2.1. DESKRIPSI QUEUE
Queue/antrian adalah ordered list dengan penyisipan di satu ujung, sedang
penghapusan di ujung lain. Ujung penyisipan biasa disebut rear/tail, sedang ujung
penghapus disebut front/head. Fenomena yang muncul adalah elemen yang lebih
dulu disisipkan akan juga lebih dulu diambil. Queue berdisiplin FIFO (First In,
First Out). Queue merupakan kasus khusus ordered list. Dengan karakteristik
terbatas itu maka kita dapat melakukan optimasi representasi ADT Queue untuk
memperoleh kerja paling optimal.
Misalnya Queue Q= (a1,a2,a3…,an), maka
1. Elemen a1 adalah elemen paling depan
2. Elemen ai adalah diatas elemen ai-1, di mana 1<i<n.
3. Elemen an adalah elemen paling belakang
Head (front) menunjuk ke awal antrian Q (elemen paling depan), sedangkan
tail (rear) menunjuk akhir antrian Q (elemen paling belakang). Disiplin FIFO pada
Queue berimplikasi jika elemen A, B, C, D, E dimasukkan ke Queue, maka
penghapusan/pengambilan elemen akan terjadi dengan urutan A, B, C, D, E.
2.2. Karakteristik Queue
Karakteristik terpenting antrian sebagai berikut :
1. Elemen antrian yaitu item-item data yang terdapat di elemen antrian.
2. Head/front (elemen terdepan dari antrian ).
3. Tail/rear (elemen terakhir dari antrian ).
4. Jumlah elemen pada antrian (count).
5. Status/kondisi antrian.
Kondisi antrian yang menjadi perhatian adalah :

Penuh
Bila elemen di antrian mencapai kapasitas maksimum antrian. Pada
kondisi ini, tidak mungkin dilakukan penambahan ke antrian. Penambahan elemen
menyebabkan kondisi kesalahan Overflow.

Kosong
Bila tidak ada elemen di antrian. Pada kondisi ini, tidak mungkin dilakukan
pengambilan elemen dari antrian. Pengambilan elemen menyebabkan kondisi
kesalahan Underflow.
2.3. Operasi-Operasi Pokok di Queue
Operasi-operasi pokok antrian sebagai berikut :
1. CreateQueue (Q), atau constructor menciptakan antrian kosong Q.
2. AddQueue (Q, X) memasukkan elemen X sebagai elemen akhir di Q.
3. RemoveQueue (Q, X)atau mengambil elemen depan di antrian Q ke
elemenX.
Operasi-operasi pengaksesan tambahan yang dapat dilakukan adalah :
1. HeadQueue (Q), atau Front (Q, X) mengirim elemen terdepan tanpa
menghapus.
2. TailQueue (Q), mengirim elemen tanpa menghapusnya.
Operasi-operasi Query tambahan yang dapat dilakukan adalah :
1. isEmptyQueue (Q), mengirim apakah antrian Q adalah kosong.
2. isFullQueue (Q), mengirim apakah antrian Q adalah penuh bila kapasitas
antrian Q didefinisikan.
3. isOverflowQueue (Q), mengirim apakah antrian Q telah mengalami
overflow.
4. isUnderflowQueue (Q), mengirim apakah antrian Q mengalamiunderflow.
Operasi-operasi terhadap seluruh antrian Q antara lain adalah :
1. sizeQueue (Q), mengetahui jumlah elemen di antrian Q.
2. isEqualQueue (Q1, Q2), mengirim apakah antrian Q1 dan Q2 sama isinya.
Jumlah operasi pokok Queue tidak banyak. Dengan demikian, sangat
sederhana untuk menyatakan apa pun mengenai implementasinya.
2.4. Pengunaan Queue
Meski Queue sangat sederhana, namun Queue merupakan kakas dasar
penyelesaian masalah-masalah besar. penggunaan Queue yang utama adalah untuk
simulasi fenomena antrian di dunia nyata, serta fenomena antrian di pengolahan
data.
Penggunaan Queue dapat dicontohkan seperti dibawah ini :
1. Simulasi antrian di dunia nyata, antara lain :

Antrian pembelian tiket di depan loket untuk bis, kereta api, bioskop.

Antrian mobil di depan gerbang jalan tol.

Antrian kendaraan di jalanan umum.
2. System produksi

Barisan bahan atau komponen yang akan diproses suatu mesin.

Barisan bahan atau komponen yang akan diproses suatu manusia
Untuk lebih jelasnya,dbawah ini ada contoh dalam bentuk coding C++
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
void main()
{
int cek=0, data[8], x, hapus;
char pil;
do {
clrscr();
cout<<”
Ujian Praktikum Struktur Data Queue”<<endl;
cout<<”
cout<<”
ISI NAMA ANDA”<<endl;
ISI NAMA KAMPUS ANDA”<<endl;
cout<<endl;
printf(“d. Masukan Data Antrian\n”);
printf(“e. Hapus Data Antrian\n”);
printf(“n. Lihat Data Antrian\n”);
printf(“y. Exit Program\n”);
cout<<endl;
printf(“Ketikan Huruf Dari Salah Satu Pilihan Diatas…
pil=getche();
cout<<endl;
if(pil!=’d’ && pil !=’e’ && pil !=’n’ && pil!=’y’ )
printf(“\n\nSalah Ketik, Ulangi Lagi…\n”);
else
{
if(pil==’d')
//PUSH
{
if(cek==8)
printf(“\nAntrian Penuh\n”);
else
{
printf(“\nMasukkan angka–>”);scanf(“%i”,&x);
data[cek]=x;
“);
cek++;
}}
else
{
if(pil==’e')
//POP
{
if(cek==0)
printf(“\nMaaf Tidak Antrian Untuk Dihapus \n\n”);
else
{
hapus=data[0];
for(int v=0;v<cek;v++)
data[v]=data[v+1];
data[cek-1]=NULL;
cek–;
cout<<endl;
printf(“Yakin Anda Ingin Data Ini DiHapus ???
“);
cout<<endl;
printf(“\nData dgn nilai=%i akan terhapus. [Tekan
Enter]“,hapus);
}
getch();
}
else
{
if(pil==’n')
//Mengecek Data
{
if(cek==0)
printf(“\nMaaf Tidak Ada Antrian Untuk Ditampilkan.\n\n”);
else
{
printf(“\n”);
for(int z=0;z<cek;z++)
{
printf(” { “);
printf(“%i”,data[z]);
printf(” } “);
}
}
getch();
}
}
}
}
}while(pil!=’y');
cout<<endl;
cout<<endl;
printf(“Yakin anda ingin keluar…??? {{{Tekan Enter Cak}}} “);
pil=getche();
}m
BAB II
PEMBAHASAN II
3.1. PENGERTIAN HEAP
Pengertian Heap Adalah struktur data yang berbentuk pohon yang
memenuhi sifat-sifat heap yaitu jika B adalah anak dari A, maka nilai yang
tersimpan di simpul A lebih besar atau sama dengan nilai yang tersimpan di simpul
B. Hal ini mengakibatkan elemen dengan nilai terbesar selalu berada pada posisi
akar, dan heap ini disebut max heap. Bila perbandingannya dibalikkan yaitu
elemen terkecilnya selalu berada di simpul akar, heap ini disebut adalah min heap.
Karena itulah, heap biasa dipakai untuk mengimplementasikan priority
queue.
3.2.
Operasi-operasi yang digunakan untuk heap adalah :
1.
Delete-max atau delete-min: menghapus simpul akar dari sebuah max
atau min heap.
2.
Increase-key atau decrease-key: mengubah nilai yang tersimpan di
suatu simpul.
3.
Insert: menambahkan sebuah nilai ke dalam heap.
4.
Merge: menggabungkan dua heap untuk membentuk sebuah heap baru
yang berisi semua elemen pembentuk heap tersebut.
3.3.
Jenis-jenis Heap
1.
Binary heap
Adalah heap yang dibuat dengan menggunakan pohon biner.
2.
Binomial heap
Adalah heap yang dibuat dengan menggunakan pohon binomial.
Pohon binomial bila didefinisikan secara rekursif adalah:
1.
Sebuah pohon binomial dengan tinggi 0 adalah simpul tunggal
2.
Sebuah pohon binomial dengan tinggi k mempunyai sebuah simpul
akar yang anak-anaknya adalah akar-akar pohon pohon binomial.
3.
Fibonacci Heap
Fibonacci heap adalah kumpulan pohon yang membentuk minimum heap.
Pohon dalam struktur data ini tidak memiliki bentuk yang tertentu dan pada
kasus yang ekstrim heap ini memiliki semua elemen dalam pohon yang berbeda
atau sebuah pohon tunggal dengan tinggi Keunggulan dari Fibonacci heap adalah
ketika menggabungkan heap cukup dengan menggabungkan dua list pohon.
3.4.
Heap Sort
Heap Sort adalah algoritma pengurutan data berdasarkan perbandingan, dan
termasuk golongan selection sort. Walaupun lebih lambat daripada quick sort pada
kebanyakan mesin , tetapi heap sort mempunyai keunggulan yaitu kompleksitas
algoritma pada kasus terburuk adalah n log n.
Algoritma pengurutan heap sort ini mengurutkan isi suatu larik masukan
dengan memandang larik masukan sebagai suatu Complete Binary Tree (CBT).
Setelah itu Complete Binary Tree (CBT) ini dapat dikonversi menjadi suatu
heap tree. Setelah itu Complete Binary Tree (CBT) diubah menjadi suatu priority
queue.
Algoritma pengurutan heap dimulai dari membangun sebuah heap dari
kumpulan data yang ingin diurutkan, dan kemudian menghapus data yang
mempunyai nilai tertinggi dan menempatkan dalam akhir dari larik yang telah
terurut. Setelah memindahkan data dengan nilai terbesar, proses berikutnya adalah
membangun ulang heap dan memindahkan nilai terbesar pada heap tersebut dan
menempatkannya dalam tempat terakhir pada larik terurut yang belum diisi data
lain.
Proses ini berulang sampai tidak ada lagi data yang tersisa dalam heap dan
larik yang terurut penuh. Dalam implementasinya kita membutuhkan dua larik –
satu untuk menyimpan heap dan satu lagi untuk menyimpan data yang sudah
terurut. Tetapi untuk optimasi memori, kita dapat menggunakan hanya satu larik
saja. Yaitu dengan cara menukar isi akar dengan elemen terakhir dalam heap tree.
Jika memori tidak menjadi masalah maka dapat tetap menggunakan dua
larik yaitu larik masukan dan larik hasil.
Heap Sort memasukkan data masukan ke dalam struktur data heap. Nilai
terbesar (dalam max-heap) atau nilai terkecil (dalam min-heap) diambil satu per
satu sampai habis, nilai tersebut diambil dalam urutan yang terurut.
Algoritma untuk heap sort :
function heapSort(a, count) is
input: sebuah larik tidak terurut a dengan panjang length
(pertama letakkan a dalam max-heap) heapify(a, count)
end := count -1
while end > 0 do
remove ( )
reheapify ( )
end := end – 1
3.5.
Algoritma Heapify
Algoritma Heapify adalah membangun sebuah heap dari bawah ke atas,
secara berturut-turut berubah ke bawah untuk membangun heap. Permasalahan
pertama yang harus kita pertimbangkan dalam melakukan operasi heapify adalah
dari bagian mana kita harus memulai.
Bila kita mencoba operasi heapify dari akar maka akan terjadi operasi runutnaik seperti algoritma bubble sort yang akan menyebabkan kompleksitas waktu
yang ada akan berlipat ganda. Sebuah versi lain adalah membangun heap secara
atas-bawah dan berganti-ganti ke atas untuk secara konseptual lebih sederhana
untuk ditangani. Versi ini mulai dengan sebuah heap kosong dan secara berturutturut memasukkan data. Versi lainnya lagi adalah dengan membentuk pohon heappohon heap mulai dari subtree-subtree yang paling bawah.
Jika subtree-subtree suatu simpul sudah membentuk heap maka pohon dari
simpul tersebut mudah dijadikan pohon heap dengan mengalirkannya ke bawah.
Setelah diuji, maka ide yang paling efisien adalah versi yang terakhir, yang
kompleksitas algoritmanya pada kasus terburuk adalah O(n), sedangkan versi
membentuk heap tree-heap tree dari atas ke bawah kompleksitas nya O(n log n)
Jadi, algoritma utama heapify adalah melakukan iterasi mulai dari internal simpul
paling kanan bawah (pada representasi larik, adalah elemen yang berada di indeks
paling besar) hingga akar, kemudian kearah kiri dan naik ke level di atasnya, dan
seterusnya hingga mencapai akar (sebagai larik [0..N-1]). Oleh karena itu, iterasi
dilakukan mulai dari j= N/2 dan berkurang satu-satu hingga mencapai j=0. Pada
simpul internal tersebut, pemeriksaan hanya dilakukan pada simpul anaknya
langsung (tidak pada level-level lain di bawahnya). Pada saat iterasi berada di level
yang lebih tinggi, subtree subtree selalu sudah membentuk heap. Jadi, kasus akan
mengalirkan simpul tersebut kearah bawah. Dengan demikian, heapify versi
ini melakukan sebanyak N/2 kali iterasi, dan pada kasus yang paling buruk akan
melakukan iterasi sebanyak log (N) kali.
3.6.
Algoritma Remove
Algoritma remove ini menukar akar (yang berisi nilai maksimum) dari heap
dengan elemen terakhir. Secara logika, simpul yang berada paling kanan bawah
dipindahkan ke akar untuk menggantikan simpul akar yang akan diambil.
3.7.
Algoritma Reheapify
Algoritma reheapify ini melakukan pembuatan ulang heap dari atas ke
bawah seperti halnya iterasi terakhir dari algoritma metoda heapify. Perbedaan
antara metode heapify dengan metode reheapify ada pada iterasi yang dilakukan
oleh kedua algoritma tersebut. Algoritma metode reheapify ini hanya melakukan
iterasi terakhir dari algoritma heapify. Hal ini disebabkan baik subtree kiri maupun
subtree kanannya sudah merupakan heap, sehingga tidak perlu dilakukan
iterasi lengkap seperti algoritma heapify. Dan setelah reheapify maka simpul yang
akan diiterasikan berikutnya akan berkurang satu. Representasi Alokasi Dinamis
3.8.
Algoritma Pengurutan Heap Sort
Karakteristik dari algoritma pengurutan heap sort adalah bahwa dalam
implementasinya heap sort menggunakan heap tree agar dapat diselesaikan secara
heap sort. Oleh karena itu, untuk mengimplementasikan algoritma pengurutan heap
sort dalam suatu program aplikasi, dibutuhkan adanya alokasi dinamis dengan
menggunakan struktur data tree (pohon). Prinsip-prinsip dasar mengenai struktur
data tree yang digunakan untuk merealisasikan heap tree adalah sebagai berikut:
a.
Simpul-simpul saling berhubungan dengan menggunakan pointer.
Pada struktur data tree ini digunakan minimal dua buah pointer pada setiap
simpul,masing-masing untuk menunjuk ke cabang kiri dan cabang kanan dari tree
tersebut. Misalnya dalam bahasa C, struktur data tree dideklarasikan sebagai
berikut:
Class BinaryTreeSimpul {
keyType key;
infoType info;
BinaryTreeSimpul Left,
Right; // metoda-metoda
}
b. Left dan Right berharga NULL apabila tidak ada lagi cabang pada arah
yang bersangkutan.
c. Struktur dari binary tree, termasuk hubungan-hubungan antar-simpul,
secara eksplisit direpresentasikan oleh Left dan Right. Apabila diperlukan
penelusuran naik (backtrack), maka hal tersebut dapat dilakukan dengan
penelusuran ulang dari root, penggunaan algoritma-algoritma yang bersifat
rekursif, atau penggunaan stack.
d. Alternatif lain adalah dengan menambahkan adanya pointer ke parent.
Namun hal ini akan mengakibatkan bertambahnya jumlah tahapan pada
proses-proses penambahan/penghapusan
Download
Study collections