IKG2A3/ Pemrograman Terstruktur 2 ZK Abdurahman Baizal KK Algoritma dan Komputasi Representasi Fisik List Linier 1 8/25/2015
Pendahuluan Setelah representasi logic, perlu dilakukan represntasi fisik untuk implementasi Representasi list linier secara "fisik", artinya implementasi list linier dalam struktur data yang nantinya dapat ditangani oleh pemroses bahasabahasa pemrograman 2 8/25/2015 IKG2A3 Pemrograman Terstruktur 2
Pendahuluan Representasi fisik : Kontigu Keterurutan elemen list secara eksplisit, berdasarkan urutan indeks tabel Implementasi : tabel Alokasi memory : statis (dalam C dan pascal) Berkait : Keterurutan elemen list secara implisit, perlu didefinisikan Implementasi : tabel, pointer Alokasi memory : dinamis 3 8/25/2015
Representasi Fisik List Linier secara KONTIGU Setiap elemen tabel mengandung informasi info, sedangkan informasi mengenai Next tidak perlu lagi disimpan secara eksplisit, karena secara implisit sudah tersirat dalam struktur data yang menjadi tempat penyimpanannya 4 8/25/2015
{List direpresentasi pada tabel secara kontigu} Kamus : constant IndexMin : integer = 1 constant IndexMax : integer = 100 constant Nil : integer = 0 type InfoType :... {ElmType : terdefinisi } TabElmtList : array[indexmin..indexmax] of Info type address : integer [IndexMin..IndexMax,Nil] {Deklarasi nama untuk variabel kerja} N : address {alamat elemen terakhir. Karena field NEXT tidak ada secara eksplisit, maka satu-satunya jalan untuk mengenali elemen terakhir adalah dengan @-nya} {Deklarasi alamat} P : address {address untuk traversal} {Maka First(L)..Last(L) adalah indeks efektif elemen tabel anggota list. Next(P) menjadi P P + 1, Next(P) tidak terdefinisi untuk P=N, Info(P) menjadi TabElmtList[P].Info} 5 8/25/2015
Representasi Fisik List Linier BERKAIT dengan Pointer Kamus : {List direpresentasi dg pointer} Address : ^ElmtList type InfoType :.{terdefinisi} type ElmtList : <Info: InfoType, Next: address> type List : <First: address> {Deklarasi nama untuk variable keja} P: address {address untuk traversal} {Maka penulisan First(L) menjadi L.First Next(P) menjadi P^.Next Info(P) menjadi P^.Info} 6 8/25/2015
Representasi Fisik List Linier BERKAIT dengan Pointer procedure CreateNewElmt (input X: InfoType; output P: address) {Mengalokasi sebuah tempat di memori untuk menyimpan X} {I.S. Terdefinisi X} {F.S. Telah dialokasi sebuah tempat di memori dengan alamat P, X telah ditempatkan di P} Kamus : Algoritma : new(p) P^.Info X P^.Next nil 7 8/25/2015
Representasi Fisik List Linier BERKAIT dengan tabel Jika bahasa pemrograman tidak menyediakan struktur pointer (dengan primitif Allocate, Free, Saturate), maka kita dapat melakukan implementasi fisik alamat dengan indeks tabel. Representasi berkait pada dasarnya menggunakan alokasi memory dinamis. Dalam beberapa bahasa pemrograman, alokasi memory pada tabel adalah statis Oleh karena itu kita harus mendefinisikan suatu tabel GLOBAL, yang setiap elemennya adalah elemen list yang diacu oleh alamat supaya alokasi memory jadi dinamis 8 8/25/2015
Representasi Fisik List Linier BERKAIT dengan tabel Kamus : {List direpresentasi secara berkait dg tabel} type InfoType :... { terdefinisi } type ElmtList : <info: InfoType, Next: address > type Address : integer [IndeksMin..IndexMax, Nil] {TABEL MEMORI LIST, GLOBAL} constant IndexMin : integer = 1 constant IndexMax : integer = 100 constant Nil : integer = 0 {Nil:address tak terdefinisi, di luar [IndexMin..IndexMax]} TabElmt : array[indexmin..indexmax] of ElmtList FirstAvail : Address {alamat pertama list siap pakai} {Maka penulisan First(L) menjadi First Next(P) menjadi TabElmtList[P].Next Info (P) menjadi TabElmtList[P].Info } 9 8/25/2015
Representasi Fisik List Linier BERKAIT dengan tabel Kamus (lanjutan): procedure InitTab {Inisialisasi tabel yang akan dipakai sebagai memori list} procedure AllocTab (Output P : address) : {Mengambil sebuah elemen siap pakai P pada awal list FirstAvail} procedure DeAllocTab(Input P : address) : {Mengembalikan sebuah elemen P pada awal list FirstAvail} 10 8/25/2015
Representasi Fisik List Linier BERKAIT dengan tabel procedure InitTab {Inisialisasi tabel yang akan dipakai sebagai memori list} {I.S. Sembarang} {F.S. TabElmt[IndexMin..IndexMax] siap dipakai sebagai elemen list berkait, Elemen pertama yang available adalah FirsAvail=1. Next[i]=i+1 untuk i [IndexMin..IndexMax-1], Next[IndexMax]=Nil} Kamus P: address Algoritma : P traversal [IndexMin..IndexMax-1] TabElmt[P.Next] P + 1 TabElmt[IndexMax].Next Nil FirstAvail IndexMin 11 8/25/2015
Representasi Fisik List Linier BERKAIT dengan tabel procedure AllocTab(Output P: address) {Mengambil sebuah elemen siap pakai P pada awal list FirstAvail} {I.S. FirstAvail mungkin kosong} {F.S. Jika FirstAvail tidak Nil, P adalah FirstAvail dan FirstAvail yang baru adalah Next[FirstAvail] Jika FirstAvail =Nil, tuliskan pesan Tidak tersedia lagi elemen siap pakai,p=nil } Kamus : Algoritma : if (not MemFull) then P TabElmt[FirstAvail] FirstAvail TabElmt[FirstAvail].Next else Output ( Tidak tersedia lagi elemen siap pakai ) P Nil 12 8/25/2015
Representasi Fisik List Linier BERKAIT dengan tabel procedure DeAllocTab(Input P: address) {Mengembalikan sebuah elemen P pada awal list FirstAvail} {I.S. FirstAvail mungkin kosong. P Nil} {F.S. FirstAvail = P} Kamus : Algoritma : TabElmtp.Next FirstAvail FirstAvail P 13 8/25/2015
Ilustrasi dari urut-urutan pemanggilan dan status pemakaian memori list tersebut dapat dilihat pada gambar berikut FirstAvail FirstAvail FirstAvail 1 1 2 2 3 4 5 6 3 4 5 6 First 2 1 7 7 8 8 9 9 10 10 Keadaan Awal Keadaan Akhir 14 8/25/2015
Studi Kasus 1 Terdefinisi sebuah list L, mungkin kosong. Jika L tidak kosong elemen-elemen L unik, artinya tidak ada 2 atau lebih elemen yang sama. Akan disisipkan sebuah info baru X ke dalam list L sebagai elemen terakhir jika pada L belum ada elemen dengan info X. 15 8/25/2015
procedure InsertX1 (input/output L: List; input X: InfoType) {I.S. Terdefinisi X dan L, mungkin kosong. Jika L tidak kosong, L terurut membesar berdasar info} {F.S. Jika sebelumnya X belum ada di L maka X disisipkan menjadi di L sebagai elemen terakhir, L tetap terurut membesar berdasar info} Kamus P,Pt: address Algoritma : if IsEmpty(L) then CreateNewElement(X,P) InsertFirst(L,P) else Pt L.First while (Pt^.info<>X)and(Pt^.next<>NIL) do Pt Pt^. next {(Pt^.info=X) or (Pt^.next=NIL) } if Pt^.info<>X then P alokasi(x) Pt^.next P 16 8/25/2015
Studi Kasus 1 procedure CreateNewElmt (input X: InfoType; output P: address) {Mengalokasi sebuah tempat di memori untuk menyimpan X} {I.S. Terdefinisi X} {F.S. Telah dialokasi sebuah tempat di memori dengan alamat P, X telah ditempatkan di P} Kamus : Algoritma : new(p) P^.Info X P^.Next nil 17 8/25/2015
Studi Kasus 2 Terdefinisi sebuah list L, mungkin kosong. Jika L tidak kosong elemen-elemen L terurut membesar berdasar info. Akan disisipkan sebuah info baru X ke dalam list L. Setelah penyisipan X, list L tetap terurut membesar berdasarkan info 18 8/25/2015
procedure InsertX2 (input/output L: List; input X: InfoType) {I.S. Terdefinisi X dan L, mungkin kosong. Jika L tidak kosong, L terurut membesar berdasar info} {F.S. X telah disisipkan di L, L tetap terurut membesar berdasar info} Kamus Prec, Pt, P : address Algoritma : CreateNewElmt(X,P) if IsEmpty(L) then InsertFirst(L,P) else Prec NIL Pt L.First while (Pt^.info<=X)and(Pt^.next<>NIL) do Prec Pt Pt Pt^.next {(Pt^.info > X) or (Pt^.next=NIL) } if Pt^.info<=X then {Pt Elemen terakhir} Insert-After(Pt,P) {P menjadi elemen terakhir} else if Prec=NIL then {Pt Elemen pertama} InsertFirst(L,P) {P menjadi elemen pertama} else Insert-After(Prec,P) {P disisipkan di tengah } 19 8/25/2015
Latihan Misal diketahui 2 list L1 dan L2 yang tidak terurut. Buatlah sebuah algoritma untuk membuat sebuah list baru L3 yang elemen-elemennya merupakan irisan dari elemen L1 dan L2 (Elemen L3 unik) Misal diketahui 2 list L1 dan L2 yang tidak terurut. Buatlah sebuah algoritma untuk membuat sebuah list baru L3 yang elemen-elemennya merupakan union dari elemen L1 dan L2 (Elemen L3 unik) 20 8/25/2015
Referensi Diktat Kuliah IF2181 Struktur Data, Inggriani Liem, ITB, 2003. 21 8/25/2015
22 8/25/2015 THANK YOU