Anda di halaman 1dari 10

02/05/2011

PrioQ/rmb 3/11/'06

Pengertian Priority Queue


• Suatu kontainer yang berisi beberapa item
dimana setiap item memiliki prioritas.
• Kemungkinan setiap item mempunyai waktu
PI1043 Sturktur Data
tenggat yang berbeda-beda.
Priority Queue • Item dengan prioritas tertinggi merupakan item
yang akan diproses atau dilayani selanjutnya.

3 4

PrioQ/rmb 3/11/'06 PrioQ/rmb 3/11/'06

Sorted Table
• Seringkali, penunggu dalam antrian harus diatur • Pengambilan elemen untuk dilayani selalu dari
menurut prioritas. HEAD
• Antrian disimpan menurut prioritas. • Penambahan elemen dilakukan sesuai prioritas.
• Aturan priority queue bukan lagi FIFO murni. Elemen dalam antrian selalu dalam prioritas,
• Implementasi priority queue dalam sorted dengan prioritas lebih tinggi untuk dilayani
table. selalu lebih “dekat” ke HEAD

1
02/05/2011

Representasi Penyimpanan Antrian PrioQ/rmb 3/11/'06 Alternatif I


• Tabel dengan hanya representasi TAIL
adalah indeks elemen terakhir. HEAD selalu
diset =1 jika queue tidak kosong. Jika queue
kosong, maka HEAD=0. Berikut ini ilustrasi
queue tidak kosong dengan 5 elemen:
• Queue lebih tepat direpresentasikan sebagai
tabel.

• Terdapat tiga alternatif penyimpanan antrian

3/11/'06 PrioQ/rmb

Alternatif I (cont’d) PrioQ/rmb 3/11/'06

• Ilustrasi queue kosong


Alternatif I (cont’d)
• Algoritma paling sederhana dan “naif” untuk
penghapusan elemen jika queue tidak kosong 
• Algoritma paling sederhana untuk ambil nilai elemen HEAD, geser semua elemen
penambahan elemen ulai dari HEAD+1 s/d TAIL(jika ada), kemudian
▫ Jika masih ada tempat adalah dengan TAIL “mundur”.
“memajukan” TAIL. • Kasus khusus untuk queue dengan keadaan awal
• Kasus khusus untuk queue kosong karena berelemen 1, yaitu menyesuaikan HEAD & TAIL
HEAD harus diset nilainya menjadi 1. dengan DEFINISI. Algoritma ini mencerminkan
pergeseran orang yang sedang mengantri di
3/11/'06 PrioQ/rmb

7 dunia nyata tapi tidak EFISIEN.

2
02/05/2011

PrioQ/rmb 3/11/'06 Alternatif II (cont’d)


• Ilustrasi queue tidak kosong, dengan 5
Alternatif II elemen, kemungkinan pertama HEAD
sedang di posisi awal:

• Tabel dengan representasi HEAD & TAIL.


HEAD bergerak ketika sebuah elemen dihapus
jika queue tidak kosong. Jika queue kosong
maka HEAD=0.

3/11/'06 PrioQ/rmb

10

Alternatif II (cont’d) Alternatif II (cont’d)


• Ilustrasi queue tidak kosong, dengan 5 • Ilustrasi queue kosong
elemen, kemungkinan pertama HEAD tidak
berada di posisi awal. Hal ini terjadi akibat
algoritma penghapusan yang dilakukan
• Algoritma untuk penambahan elemen =
alternatif I: jika masih ada tempat adalah
dengan memajukan TAIL. Kasus khusus
untuk queue kosong karena HEAD harus
diset nilainya menjadi 1. Algoritma =
alternatif I
3/11/'06 PrioQ/rmb 3/11/'06 PrioQ/rmb

11 12

3
02/05/2011

13

PrioQ/rmb 3/11/'06 Alternatif II (cont’d)


• Namun suatu saat terjadi keadaan queue
Alternatif II (cont’d) penuh tetapi “semu” sebagai berikut:
• Algoritma untuk penghapusan elemen jika
queue tidak kosong: ambil nilai elemen HEAD,
kemudian HEAD maju. Kasus khusus untuk
queue dengan keadaan awal berelemen 1, yaitu
menyesuaikan HEAD & TAIL dengan DEFINISI. • Jika keadaan ini terjadi, haruslah dilakukan
• Algoritma ini tidak mencerminkan pergeseran aksi menggeser elemen untuk menciptakan
orang yang sedang mengantri di dunia nyata, ruangan kosong. Pergeseran dilakukan jika
tapi efisien. dan hanya jika
3/11/'06 PrioQ/rmb

14

15

PrioQ/rmb 3/11/'06 Alternatif III (cont’d)


• Ilustrasi queue tidak kosong dengan 5
Alternatif III elemen dan HEAD berada di posisi awal:
• Tabel dengan representasi HEAD & TAIL
“berputar” mengelilingi indeks tabel dari awal
sampai akhir, kemudian kembali ke awal.
• Jika queue kosong maka HEAD=0. Representasi
memungkinkan tidak perlu lagi ada pergeseran
yang harus dilakukan seperti pada alternatif II
pada saat penambahan elemen

3/11/'06 PrioQ/rmb

16

4
02/05/2011

Alternatif III (cont’d) Alternatif III (cont’d)


• Ilustrasi queue tidak kosong dengan 5 • Ilustrasi queue tidak kosong dengan 5
elemen dan HEAD tidak berada di posisi elemen, HEAD tidak berada di posisi awal,
awal, tetapi “<” atau “sebelum” TAIL. tetapi “>” atau “sesudah” TAIL.

3/11/'06 PrioQ/rmb 3/11/'06 PrioQ/rmb

17 18

19 20

PrioQ/rmb 3/11/'06 PrioQ/rmb 3/11/'06

Alternatif III (cont’d) Alternatif III (cont’d)


• Algoritma untuk penambahan elemen • Algoritma penghapusan elemen
▫ Jika masih ada tempat adalah dengan memajukan ▫ Jika queue tidak kosong  ambil nilai elemen HEAD,
TAIL. kemudian HEAD maju.
▫ Jika TAIL sudah mencapai IdxMax maka suksesor dari • Penentuan suksesor dari indeks yang sudah
IdxMax adalah 1 sehingga TAIL yang baru=1. diubah/”maju” dibuat seperti algoritma
▫ Jika TAIL belum mencapai IdxMax maka algoritma penambahan elemen.
penambahan elemen = altern II. ▫ Jika HEAD mencapai IdxMax, maka suksesor dari
HEAD =1
• Kasus khusus untuk queue kosong karena HEAD
• Kasus khusus untuk queue dengan keadaan awal
harus diset nilainya menjadi 1. berelemen 1, yaitu menyesuaikan HEAD & TAIL
dengan DEFINISI.

5
02/05/2011

21 22
Representasi Penyimpanan Priority
PrioQ/rmb 3/11/'06 PrioQ/rmb 3/11/'06

Queue
Alternatif III (cont’d)
Tempat penyimpanan antrian dapat diadaptasi
dari salah satu alternatif. Penomoran prioritas
Algoritma ini EFISIEN karena tidak perlu dapat ditentukan, misal:
pergeseran dan seringkali strategi pemakaian • Prioritas bernilai 0 s/d PrioMax, dengan 0 untuk
tabel semacam ini disebut sebagai “circular prioritas paling tinggi (ascending)
buffer”, dimana tabel penyimpan elemen • Prioritas bernilai 0 s/d PrioMax, dengan 0 untuk
dianggap sebagai “buffer” prioritas paling rendah (descending)

23 24

PrioQ/rmb 3/11/'06 PrioQ/rmb 3/11/'06

ADT Priority Queue (PQ)


• Contoh keadaan queue dengan prioritas 0 s/d 5, • Representasi fisik:
tersusun ascending ▫ Tabel kontigu
• Ilustrasi queue tidak kosong, dengan 5 elemen, ▫ Berkait pointer
dengan HEAD tidak berada di posisi awal, tetapi • Primitif-primitif ADT PQ yang didefinisikan:
masih “lebih kecil” atau “sebelum” TAIL. ▫ Menentukan apakah suatu PQ kosong atau tidak
Angka(1,0) berarti nilai informasi yang disimpan (IsEmpty)
adalah 1 dengan prioritas 0. ▫ Menentukan apakah suatu PQ telah penuh atau belum
(IsFull)
▫ Mengirimkan banyaknya elemen PQ (NbElmt)
▫ Menginisialisasi sebuah PQ kosong (CreateEmpty)

6
02/05/2011

25 26

PrioQ/rmb 3/11/'06 PrioQ/rmb 3/11/'06

Primitif PQ (cont’d) Representasi Kontigu


/*file : prioque.h*/
▫ Mengembalikan semua memori PQ, PQ kosong #ifndef prioque_h
(dealokasi) #define prioque_h
▫ Menambahkan elemen X pada PQ dengan aturan #include “boolean.h”
#include <stdlib.h>
PQ (add) #define Nil 0
▫ Menghapus elemen X pada PQ dengan aturan #define maxprio 5
/*definisi elemen & address*/
FIFO (del) typedef struct { int info;
int prio;
}infotype;
typedef int address; /*indeks tabel*/
typedef struct { infotype *T; /*tabel elemen*/
address HEAD;/*alamat penghapusan*/
address TAIL;/*alamat penambahan*/
int MaxEl;/*max elemen PQ*/

27 28

PrioQ/rmb 3/11/'06 PrioQ/rmb 3/11/'06

Representasi Kontigu (cont’d)


/*jika PQ adalah prioq, maka akses elemen: */ int NbElmt(PrioQ);
#define head(pq) (pq).head /* mengirimkan banyaknya elemen prioq. Mengirimkan 0
#define tail(pq) (pq).tail jika kosong */
#define infohead(pq) (pq).T[(pq).head].info void CreateEmpty(PrioQ*,int);
#define infotail(pq) (pq).T[(pq).tail].info /* I.S. sembarang */
#define MaxEl(pq) (pq).MaxEl /* F.S. sebuah pq kosong terbentuk dan salah satu
kondisi sbb: */
/*prototype*/ /* jika alokasi berhasil, tabel memori dialokasi
boolean IsEmpty(PrioQ); berukuran Max */
/* mengirimkan true jika prioq kosong */ /* atau: jika alokasi gagal, pq kosong dg max
elemen=0 */
boolean IsFull(PrioQ);
/* proses: melakukan alokasi, membuat sebuah pq
/* mengirimkan true jika tabel penampung prioq sudah
kosong */
penuh */

7
02/05/2011

29 30

PrioQ/rmb 3/11/'06 PrioQ/rmb 3/11/'06

/* destruktor */ /*I.S. pq mungkin kosong, tabel penampung elemen pq


void Dealokasi(PrioQ*); tidak penuh*/
/* proses: mengembalikan memori pq */ /*F.S. elemen pq bertambah 1 sesuai aturan prioq dg
/* I.S. pq pernah dialokasi */ prio menurun*/
/* F.S. pq menjadi tidak terdefinisi lagi. MaxEl(pq)
diset 0 */ void Del(PrioQ*,infotype*);
/* proses: menghapus X pada pq dari head(pq) */
/*** primitif Add/Delete ***/ /* I.S. pq tidak mungkin kosong */
void Add(PrioQ*,infotype); /* F.S. X=nilai elemen head pada I.S. jika
/* proses: menambahkan X pada pq shg elemen tetap head(pq)=MaxEl+1 */
terurut menaik menurut Prio(P). Tabel penyimpan /* head(pq) diset=1; Q mungkin menjadi kosong*/
elemen dipakai secara sirkuler */
/* elemen berikut setelah elemen terakhir adalah #endif
elemen dg indeks 1 */

31 32

PrioQ/rmb 3/11/'06 PrioQ/rmb 3/11/'06

Representasi List Berkait


/* File: Lpqueue.h */ typedef struct t_ElmtQ *address;
/* deklarasi PrioQ, diimplementasi dg list berkait typedef struct t_ElmtQ {
*/ infotype info;
#ifndef Lpqueue_h address next;
#define Lpqueue_h }ElmtPQ;
#include “boolean.h” typedef struct {
#include <stdlib.h> address head;
#define Nil NULL address tail;
}Pqueue;
/* definisi elemen & address */
typedef struct { int info; /*jika Q adalah Pqueue maka akses elemen: */
int prio; #define head(Q) (Q).head
}infotype; #define tail(Q) (Q).tail

8
02/05/2011

33 34

PrioQ/rmb 3/11/'06 PrioQ/rmb 3/11/'06

/* Jika P adalah address */ int NbElmt(PrioQ);


#define info(P) ((P)->info).info /* mengirimkan banyaknya elemen prioq. Mengirimkan 0
#define prio(P) ((P)->info).prio jika kosong */
#define next(P) (P)->next void CreateEmpty(PrioQ*);
/* I.S. sembarang */
/*prototype*/ /* F.S. sebuah pq kosong terbentuk */
boolean IsEmpty(PrioQ); /* Proses. Membuat pq kosong */
/* mengirimkan true jika prioq kosong */
boolean IsFull(PrioQ); /* destruktor */
/* mengirimkan true jika tabel penampung prioq sudah void Dealokasi(PrioQ*);
penuh */ /* proses: mengembalikan memori pq */
/* I.S. pq pernah dialokasi */
/* F.S. pq menjadi tidak terdefinisi lagi.*/

35 36

PrioQ/rmb 3/11/'06 PrioQ/rmb 3/11/'06

/*** primitif Add/Delete ***/


void Add(PrioQ*,infotype); void Del(PrioQ*,infotype*);
/* proses: menambahkan X pada pq shg elemen tetap /* proses: menghapus X pada pq dari head(pq) */
terurut menaik menurut Prio(P). Tabel penyimpan /* I.S. pq tidak mungkin kosong */
elemen dipakai secara sirkuler */ /* F.S. X=nilai elemen head pada I.S. jika
/* elemen berikut setelah elemen terakhir adalah head(pq)=MaxEl+1 */
elemen dg indeks 1 */ /* head(pq) diset=1; Q mungkin menjadi kosong*/
/*I.S. pq mungkin kosong, tabel penampung elemen pq
tidak penuh*/ #endif
/*F.S. elemen pq bertambah 1 sesuai aturan prioq dg
prio menurun*/

9
02/05/2011

37

PrioQ/rmb 3/11/'06

References
• Liem, Inggriani. “Diktat Struktur Data”. ITB.
1999
• Thomas A. Standish,“Data Structures,
Algorithms & Software Principles in C” Addison-
Wesley, 1995

10