43

Modul Praktikum Algoritma & Struktur Data

Embed Size (px)

DESCRIPTION

lecture materi

Citation preview

  • 2

    Praktikum-1 : ArrayList 1 dimensi

    Arrays Array adalah struktur data yang menyimpan kumpulan data dalam jumlah besar dan

    mengijinkan akses langsung pada elemen-elemennya melalui indek. Suatu array memiliki panjang yang tetap. Seorang programmer harus menentukan ukuran dari array pada saat deklarasinya. Suatu aplikasi sering memerlukan struktur penyimpanan yang dapat berkembang dan data dapat ditambah dan dihapus.

    Buat program setiap permasalahan berikut ini :

    1. TabInt adalah sebuah array 1 dimensi bertipe integer dengan ukuran statis 10, dan variabel n menyatakan banyaknya elemen array saat ini dengan nilai n 10. Contoh elemen-elemen tabel dengan n=6 sebagai berikut :

    0 1 2 3 4 5 TabInt

    a. Buat suatu prosedur InsertAtIndex(int idx,int v), untuk meyisipkan sebuah elemen pada posisi tertentu. Misalkan dioperasikan prosedur InsertAtIndex(1,100) berarti menyisipkan nilai 100 pada index 1, maka langkah yang bisa dilakukan adalah :

    1. Operasi ShiftRight mulai index ke 1, dan nilai n bertambah 1, (n=7)

    0 1 2 3 4 5 6 TabInt

    ShiftRight

    2. Set Nilai TabInt index 1 dengan 100

    0 1 2 3 4 5 6 TabInt

    Catatan : idx harus berada pada kisaran 0..n-1

    b. Buat sebuah prosedur RemoveAtIndex(int idx), untuk menghapus sebuah elemen yang berada pada index idx, dimana idx = (0..n-1). Prosedur ini memiliki algoritma seperti ShifLeft mulai index (idx+1) dan nilai n berkurang 1 (n=n-1).

    5 12 7 53 4 9

    5 12 12 7 53 4 9

    5 100 12 7 53 4 9

  • 3

    Misalkan RemoveAtIndex(2), maka gambaran proses sebagai berikut : 0 1 2 3 4 5 6 TabInt

    Elemen yang akan di ShifLeft pada range (idx+1..n-1) Keadaan TabInt setelah operasi RemoveAtIndex(2) adalah :

    0 1 2 3 4 5 , dengan n = 6 TabInt

    c. Buat sebuah fungsi GetIndex(int v) untuk menentukan index dari sebuah elemen v pada array TabInt. Fungsi akan mengembalikan nilai 0..n-1 apabila v merupakan elemen dari array dan mengembalikan nilai -1 apabila sebaliknya. Misalkan elemen array TabInt sebagai berikut :

    0 1 2 3 4 5 6 TabInt

    maka fungsi GetIndex(53) mendapatkan nilai 4, sedangkan GetIndex(62) mendapatkan nilai -1 karena elemen 62 tidak terdapat pada array.

    d. Buat prosedur InsertFirst(int v) untuk menyisipkan sebuah elemen v menjadi elemen pertama arrayList. Prosedur ini memiliki langkah kerja sebagai berikut : 1. ShiftRight mulai posisi ke 0..n-1 2. Set TabInt[0] dengan v 3. n bertambah 1 (n=n+1)

    e. Buat prosedur untuk menyisipkan sebuah elemen setelah elemen tertentu pada arrayList. Format prosedur dapat berupa InsertAfter(int v1,int v2) yang memiliki makna sisipkan elemen v2 setelah elemen v1 pada array. Karena elemen v1 merupakan nilai sembarang, maka dimungkinkan v1 terdapat dalam TabInt atau tidak. Bila v1 bukan anggota TabInt lakukan InsertFirst. Misalkan keadaan awal tabel sebagai berikut :

    0 1 2 3 4 5 6 TabInt

    maka setelah operasi InsertAfter(7,25), maka keadaan tabel sebagai berikut :

    0 1 2 3 4 5 6 7 TabInt

    5 100 12 7 53 4 9

    5 100 7 53 4 9

    5 100 12 7 53 4 9

    5 100 12 7 53 4 9

    5 100 12 7 25 53 4 9

  • 4

    Praktikum-2 : ArrayList 1 dimensi Elemen Terurut

    Elemen-elemen dalam array bisa dijaga sehingga selalu dalam keadaan terurut, baik terurut membesar (ascending) maupun terurut mengecil (descending). Operasi Insert, Delete dan Udpade pada tabel terurut memiliki sedikit perbedaan dbanding dengan tabel yang elemennya acak. Implementasi tabel terurut dapat dilakukan dengan menggunakan array 1 dimensi TabInt, akan tetapi setiap proses yang diterapkan diharuskan dapat menjaga keterurutan elemen-elemennya.

    a. Buat fungsi IsExist(int v) untuk mengecek apakah sebuah elemen v ada pada tabel terurut TabInt. Karena tabel dalam kondisi terurut, maka pengecekan memungkinkan tidak dilakukan ke semua elemen tabel. Misalkan kondisi awal tabel sebagai berikut :

    0 1 2 3 , dengan n=4 TabInt

    dengan pemanggilan fungsi IsExist(14), maka fungsi bernilai true, karena elemen 14 ada pada tabel, yaitu indek ke 1. Akan tetapi pemanggilan fungsi IsExist(10), fungsi akan bernilai false. Pengecekan nilai tidak dilakukan terhadap semua elemen (n elemen) akan tetapi sampai elemen 14 (index 1), karena kondisi nilai (10

  • 5

    2. ShiftRight mulai posisi 3

    0 1 2 3 TabInt

    3. Set TabInt[3]=v

    0 1 2 3 TabInt

    4. n=n+1

    0 1 2 3 4, n = 5 TabInt

    c. Buat prosedur untuk merubah sebuah nilai dengan nilai yang lain. Misalkan bentuk prosedur adalah UpdateElmUrut(int v1,int v2) memiliki makna mengubah nilai v1 pada TabInt dengan nilai baru v2. Misalkan keadaan awal TabInt sebagai berikut :

    0 1 2 3 , dengan n=4 TabInt

    maka, dengan pemanggilan prosedur UpdateElm(14,1), langkah-langkah yang dikerjakan adalah :

    1. Menghapus elemen 14 dari TabInt, dihasilkan TabInt sebagai berikut :

    0 1 2, dengan n=3 TabInt

    2. Menyisipkan elemen 1 ke TabInt

    0 1 2 3 , dengan n=4 TabInt

    5 14 27 43 43

    5 14 27 30 43

    5 14 27 43 43

    5 14 27 43

    5 27 43

    1 5 27 43

  • 6

    Sorting (Pengurutan) Salah satu metode pengurutan data adalah CountSort. Metode ini digunakan untuk mengurutkan bilangan integer. Contoh program Java CountSort :

    1 public class CountSort { 2 int[] TabInt = new int[6]; 3 int[] TabCount; 4 int xMax,JumData=6; 5 6 public CountSort() { 7 TabInt[0]=10; TabInt[1]=3; 8 TabInt[2]=2; TabInt[3]=10; 9 TabInt[4]=3; TabInt[5]=1; 10 } 11 12 public void MencariMax(){ 13 xMax = TabInt[0]; 14 for(int j=1;j

  • 7

    45 public static void main( String [ ] args ) 46 { 47 CountSort cs = new CountSort(); 48 cs.printTabInt(); 49 cs.MencariMax(); 50 cs.MengisiTabCount(); 51 cs.ReConstructTabInt(); 52 cs.printTabInt(); 53 } 54 }

    Bila dieksekusi, menghasilkan output : 10 3 2 10 3 1 {data asal} 1 2 3 3 10 10 {hasil pengurutan} Process completed.

    Selection Sort Pada metode ini proses dimulai pada posisi index 0. Pilih elemen terkecil mulai setelah posisi sekarang sampai elemen terakhir dan tukar dengan posisi sekarang. Lihat contoh gambar berikut ini :

    Index 0 1 2 3

    Pengurutan dimulai dengan mencari lokasi hewan terkecil, yaitu ikan, untuk ditempatkan pada posisi pertama. Operasi terjadi dengan menukar posisi 0 (burung hantu) dengan posisi 1 (ikan). Akibat dari proses ini adalah menempatkan hewan yang terkecil ditempat yang paling depan.

    Proses selanjutnya dimulai dari posisi kedua (burung hantu). Selanjutnya memilih hewan yang terkecil diantara burung hantu, dragon, dan anjing. Karena hewan yang terkecil

    Ordered Unordered

  • 8

    adalah burung hantu, maka tidak terjadi pertukaran posisi karena burung hantu sudah berada pada posisi yang tepat.

    Proses selanjutnya pada posisi ketiga. Menentukan hewan terkecil diantara dragon dan anjing. Karena anjing lebih kecil, maka terjadi pertukaran posisi, diperoleh urutan :

    Dari gambar diatas, sudah diperoleh gambar yang sudah terurut membesar.

    Aksi Selection Sort alam array

    Pass 0 : Pilih 20 pada indek 1 Tukar arr[1] dengan arr[0]

    Pass 1 : Pilih 35 pada indek 4 Tukar arr[4] dengan arr[1]

    Pass 2 : Pilih 40 pada indek 2 Tidak terjadi pertukaran

    Pass 3 : Pilih 50 pada indek 4 Tukar arr[3] dengan arr[4]

    Array sudah terurut

    Ordered Unordered

  • 9

    Insertion Sort

    Metode ini melakukan pengurutan data dengan cara sebagai berikut :

    Pass=0, posisi 50 sudah tepat

    Pass=1, posisi elemen 20 seharusnya di index 0, Maka terjadi pergeseran 50 ke 20, array menjadi

    Pass=2, posisi elemen 40 seharusnya sebelum 50, Maka terjadi pergeseran 50 kebawah , array menjadi

    Pass=3, posisi elemen 75 sudah tepat

    Pass=4, posisi elemen 35 seharusnya sebelum 40, Maka terjadi pergeseran elemen 40,50,75 kebawah, array baru

    50 20 40 75 35

    50 20 40 75 35

    20 50 40 75 35

    20 50 40 75 35

    20 40 50 75 35

    20 40 50 75 35

    20 40 50 75 35

    20 35 40 50 75

  • 10

    Diperoleh array terurut sebagai berikut :

    20 35 40 50 75

    Praktikum : (Lanjutan Praktikum 2) 1. Buat program pencarian satu nilai dengan Sequential Search 2. Buat program pencarian satu nilai dengan Binary Search 3. Buat program untuk menentukan nilai maksimum dan minimum suatu array 4. Buat program untuk Insertion Sort 5. Buat program untuk Merge Sort

  • 11

    Praktikum-3 : Single Linked List

    Untuk menyisipkan(insert) atau menghapus(remove, delete) sebuah elemen pada lokasi didalam dari suatu list array memerlukan penggeseran data, misalnya

    Insert 5 kedalam ArrayList {2,7,3,10,8} pada indek ke 2. Membuat ruang dengan pergeseran ekor (tail) {3,10,8}

    Tambahkan 5 pada indek 2 (Menghasilkan barisan {2,7,5,3,10,8})

    Insert 5 pada ArrayList dilakukan dengan pergeseran tail kekanan

    Dengan mengamati operasi diatas, maka diperlukan struktur alternatif yang dapat menyimpan elemen dalam suatu barisan yang mengijinkan penyisipan dan penghapusan elemen pada posisi acak yang lebih efisien pada list. Pada single linked list, suatu elemen terdapat link yang mereferensi ke elemen berikutnya (successor) dalam list.

    head

    NULL

    Setiap elemen pada list berupa Node yang dirangkai dengan Node yang lain. Penyisipan sebuah node kedalam list dilakuakan dengan cara memotong koneksi, kemudian menghubungkan kembali rantai pada akhir node yang baru.

  • 12

    Penghapusan sebuah node sembarang pada list memerlukan pemotongan dua koneksi, penghapusan node, dan kemudian menghubungkan kembali rantai.

    Penyisipan dan penghapusan sebuah node merupakan operasi local dan pengubahan terjadi hanya pada link yang terhubung terhadap node. Elemen yang lain dari node tidak terpengaruh. Pada ArrayList harus terdapat pergeseran semua elemen pada tail pada saat node baru masuk atau keluar dari list.

    Struktur dari single linked list : 1. Setiap elemen adalah sebuah node yang terdiri dari sebuah nilai dan sebuah

    referen(link) ke node selanjutnya (next ). 2. Sebuah node dengan dua field dapat berada di sembarang tempat pada memori. 3. List menjaga sebuah variabel referensi yang mengidentifikasikan elemen pertama

    list. Akhir list ditandai dengan link null.

    Implementasi single linked list dengan Java

    1 class Node { 2 Object data; 3 Node next; 4 } 5 6 public class List 7 { 8 Node head; 9 10 public List() 11 { 12 head = null; 13 } 14 15 public void InsertFirst(Object o) 16 { 17 Node nn = new Node(); 18 nn.data = o; 19 nn.next = head; 20 head = nn;

  • 13

    21 } 22 public Node FindLastNode(){ 23 Node n=head; 24 if (n!=null){ 25 while (n.next!=null){ 26 n=n.next; 27 } 28 } 29 return n; 30 } 31 32 public void InsertLast(Object o){ 33 if (head==null){ 34 InsertFirst(o); 35 } 36 else{ 37 Node n=FindLastNode(); 38 Node new_n= new Node(); 39 new_n.data=o; 40 new_n.next=null; 41 n.next=new_n; 42 } 43 } 44 45 public void print() 46 { 47 System.out.println("Printing the Single Linked List "); 48 Node n = head; 49 while (n!= null) 50 { 51 System.out.println(n.data); 52 n = n.next; 53 } 54 } 55 56 public static void main(String[] args) 57 { 58 List L = new List(); 59 L.InsertFirst(1); 60 L.InsertFirst(2); 61 L.InsertFirst(3); 62 L.print(); 63 } 64 }

  • 14

    front

    //

    front.next

    item

    newNode

    front

    //

    Output program sebagai berikut : Printing the Single Linked List 3 2 1

    Process completed.

    Setiap elemen pada single linked list adalah node yang memiliki dua variable instans. Variabel pertama, data yang bertipe Object. Variabel kedua adalah node referens yang disebut next yang menyediakan sebuah link ke node selanjutnya. Linked list merupakan struktur implementasi, oleh karena itu tidak tampak pada antarmuka public pada struktur data. Sebagai akibat, maka diperlukan untuk mendeklarasikan variable instans pada kelas public node. Hal ini akan sangat menyederhanakan penulisan kode yang melibatkan linked list. Kelas node merupakan struktur self-referencing, yaitu variabel instans next, menunjuk ke objek yang memiliki tipe yang sama dengan dirinya sendiri.

    Menciptakan Linked List Kelas node memiliki dua konstruktor yang mengkombinasikan operator new

    untuk membuat sebuah node. Konstruktor default menginisialisasi setiap variabel instans menjadi null. Konstruktor dengan sebuah type parameter mengnisialisasi field data dan menset next menjadi null. Pada kelas ini diperlukan sebuah variabel referen, head, yang mengidentifikasi node pertama dari list. Sekali dapat menunjuk node pertama, maka dengan menggunakan next dapat menuju node kedua, kemudian ketiga, dan selanjutnya. Jika list kosong, maka head bernilai null.

    Praktikum : 1. Tampilkan data list dalam bentuk : [data1,data2,,datan] 2. Buat program untuk insert dan menghapus head suatu single linked list.

    Gambaran proses insert

    Gambaran proses delete

  • 15

    3. Buat program untuk menyisipkan sebuah node sebelum node dari suatu list

    Gambaran proses InserBefore

    4. Buat program untuk menghapus sebuah node

    Bagaimana bila yang dihapus merupakan elemen pertama, tengah atau terakhir ?

    5. Buat program untuk mengurutkan data list.

    6. Buat suatu prosedur isPalindrome() yang mengembalikan nilai true apabila barisan elemen merupakan palindrome dan false jika bukan. Suatu palindrome adalah barisan nilai yang pembacaan maju dan mundurnya sama, misal kata level. Algoritma membandingkan elemen pada ujung yang berlawanan dari list, dengan menggunakan getFirst() dan getLast().

  • 16

    Doubly-Linked-List (DLL) melinkar DLL adalah list yang memiliki dua pointer. Pointer yang satu ke Node berikutnya (next) dan pointer yang lain ke node sebelumnya (prev). Spesifikasi DLL adalah : 1. List kosong (head=null)

    2. DDL yang memilki satu elemen

    3. DLL yang memiliki banyak elemen

    Berikut ini program java doubly-linked-list melingkar :

    1 class Node { 2 Object data; 3 Node next; 4 Node prev; 5 } 6 7 public class DoubleCircularList 8 { 9 Node head; 10 11 public DoubleCircularList() 12 { 13 head = null; 14 } 15 16 public boolean IsEmpty(){ 17 return (head==null); 18 }

  • 17

    19 20 public Object GetFirst(){ 21 return head.data; 22 } 23 24 public boolean IsNotEmpty(){ 25 return (head!=null); 26 } 27 28 public void InsertLast(Object o) 29 { 30 Node new_n = new Node(); 31 new_n.data = o; 32 if (IsEmpty()){ // List Masih kosong 33 head=new_n; 34 new_n.next=head; 35 new_n.prev=head; 36 37 } else { // List tak kosong 38 new_n.next=head; 39 new_n.prev=head.prev; 40 head.prev.next=new_n; 41 head.prev=new_n; 42 } 43 } 44 45 public void InsertFirst(Object o){ 46 InsertLast(o); 47 head=head.prev; 48 } 49 50 public void print(String str) 51 { 52 System.out.println(str); 53 Node n = head; 54 if (IsNotEmpty()){ 55 Do 56 { 57 System.out.println(n.data); 58 n = n.next; 59 } while (n != head); 60 } else { 61 System.out.println("List Kosong"); 62 } 63 } 64

  • 18

    65 public static void main( String [ ] args ) 66 { DoubleCircularList dcl=new DoubleCircularList(); 67 dcl.InsertFirst(10); 68 dcl.InsertFirst(20); 69 dcl.print("Double Cicular List"); 70 } 71 }

    Output program sebagai berikut : Double Cicular List 20 10

    Process completed.

    Praktikum-4 : Doubly-LinkedList

    1.Buat prosedur untuk menghapus elemen pertama dari DDL (deleteFirst) 2.Buat prosedur public void DeleteNode(Node Pdel) yang berguna untuk menghapus

    sebuah node dengan alamat Pdel. 3.Buat prosedur public void InsertAfterNode(Node NodePrev,Node NodeIns ) yang

    berguna untuk menyisipkan sebuah node setelah NodePrev yang merupakan node milik DLL.

    4.Buat prosedur public Node FindNode(Object o) yang berguna untuk mendapatkan node yang memiliki elemen o

    5.Buat prosedur public void InsertAfterObject(Object oPrev,Object oIns) yang berguna untuk menyisipkan sebuah elemen setelah elemen tertentu pada list.

    6.Buat prosedur public void DeleteObject(Object o) yang berguna untuk menghapus sebuah elemen o didalam list.

    7.Buat prosedur public void DeleteLast() yang berguna untuk menghapus elemen terakhir dari list.

  • 19

    Pratikum-5 : STACK (Tumpukan)

    Sebuah stack adalah suatu daftar item yang dapat diakses hanya pada akhir barisan, yang disebut puncak(top) dari stack. Tumpukan item menempatkan sesuatu di puncak item-item yang lain adalah model dari stack.

    Operasi Stack terbatas pada elemen pada top dari stack. Push(item) menambah satu item pada top, Pop() menghapus elemen dari top, Peek() mengakses nilai pada top.

    Sebuah item yang di remove (pop) dari stack adalah elemen yang ditambahkan(push) paling akhir ke stack. Stack memiliki urutan LIFO(last-in-last-out). Penyisipan yang diikuti dengan penghapusan akan membalik urutan dari elemen stack.

  • 20

    Antarmuka(Interface) Stack

    Type Interface Boolean IsEmpty(), mengembalikan true jika tidak terdapat elemen dan false

    jika memiliki elemen minimal satu Object Peek(), mengembalikan elemen pada top stack. Jika stack kosong

    mengembalikan EmptyStackException Object Pop(), menghapus elemen pada top stack dan mengembalikan nilainya.

    Jika kosong mengembalikan EmptyStackException Void Push(Object) , Menyisipkan item pada top stack Int Size(), mengembalikan banyaknya elemen stack

    Contoh program berikut implementasi stack dengan menggunakan doubly-linked-list

    1 public class Stack { 2 private DoubleCircularList S; 3 public Stack() { 4 S=new DoubleCircularList(); 5 } 6 7 public void Push(Object o){ 8 S.InsertFirst(o); 9 } 10 11 public Object Pop(){ 12 Object o= S.GetFirst(); 13 S.DeleteFirst(); 14 return o; 15 } 16 17 public void print(String str){ 18 S.print(str); 19 } 20 21 public static void main(String[] args) 22 { Stack S=new Stack(); 23 S.Push(1); 24 S.Push(2); 25 S.Push("tiga"); 26 S.print("Stack Asal"); 27 Object o=S.Pop(); 28 S.print("Stack setelah di Pop"); 29 System.out.println("Object yang di Pop : " + o); 30 } 31 }

  • 21

    Output program adalah : Stack Asal tiga 2 1 Stack setelah di Pop 2 1 Object yang di Pop : tiga

    Process completed.

    Praktikum : 1. Implementasikan kelas stack dengan menggunakan array ! 2 Buat program aplikasi stack pada MMuullttiibbaassee nnuummbbeerrss .Berikut ini gambaran proses

    4. Buat program aplikasi stack untuk keseimbangan pasangan simbol. Contoh output :

  • 22

    Praktukum-5 : Antrian

    Antrian adalah suatu daftar item yang mengijinkan pengaksesan hanya pada dua ujung dari barisan, yang disebut head dan belakang dari antrian. Suatu item masuk pada belakang dan keluar dari depan. Sebuah garis tunggu pada toko atau suatu bank adalah model dari suatu stack.

    OOppeerraassii aannttrriiaann tteerrbbaattaass ppaaddaa uujjuunngg ddaaffttaarr,, yyaanngg ddiisseebbuutt hheeaadd ddaann bbaacckk..

    ppuusshh((iitteemm)) mmeennaammbbaahh iitteemm ppaaddaa bbaacckk

    ppoopp(()) mmeenngghhaappuuss eelleemmeenn ppaaddaa hheeaadd((ffrroonntt))

    ppeeeekk(()) mmeennggaakksseess nniillaaii ppaaddaa hheeaadd

    SSaattuu iitteemm ddii rreemmoovvee ((ppoopp)) ddaarrii aannttrriiaann aaddaallaahh eelleemmeenn ppeerrttaammaa yyaanngg ddiittaammbbaahhkkaann((ppuusshh)) kkee ddaallaamm aannttrriiaann.. AAnnttrriiaann mmeemmiilliikkii uurruuttaann FFIIFFOO((ffiirrsstt--iinn--ffiirrsstt--oouutt)).. IInnsseerrtt yyaanngg ddiiiikkuuttii oolleehh ddeelleettee mmeennjjaaggaa uurruuttaann ddaarrii eelleemmeenn..

    Antarmuka(Interface) Antrian

    Type Interface boolean IsEmpty(), mengembalikan true jika tidak terdapat elemen dan false jika

    memiliki elemen minimal satu Object Peek(), mengembalikan elemen pada head antrian. Jika antrian kosong

    mengembalikan NoSuchElementException Object Pop(), menghapus elemen pada head antrian dan mengembalikan nilainya.

    Jika kosong mengembalikan NoSuchElementException void Push(Object) , Menyisipkan item pada belakang antrian

  • 23

    int Size(), mengembalikan banyaknya elemen antrian

    Praktikum : 1. Buat struktur dari antrian dengan menggunakan doubly-linked-list 2. Buat program interface antrian : isEmpty(), Push(), Pop(),Peek() dan size() 3. Buat program untuk mengurutkan barisan bilangan integer dengan menggunakan

    metode RadixSort, dimana metode ini menggunakan prinsip antrian. Gambaran proses sebagai berikut : a. Misal barisan bilangan integer sebagai berikut :

    LLiisstt:: [[9911,, 66,, 8855,, 1155,, 9922,, 3355,, 3300,, 2222,, 3399]] Dapat dilihat per-angka dari sebelah kanan. Pada saat Pass=0, maka barisan bilangan dilihat pada karakter angka yang paling kanan, kemudian memasukkan ke dalam 10 antrian (0,1,2,,9) sesuai dengan karakter angka yang ada. Pada metode ini banyaknya karakter angka dibuat sama.

    9 1 0 6 8 5 1 5 9 2 3 5 3 0 2 2 3 9

    Pass=0 Keadaan antrian pada saat Pass=0 sebagai berikut :

    SSeetteellaahh PPaassss 00:: [[3300,, 9911,, 9922,, 2222,, 8855,, 1155,, 3355,, 66,, 3399]]

    IItteerraassii sseellaannjjuuttnnyyaa mmeenneemmppaattkkaann ddaaffttaarr aannttrriiaann yyaanngg tteellaahh ddiippeerroolleehh ppaaddaa PPaassss==00 ddiimmuullaaii aannttrriiaann 00,,11,,,,99 ddeennggaann mmeemmppeerrttiimmbbaannggkkaann kkaarraakktteerr kkee 22 ddaarrii kkaannaann..

  • 24

    CCoonnttoohh :: aa.. AAnnttrriiaann kkee 00.. KKaarreennaa kkaarraakktteerr kkee 22 aaddaallaahh 33 ((ddaarrii aannggkkaa 3300)),, mmaakkaa aannggkkaa tteerrsseebbuutt ddiitteemmppaattkkaann ppaaddaa aannttrriiaann kkee 33,, sseeppeerrttii ggaammbbaarr bbeerriikkuutt iinnii ::

    Karena pada antrian ke 0 elemennya habis, maka STOP

    b. Antrian ke 1. Ditempatkan pada antrian ke 9,

    Karena pada antrian ke 0 elemennya habis, maka STOP

    c. Antrian ke 3. Ambil element 92, taruh di antrian 9, dan ambil elemen 22 kemudian taruh di antrian 2. Kondisi antrian sebagai berikut :

  • 25

    Setelah antrian ke 9 diproses, maka kondisi antrian yang baru adalah :

    SSeetteellaahh PPaassss 11:: [[66,, 1155,, 2222,, 3300,, 3355,, 3399,, 8855,, 9911]] ddaattaa ssuuddaahh uurruutt mmeemmbbeessaarr

    PPrroosseess iitteerraassii PPaassss sseebbaannyyaakk mmaakkssiimmaall bbaannyyaakknnyyaa kkaarraakktteerr bbiillaannggaann yyaanngg aakkaann ddiiuurruuttkkaann ddiikkuurraannggii ddeennggaann 11 kkaarreennaa iinnddeekk PPaassss ddiimmuullaaii ddaarrii 00..

    44.. SSiimmuullaassii EEvveenntt--DDrriivveenn SSiimmuullaassii eevveenntt--ddrriivveenn mmeenngggguunnaakkaann ssuuaattuu aannttrriiaann bbeerrpprriioorriittaass uunnttuukk mmeennyyiimmppaann

    eevveennttss yyaanngg tteerrjjaaddii sseeppaannjjaanngg.. MMiissaallnnyyaa ssiimmuullaassii bbaannkk mmeelliihhaatt aalliirraann ccuussttoommeerr yyaanngg ddiillaayyaannii oolleehh dduuaa tteelllleerr.. TTiippee eevveenntt bbeerrbbeeddaa tteerrhhaaddaapp kkeeddaattaannggaann((aarrrriivvaall)),, ppeellaayyaannaann((sseerrvviiccee)),, ddaann kkeeppeerrggiiaann ((ddeeppaarrttuurree)) ddaarrii sseeoorraanngg ppeellaannggggaann.. WWaakkttuu kkeeddaattaannggaann ddaann ppeellaayyaannaann bbeerrssiiffaatt rraannddoomm.. GGrraaffiikk bbeerriikkuutt iinnii mmeennggggaammbbaarrkkaann eevveenntt ((Ai = kedatangan, Si = pelayanan, Di = kepergian) untuk empat pelanggan.

    BBuuaatt pprrooggrraamm JJaavvaa pprroosseess ssiimmuullaassii eevveenntt--ddrriivveenn tteerrsseebbuutt..

  • 26

    Praktikum-6 : Binary Tree

    SSttrruukkttuurr TTrreeee Tree adalah struktur hirarki yang menempatkan elemen-elemen dalam node

    sepanjang cabang (branches) yang berasal dari sebuah akar (root). Node dalam sebuah pohon dibagi menjadi level-level. Level tertatas ditempati oleh node root. Sebuah node dalam tree dapat memiliki multiple successor pada level berikutnya. Dengan demikian, sebuah tree dikatakan struktur nonlinier.

    Contoh-1 : Operating sistem menggunakan tree untuk memelihara struktur file.

    Contoh-2 : Pada binary tree, setiap node memiliki paling banyak dua successor. Suatu kompiler membangun binary tree pada saat parsing ekspresi pada suatu kode sumber program.

  • 27

    Terminologi Tree Suatu tree dikarakteristikkan sebagai koleksi dari node yang berasal dari node

    awal yang unik yang dinamakan root. Setiap node terdiri dari sebuah nilai dan beberapa atau kosong successor. Istilah parent dan child menggambarkan hubungan antara sebuah node dan beberapa successornya.

    Suatu path antara satu parent P dan sembarang node N dalam subtree adalah barisan node P=X0, X1, . . ., Xk = N dimana k adalah panjang path. Setiap node Xi pada barisan merupakan parent dari node Xi+1 untuk 0 i k-1. Level dari node adalah panjang path dari root ke node tersebut. Dengan memandang sebuah node sebagai root terhadap subtree-nya, tinggi sebuah node adalah panjang dari path terpanjang dari node tersebut ke daun dalam subtree. Tinggi sebuah tree adalah level maksimum dari tree tersebut.

  • 28

    Binary Tree Pada binary tree, setiap parent memiliki anak tidak lebih dari dua. Model ini

    memiliki struktur yang uniform yang memberikan gambaran yang sederhana terhadap struktur nodenya dan pengembangan berbagai algoritma tree.

    Setiap node pada Binary Tree mendefinisikan sebuah subtree left dan subtree right. Setiap subtree juga merupakan binary tree.

  • 29

    Pendefinisan secara rekursif terhadap binary tree adalah : T adalah suatu binary tree apabila :

    tidak memiliki node (T adalah tree kosong)

    aattaauu

    mmeemmiilliikkii ppaalliinngg bbaannyyaakk dduuaa ssuubbttrreeee

    Tinggi Binary Tree Tinggi dari binary tree adalah panjang dari path terpanjang dari root ke

    sebuah node daun. Misalkan TN adalah subtree dengan root N dan TL dan TR adalah root dari subtree kiri dan subtree kanan dari N, maka :

    +

    == kosongtakTjikaTheightTheightkosongTjikaTheightNheight

    NRLN

    N )),(),(max(1,1)()(

  • 30

    Kepadatan Binary Tree Pada binary tree, banyaknya node pada setiap level berada pada kisaran nilai

    tertentu. Pada level 0, terdapat sebuah node, pada level 1 terdapat 1 atau 2 node. Pada level k, banyaknya node berada pada kisaran 1 sampai 2k. Banyaknya node setiap level memiliki kontribusi terhadap kepadatan tree. Kepadatan adalah suatu ukuran yang menyatakan banyaknya node relatif terhadap tinggi dari tree.

    Praktikum : 1. Buat program untuk implementasi Binary Tree 2. Buat program untuk menginputkan elemen sehingga bentuk tree adalah :

    Root

    Root

    Buat program untuk menghitung banyaknya node. Untuk tree no 2 banyaknya node adalah 9

    Buat program untuk menghitung jumlah seluruh elemen, yaitu 10+15+55+.+455. Buat program untuk menghitung banyaknya daun 6. Buat program untuk menghitung tinggi tree 7. Buat program untuk menghitung tinggi dan level tiap-tiap node

  • 31

    Aplikasi Binary Tree pada Ekspresi Aritmatika

    Sebuah ekspresi biner tree menyatakan ekspresi aritmatika. Pada tree ekspresi setiap operator merupakan node interior yang memiliki anak operand atau sub-ekspresi. Operand menjadi node kiri atau kanan.

    Traversal preorder terhadap ekspresi biner tree menghasilkan notasi prefix,

    traversal postorder menghasilkan notasi postfix, dan traversal inorder menghasilkan notasi infix. Pada kasus diatas diasumsikan tidak terdapat notasi kurung untuk menyatakan ekspresi.

    Contoh tree binary ekspresi sebagai berikut :

  • 32

    Preorder(Prefix): - + a / * b c d e // preorder scan Inorder(Infix): a + b * c / d - e // inorder scan Postorder(Postfix): a b c * d / + e - // postorder scan

    Membangun Tree Binary Ekspresi Untuk membangun sebuah tree ekspresi dari sebuah ekspresi postfix dengan

    menggunakan algoritma iteratif. Sebuah operand merupakan satu karakter tunggal seperti a atau b. Jika token berupa operand, create satu node daun yang nilainya adalah operand tersebut dan subtree kiri dan kanan adalah null. Push node ke stack. Jika token adalah operator, create satu node baru dengan nilai operator tersebut. Pop dua node anak dari stack dan jadikan anak kiri dan anak kanan pada node baru tersebut.

    Misal ekspresi a b c * +

    Praktikum : 1. Buat program untuk mengubah notasi Infix menjadi notasi postfix, missal 2+3*6+4 menjadi notasi postfix 236*+4+ 2. Buat program untuk mengubah notasi infix menjadi bentuk pohon 3. Hitung ekspresi tersebut berdasarkan pohon ekspresi biner yang terbentuk

  • 33

    Binary Search Tree Node pada binary search tree merupakan path yang unik dari root sesuai dengan

    prinsip pengurutan. Node pada subtree kiri memiliki nilai yang lebih kecil dan node pada subtree kanan memiliki nilai yang lebih besar. Hal ini mengisyaratkan bahwa tidak diperbolehkan terdapat nilai ganda.

    Membangun Binary Search Tree Untuk membangun BST, terdapat beberapa strategi untuk melakukan penyisipan

    elemen ke tree antara lain : 1. Jika nilai dari elemen baru sama dengan nilai dari node sekarang, maka tidak terdapat

    aksi yang dilakukan. 2. Jika nilai dari elemen baru lebih kecil daripada nilai dari node sekarang, maka

    penyisipan dilakukan pada subtree kiri(left child) dari node. Jika null, sisipkan node sebagai anak kiri dari parent.

    3. Jika nilai dari elemen baru lebih besar dari node sekarang, maka penyisipan dilakukan pada subtree kanan (right child) dari node. Jika null, maka sisipkan node sebagai anak kanan dari parent.

    Contoh :

  • 34

    Searching Proses pencarian sebuah nilai dilakukan sama seperti pada proses insert.

    Penghapusan Node Misalkan ingin menghapus root, maka node tersebut tidak dapat di hapus dari

    tree. Yang dapat dilakukan adalah mengganti nilai tersebut dengan nilai yang lain.

    Untuk menghapus sebuah node dari BST, harus ditemukan node pengganti, kopi nilainya, kemudian hapus dari tree.

  • 35

    Praktikum : 1. Implementasikan kelas Node Binary Search Tree 2. Buat program untuk menginsertkan sebuah elemen ke dalam BST 3. Buat program untuk mendapatkan nilai elemennya terkecil 4. Buat program untuk mendapatkan nilai elemennya terbesar 5. Buat fungsi untuk mengecek apakah sebuah elemen telah pada BST. Fungsi akan

    mengembalikan nilai true apabila nilai sudah ada pada BST, dan mengembalikan false jika sebaliknya.

    6. Buat program untuk mengganti sebuah elemen dengan elemen yang lain. Pertimbangkan apakah urutan pencarian masih terjaga ?

    7. Dengan program uji pohon BST apabila urutan input sebagai berikut : 50, 60, 40, 45, 30, 20

  • 36

    Praktikum-7 : AVL (Height-balanced Trees)

    Suatu pohon biner dinamakan perfectly balanced apabila :

    Tinggi dari subtree kiri dan kanan terhadap root sama Subtree kiri dan kanan terhadap root merupakan binary tree yang perfectly

    balanced.

    Contoh :

    Suatu AVL Tree adalah Binary Search Tree yang memiliki karakteristik : Tinggi dari subtree kiri dan kanan terhadap root berbeda paling banyak 1 Subtree kiri dan kanan terhadap root merupakan AVL Tree Faktor keseimbangan node adalah -1 jika node tinggi subtree kiri, 0 jika memiliki

    tinggi yang sama dan +1 jika tinggi kanan.

    Contoh AVL Tree

  • 37

    Contoh Non AVL Tree

    Penyisipan terhadap AVL Tree

    Kasus -1

    AVL Tree sebelum penyisipan 90

  • 38

    Kasus-2

    AVL Tree sebelum penyisipan 75

  • 39

    Kasus-3

  • 40

    Kasus-4

    Praktikum : 1. Buat program untuk melakukan rotasi kiri terhadap pohon AVL dan uji dengan data ! 2. Buat program untuk melakukan rotasi kanan terhadap pohon AVL dan uji dengan data 3. Buat program untuk menguji apakah sebuah pohon merupakan AVL ! 4. Buat program untuk menghapus sebuah node dalam AVL Tree !

  • 41

    Praktikum-8 : Graph

    Sebuah graph G adalah pasangan g=(V,E), dimana V adalah himpunan titik tak kosong terbatas, yang dinamakan vertex dari G, dan E V x V. Elemen dari E adalah pasangan elemen dari V. E disebut himpunan edge. Misalkan graph sebagai berikut :

    Pada gambar diatas V={1,2,3,4,5} dan E={(1,2),(1,4),(2,5),(4,5),(3,4),(3,1)} Untuk menyatakan adjacency matrix dapat digunakan matrik dua dimensi. Contoh matrik adjacency graph diatas adalah:

    Adjacency graph dapat juga dinyatakan dengan array dan single linked list sebagai berikut :

  • 42

    Program Java untuk implementasi graph dengan array dan single linked list sebagai berikut :

    1 public class Graph 2 { private pNodeOneChild [] Node; 3 private int SumNode=5; 4 5 public Graph(){ 6 Node = new pNodeOneChild[SumNode]; 7 for(int i=0;i

  • 43

    46 } 47 }

    Output program adalah : [0]->1->3 [1]->2->4 [2]->1->4 [3] [4]->3

    Process completed.

    Praktikum : 1. Buat prosedur untuk mengetahui apakah sebuah graph terhubung ? 2. Rubah struktur data diatas sehingga setiap edge memuat nilai selain 1, misalkan menyatakan jarak atau cost. 3. Buat prosedur untuk mengetahui minimal spanning tree !

    Hash Ide dasar metode ini adalah tempat penyimpanan item berupa array terbatas dan indek penyimpanan untuk sebuah item ditentukan oleh fungsi hash. Fungsi hash mentransformasi sebuah item kedalam indek sesuai dengan ukuran array yang telah di buat. h(k) U {0,1,2,,m-1} dimana m adalah ukuran array. Sifat-sifat yang diharapkan dari h(k) adalah mudah dalam komputasi dan menghasilkan kunci distribus yang uniform sepanjang (0,1,2,,m-1), diharapkan h(k1) h(k2) apabila k1 k2 (tidak terjadi kolisi).

    Macam-macam fungs Hash Division Remainder Method

    Bentuk fungsi : h(k) = k mod m, dimana m adalah ukuran tabel Pilhan yang bagus untuk m adalah bilangan prima

    Praktikum : 1. Buat program fungsi hash diatas, dan hitung prosentasi terjadinya kolisi 2. Menurut pendapat anda, bagaimana fungsi hash apabila kunci bukan merupakan bilangan integer, misalkan terdapat pertanyaan dimana alamat satrio. Pertanyaan tersebut kemunkinan bisa dijawab dengan alamat[satrio] adalah surabaya. Buat program implementasi-nya.

    Selamat Mengerjakan, Semoga sukses