STRUKTUR DATA Struktur Data adalah : suatu koleksi atau kelompok data yang dapat dikarakteristikan oleh organisasi serta operasi yang didefinisikan terhadapnya. Pemakaian Struktur Data yang tepat didalam proses pemrograman, akan menghasilkan Algoritma yang lebih jelas dan tepat sehingga menjadikan program secara keseluruhan lebih sederhana.
Pada garis besarnya, Data dapat dikategorikan menjadi : A Pada garis besarnya, Data dapat dikategorikan menjadi : A. Type Data Sederhana / Data Sederhana Terdiri dari : 1. Data Sederhana Tunggal Misalnya : Integer, Real/Float, Boolean dan Character 2. Data Sederhana Majemuk Misalnya : String B. Struktur Data Terdiri dari : 1. Struktur Data Sederhana Misalnya Array dan Record
2. Struktur Data Majemuk Terdiri dari :. a. Linier 2. Struktur Data Majemuk Terdiri dari : a. Linier Misalnya : Stack, Queue dan Linear Linked List. b. Non Linier Misalnya : Pohon (Tree), Pohon Biner (Binary Tree), Pohon Cari Biner (Binary Search Tree), General Tree serta Graph.
ARRAY Array / Larik : Struktur Data Sederhana yang dapat didefinisikan sebagai pemesanan alokasi memory sementara pada komputer. Array dapat didefinisikan sebagai suatu himpunan hingga elemen yang terurut dan homogen. Terurut : Dapat diartikan bahwa elemen tersebut dapat diidentifikasi sebagai elemen pertama, elemen kedua dan seterusnya sampai elemen ke-n. Homogen : Adalah bahwa setiap elemen dari sebuah Array tertentu haruslah mempunyai type data yang sama.
Sebuah Array dapat mempunyai elemen yang seluruhnya berupa integer atau character atau String bahkan dapat pula terjadi suatu Array mempunyai elemen berupa Array. Karakteristik Array : 1. Mempunyai batasan dari pemesanan alokasi memory (Bersifat Statis) 2. Mempunyai Type Data Sama (Bersifat Homogen) 3. Dapat Diakses Secara Acak
3 Hal yang harus diketahui dalam mendeklarasikan array : a. Type data array b. Nama variabel array c. Subskrip / index array Jenis Array (yang akan dipelajari) adalah : a. Array Dimensi Satu (One Dimensional Array) b. Array Dimensi Dua (Two Dimensional Array) c. Array Dimensi Tiga (Thee Dimensional Array)
ARRAY DIMENSI SATU (One Dimensional Array) Dapat disebut juga dengan istilah vektor yang menggambarkan data dalam suatu urutan Deklarasi : Type_Data Nama_Variabel [index] Misalnya : int A[5]; Penggambaran secara Logika : Elemen Array 0 1 2 3 4 Subscript / Index A[1] A[2] A[3] A[4] A[5]
Rumus untuk menentukan jumlah elemen dalam Array : n (Elemen Array) i=1 = Perkalian dari elemen sebelumnya (untuk array dimensi dua & tiga) Contoh : Suatu Array A dideklarasikan sbb : int A[10]; maka jumlah elemen Array dimensi satu tersebut adalah = 10
ARRAY DIMENSI SATU KE STORAGE PEMETAAN (MAPPING) ARRAY DIMENSI SATU KE STORAGE Rumus : @A[i] = B + (i – 1) * L Dimana : @A[i] : Posisi Array yg dicari B : Posisi awal index di memory komputer i : Subkrip atau indeks array yg dicari L : Ukuran / Besar memory suatu type data Contoh : Suatu Array A dideklarasikan sebagai berikut : int A[5]; dengan alamat awal index berada di 0011 (H) dan ukuran memory type data integer = 2 Tentukan berapa alamat array A[3] ?
Rumus : @A[i] = B + (i – 1) * L Diketahui : @A[i] = A[3] B = 0011 (H) i = 3 L = 2 Penyelesaian : A[3] = 0011(H) + (3 – 1) * 2 = 0011(H) + 4 (D) = 0011(H) + 4 (H) = 0015(H) 4 Desimal = 4 Hexa 0011 A[1] A[2] A[3] A[4] A[5] 0013 0015 0017 0019 0 1 2 3 4
Contoh Penerapan Array Dimensi 1 Pada Program C++ 0 1 2 3 4 5 6 7 21d2 21d4 21d6 21d8 21da 21dc 21de 21e0 indeks value alamat %x adalah hexadesimal
2. ARRAY DIMENSI DUA (Two Dimensional Array) Deklarasi : Type_Data Nama_Variabel [Index1] [index2]; Misal : int A[3][2]; Penggambaran secara Logika : Sering digunakan dalam menterjemahkan matriks pada pemrograman. 0 1 1 2
Menentukan jumlah elemen dalam Array dimensi dua: n (Elemen array) i=1 = Perkalian dari elemen sebelumnya (untuk array dimensi dua & tiga) Contoh : Suatu Array X dideklarasikan sbb : int X[4][3]; maka jumlah elemen Array dimensi dua tersebut adalah : (4) * (3) = 12
ARRAY DIMENSI DUA KE STORAGE PEMETAAN (MAPPING) ARRAY DIMENSI DUA KE STORAGE Terbagi Dua cara pandang (representasi) yang berbeda : 1. Secara Kolom Per Kolom (Coloumn Major Order/CMO) @M[i][j] = M[0][0] + {(j - 1) * K + (i - 1)} * L 2. Secara Baris Per Baris (Row Major Order / RMO) @M[i][j] = M[0][0] + {(i - 1) * N + (j - 1)} * L Keterangan : @M[i][j] = Posisi Array yg dicari, M[0][0] = Posisi alamat awal index array,i = Baris, j = kolom, L = Ukuran memory type data K = Banyaknya elemen per kolom, N = Banyaknya elemen per baris
Penggambaran secara logika 0 1 1 2 Misal : int M[3][2]; (Array dengan 3 Baris & 2 Kolom) Berdasarkan Cara pandang : 1. Kolom Per Baris (Row Major Order / RMO) M[0,0] M[0,1] M[1,0] M[1,1] M[2,0] M[2,1] Jumlah elemen per baris = 2 2. Baris Per Kolom (Coloumn Major Order / CMO) M[0,0] M[1,0] M[2,0] M[0,1] M[1,1] M[2,1] Jumlah elemen per kolom = 3
Contoh Pemetaan : Suatu Array X dideklarasikan sebagai berikut : Float X[4][3], dengan alamat index X[0][0] berada di 0011(H) dan ukuran type data float = 4 Tentukan berapa alamat array X[3][2] berdasarkan cara pandang baris dan kolom ? 0 1 2 index 0011(H) ? 1 2 3 index
Lanjutan Contoh Pemetaan : Penyelesaian : Secara Baris Per Baris (Row Major Oder / RMO) @M[i][j] = @M[0][0] + {(i - 1) * N + (j - 1)} * L X[3][2] = 0011(H) + {(3 – 1) * 3 + (2 – 1)} * 4 = 0011(H) + 28 (D) 1C (H) = 0011(H) + 1C (H) = 002D(H)
Lanjutan Contoh Pemetaan : Penyelesaian : Secara Kolom Per Kolom (Coloumn Major Oder / CMO) @M[i][j] = @M[0][0] + {(j - 1) * K + (i - 1)} * L X[3][2] = 0011(H) + {(2 – 1) * 4 + (3 – 1)} * 4 = 0011(H) + 24 (D) 18 (H) = 0011(H) + 18 (H) = 0029(H)
3. ARRAY DIMENSI TIGA (Three Dimensional Array) Digunakan untuk mengelola data dalam bentuk 3 dimensi atau tiga sisi. Deklarasi : Type_Data Nama_Variabel [index1] [ndex2] [index3]; Misal : int A [3][4][2]; Penggambaran secara Logika : 1 2 3
Menentukan jumlah elemen dalam Array dimensi 3 : n (index array) i=1 = Perkalian dari statemen sebelumnya Contoh : Suatu Array X dideklarasikan sbb : int A [3][4][2]; maka jumlah elemen Array dimensi tiga tersebut adalah : (3) * (4) * (2) = 24
ARRAY DIMENSI TIGA KE STORAGE PEMETAAN (MAPPING) ARRAY DIMENSI TIGA KE STORAGE Rumus : @M[m][n][p] = M[0][0][0] + {((m-1) *(jum.elemen2 * jum.elemen3)) + ((n-1)*(jum.elemen 3)) + ((p-1)}* L Contoh : Suatu Array A dideklarasikan sebagai berikut : int A [2][4][3], dengan alamat awal index A[0][0][0] berada di 0011(H) dan ukuran type data int = 2 Tentukan berapa alamat array di A[2][3][2] ?
Contoh Pemetaan : Penyelesaian : Tentukan jumlah elemen array A [2][4][3] = (2) * (4) * (3) = 24 @M[m][n][p] = M[0][0][0] + {((m-1) *(jum.elemen2 * jum.elemen3)) + ((n-1)*(jum.elemen 3)) + ((p-1)}* L A[2][3][2] = 0011(H) + {((2–1) * 4 * 3) + ((3-1) * 3) + (2-1)} * 2 = 0011(H) + {12 + 6 + 1 } * 2 = 0011(H) + 38 (D) 26 (H) = 0011(H) + 26 (H) = 0037(H)
TRINGULAR ARRAY (ARRAY SEGITIGA) Tringular Array dapat merupakan Upper Tringular (seluruh elemen di bawah diagonal utama = 0), ataupun Lower Tringular (seluruh elemen di atas diagonal utama = 0). Dalam Array Lower Tringular dengan N baris, jumlah maksimum elemen <> 0 pada baris ke-I adalah = I, karenanya total elemen <> 0, tidak lebih dari N S I = N(N+1) / 2 I=1
Gambar (a) Upper Triangular Array (b) Lower Triangular Array Gambar (a) Upper Triangular Array (b) Lower Triangular Array
Contoh : Diketahui suatu array segitiga atas memiliki 3 baris dan kolom, tentukan berapakah jumlah elemen yang bukan nol pada array tersebut. I = N(N+1) / 2 I = 3 (3+1) / 2 = 12 / 2 = 6 Contoh bentuk array nya adalah seperti dibawah ini : 10 20 30 0 40 50 0 0 60 5 10 15 0 20 25 0 0 30 Dan lain-lain
PERTEMUAN 3 LINKED LIST KONSEP POINTER DAN LINKED LIST Untuk mengolah data yang banyaknya tidak bisa ditentukan sebelumnya, maka disediakan satu fasilitas yang memungkinan untuk menggunakan suatu perubah yang disebut dengan perubah dinamis (Dinamic variable) Perubah Dinamis (Dinamic variable) Suatu perubah yang akan dialokasikan hanya pada saat diperlukan, yaitu setelah program dieksekusi.
Contoh penggunaan pointer dalam program C++: Void main() { int x,y, Contoh penggunaan pointer dalam program C++: Void main() { int x,y,*z; x = 75; //nilai x = 75 y = x; //nilai y diambil dari nilai x z = &x; //nilai z menunjuk kealamat pointer dari nilai x getch(); }
LINKED LIST (LINKED LIST) Salah satu Struktur Data Dinamis yang paling sederhana adalah Linked List atau Struktur Berkait atau Senarai Berantai, yaitu suatu kumpulan komponen yang disusun secara berurutan dengan bantuan Pointer. Linked List (Senarai Berantai) disebut juga dengan Senarai Satu Arah (One-Way List). Masing-masing komponen dinamakan dengan Simpul (Node).
Setiap simpul dalam suatu Linked List terbagi menjadi dua bagian,yaitu : 1. Medan Informasi Berisi informasi yang akan disimpan dan diolah. 2. Medan Penyambung (Link Field) Berisi alamat berikutnya. Bernilai 0, Jika Link tersebut tidak menunjuk ke Data (Simpul) lainnya. Penunjuk ini disebut Penunjuk Nol.
Pembuatan Single Linked List non Circular Deklarasi Node : typedef struct TNode{ int data; TNode *next; }; Keterangan: Pembuatan struct bernama TNode yang berisi 2 field, yaitu field data bertipe integer dan field next yang bertipe pointer dari TNode
Setelah pembuatan struct, buat variabel head yang bertipe pointer dari TNode yang berguna sebagai kepala linked list. Digunakan perintah new untuk mempersiapkan sebuah node baru berserta alokasi memorinya, kemudian node tersebut diisi data dan pointer nextnya ditunjuk ke NULL. TNode *baru; baru = new TNode; baru->data = databaru; baru->next = NULL;
Deklarasi Pointer Penunjuk Head Single Linked List Manipulasi linked list tidak dapat dilakukan langsung ke node yang dituju, melainkan harus menggunakan suatu pointer penunjuk ke node pertama (Head) dalam linked list Deklarasinya sebagai berikut: TNode *head;
Fungsi Inisialisasi Single Linked List void init() { head = NULL; } Function untuk mengetahui kondisi Single Linked List Jika pointer head tidak menunjuk pada suatu node maka kosong int isEmpty() if (head == NULL) return 1; else return 0;
Menambah Node di Depan Penambahan node baru akan dikaitan di node paling depan, namun pada saat pertama kali (data masih kosong), maka penambahan data dilakukan dengan cara: node head ditunjukkan ke node baru tersebut. Prinsipnya adalah mengkaitkan node baru dengan head, kemudian head akan menunjuk pada data baru tersebut sehingga head akan tetap selalu menjadi data terdepan.
void insertDepan(int databaru) { TNode *baru; baru = new TNode; baru->data = databaru; baru->next = NULL; if(isEmpty()==1) head=baru; head->next = NULL; } else baru->next = head; head = baru; printf(”Data masuk\n”);
Menambah Node di Belakang Penambahan data dilakukan di belakang, namun pada saat pertama kali, node langsung ditunjuk oleh head. Penambahan di belakang membutuhkan pointer bantu untuk mengetahui node terbelakang. Kemudian, dikaitkan dengan node baru. Untuk mengetahui data terbelakang perlu digunakan perulangan.
void insertBelakang (int databaru) { TNode *baru,*bantu; baru = new TNode; baru->data = databaru; baru->next = NULL; if(isEmpty()==1) { head=baru; head->next = NULL; } else { bantu=head; while(bantu->next!=NULL){ bantu=bantu->next; bantu->next = baru; printf("Data masuk\n“);
Menghapus Node di Depan Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penggunakan suatu pointer lain (hapus) yang digunakan untuk menunjuk node yang akan dihapus, barulah kemudian menghapus pointer hapus dengan menggunakan perintah delete. Sebelum data terdepan dihapus, terlebih dahulu head harus menunjuk ke node berikutnya agar list tidak putus, sehingga node setelah head lama akan menjadi head baru Jika head masih NULL maka berarti data masih kosong!
void hapusDepan () { TNode *hapus; int d; if (isEmpty()==0){ if(head->next != NULL){ hapus = head; d = hapus->data; head = head->next; delete hapus; } else { d = head->data; head = NULL; } printf(“%d terhapus\n“,d); } else cout<<"Masih kosong\n";
Menghapus Node di Belakang Membutuhkan pointer bantu dan hapus. Pointer hapus digunakan untuk menunjuk node yang akan dihapus, pointer bantu untuk menunjuk node sebelum node yang dihapus yang akan menjadi node terakhir. Pointer bantu digunakan untuk menunjuk ke nilai NULL. Pointer bantu selalu bergerak sampai sebelum node yang akan dihapus, kemudian pointer hapus diletakkan setelah pointer bantu. Selanjutnya pointer hapus akan dihapus, pointer bantu akan menunjuk ke NULL.
void hapusBelakang(){ TNode *hapus,*bantu; int d; if (isEmpty()==0){ if(head->next != NULL){ bantu = head; while(bantu->next->next!=NULL){ bantu = bantu->next; } hapus = bantu->next; d = hapus->data; bantu->next = NULL; delete hapus; } else { d = head->data; head = NULL; printf(“%d terhapus\n“,d); } else printf(“Masih kosong\n“);
Function untuk menghapus semua elemen Linked List void clear() { TNode *bantu,*hapus; bantu = head; while(bantu!=NULL) hapus = bantu; bantu = bantu->next; delete hapus; } head = NULL;
Menampilkan / Membaca Isi Linked List Linked list ditelusuri satu-persatu dari awal sampai akhir node. Penelusuran dilakukan dengan menggunakan pointer bantu, karena pointer head yang menjadi tanda awal list tidak boleh berubah/berganti posisi. Penelusuran dilakukan terus sampai ditemukan node terakhir yang menunjuk ke nilai NULL. Jika tidak NULL, maka node bantu akan berpindah ke node selanjutnya dan membaca isi datanya dengan menggunakan field next sehingga dapat saling berkait. Jika head masih NULL berarti data masih kosong!
void tampil(){ TNode *bantu; bantu = head; if(isEmpty()==0){ while(bantu!=NULL){ cout<<bantu->data<<" "; bantu=bantu->next; } printf(“\n”); } else printf(“Masih kosong\n“);
Klik untuk Ilustrasi Stack Merupakan bentuk khusus dari Linier List yang pemasukan dan penghapusan elemennya hanya dapat dilakukan pada satu posisi, yaitu posisi akhir dari List (Top) Prinsip Stack adalah LAST-IN-FIRST-OUT (LIFO). Klik untuk Ilustrasi Stack
OPERASI STACK ISEMPTY Untuk memeriksa apakah stack kosong ISFULL Untuk memeriksa apakah stack sudah penuh PUSH Untuk menambahkan item pada posisi paling atas (TOP) POP Untuk menghapus item paling atas (TOP) CLEAR Untuk mengosongkan stack
STACK PADA ARRAY Deklarasi MAX_STACK #define MAX_STACK 5 Deklarasi STACK dengan struct dan array data typedef struct STACK{ int top; int data[5]; }; Deklarasi variabel stack dari struct STACK tumpuk;
Inisialisasi Pada mulanya isi top dengan -1, karena array dalam C/C++ dimulai dari 0, berarti stack adalah KOSONG TOP adalah variabel penanda dalam STACK yang menunjukkan elemen teratas Stack. TOP of STACK akan selalu bergerak hingga mencapai MAX of STACK sehingga menyebabkan stack PENUH void inisialisasi () { tumpuk.top = -1 } 4 3 2 1 TOP = -1 MAX_STACK
Fungsi IsEmpty int IsEmpty () { if (tumpuk.top == -1 return 1; else return 0; } Digunakan untuk memeriksa apakah stack masih dalam kondisi kosong Dengan cara memeriksa TOP of STACK. Jika TOP masih = -1 maka berarti stack masih kosong 4 3 2 1 TOP = -1 MAX_STACK
Fungsi IsFull Digunakan untuk memeriksa apakah kondisi stack sudah penuh Dengan cara memeriksa TOP of Stack. Jika TOP of STACK = MAX_STACK-1 maka FULL (Penuh). Jika TOP of STACK < MAX_STACK-1 maka belum penuh
E D C B A int IsFull () { if (tumpuk.top == MAX_STACK-1 return 1; else } 4 3 2 1 E D C B A TOP = 4 MAX_STACK
Fungsi PUSH Digunakan untuk memasukkan elemen ke dalam stack dan selalu menjadi elemen teratas stack Dengan cara : 1. Menambah satu (increment) nilai TOP of STACK setiap ada penambahan elemen stack selama stack masih belum penuh 2. Isikan nilai baru ke stack berdasarkan indeks TOP of STACK setelah ditambah satu (diincrement)
A void push (char d[5]) { tumpuk.top++ strcpy(tumpuk.data[tumpuk.top],d); } 4 3 2 1 4 3 2 1 A TOP = -1 MAX_STACK MAX_STACK PUSH ELEMEN A TOP = TOP + 1 = -1 + 1 = 0
Fungsi POP Digunakan untuk menghapus elemen yang berada pada posisi paling atas dari stack. Dengan cara : 1. Ambil dahulu nilai elemen teratas stack dengan mengakses TOP of STACK. 2. Tampilkan nilai yang akan diambil. 3. Lakukan decrement nilai TOP of STACK sehingga jumlah elemen stack berkurang 1
void pop () { printf(“Data yg di POP = %s\n”, tumpuk.data[tumpuk.top]); tumpuk.top--; } 4 3 2 1 C B A TOP = 2 MAX_STACK 4 3 2 1 B A Data yg di POP = C TOP = TOP - 1 = 2 - 1 = 1
Fungsi CLEAR Digunakan untuk mengosongkan stack / membuat stack hampa sehingga Top pada Stack berada kembali di posisi Top = -1 4 3 2 1 void clear () { tumpuk.data=tumpuk.top=-1 printf(“Data clear”); }
QUEUE Struktur Data Antrean (Queue) adalah suatu bentuk khusus dari List Linier dengan operasi pemasukan data hanya diperbolehkan pada salah satu sisi, yang disebut sisi Belakang / ekor (Tail) dan operasi penghapusan hanya diperbolehkan pada sisi lainnya yang disebut sisi Depan / kepala (Head) dari LinkedList. Prinsip Antrean : FIFO (First In First Out) FCFS (First Come First Serve)
Deklarasi Queue head = -1 tail = -1 0 1 2 3 4 5 6 7 Max = 8
OPERASI QUEUE CREATE Untuk menciptakan dan menginisialisasi Queue Dengan cara membuat Head dan Tail = -1 ISEMPTY Untuk memeriksa apakah queue kosong ISFULL Untuk memeriksa apakah queue sudah penuh ENQUEUE Untuk menambahkan item pada posisi paling belakang DEQUEUE Untuk menghapus item dari posisi paling depan CLEAR Untuk mengosongkan queue
Fungsi Create Digunakan untuk membentuk dan menunjukan awal terbentuknya suatu Antrean / Queue Void Create() { antrian.head = antrian.tail = -1 } 0 1 2 3 4 5 6 7 Max = 8 head = -1 tail = -1 Antrian pertama kali
Fungsi IsEmpty Untuk memeriksa apakah Antrian penuh atau kosong Dengan cara memeriksa nilai Tail, jika Tail = -1 maka antrian kosong (empty) Head adalah tanda untuk kepala antrian (elemen pertama dalam antrian) yang tidak akan berubah-ubah Pergerakan pada Antrian terjadi dengan penambahan elemen Antrian kebelakang, yaitu menggunakan nilai Tail
Int IsEmpty() { if (antrian.tail == -1) return 1; else return 0; } 0 1 2 3 4 5 6 7 Max = 8 head = -1 tail = -1 Antrian kosong Karena tail = -1
Fungsi IsFull Untuk mengecek apakah Antrian sudah penuh atau belum Dengan cara : - Mengecek nilai Tail - Jika tail = MAX-1 berarti antrian sudah penuh (MAX-1 adalah batas elemen array dalam program C++)
5 10 35 20 15 30 40 25 Int IsFull() { if (antrian.tail == Max-1) return 1; else return 0; } 5 10 35 20 15 30 40 25 0 1 2 3 4 5 6 7 Max = 8 head = 0 Antrian penuh karena Head = 0 tail = max - 1 tail = 7
Fungsi Enqueue Untuk menambahkan elemen ke dalam Antrian, penambahan elemen selalu dilakukan pada elemen paling belakang Penambahan elemen selalu menggerakan variabel Tail dengan cara menambahkan Tail terlebih dahulu
Fungsi Dequeue Digunakan untuk menghapus elemen terdepan (head) dari Antrian Dengan cara : menggeser semua elemen antrian kedepan dan mengurangi Tail dgn 1. Penggeseran dilakukan dengan menggunakan looping
Fungsi Clear Untuk menghapus elemen-elemen Antrian dengan cara membuat Tail dan Head = -1 Penghapusan elemen-elemen Antrian sebenarnya tidak menghapus arraynya, namun hanya mengeset indeks pengaksesan-nya ke nilai -1 sehingga elemen-elemen Antrian tidak lagi terbaca sehingga mengembalikan antrian seperti keadaan semula
Antrian setelah di lakukan Clear 0 1 2 3 4 5 6 7 Max = 8 head = -1 tail = -1 Antrian kosong Karena tail = -1
TREE Pohon atau Tree adalah salah satu bentuk Graph terhubung yang tidak mengandung sirkuit. Karena merupakan Graph terhubung, maka pada Pohon (Tree) selalu terdapat Path atau Jalur yang menghubungkan setiap simpul dalam dua pohon. Pohon (Tree) dapat juga didefinisikan sebagai kumpulan elemen yang salah satu elemennya disebut dengan Akar (Root) dan sisa elemen lain (Simpul) yang terpecah menjadi sejumlah himpunan yang saling tidak berhubungan yang disebut dengan Subpohon (Subtree) atau cabang
Sifat utama Pohon Berakar 1. Jika Pohon mempunyai Simpul sebanyak n, maka banyaknya ruas atau edge adalah (n-1). 2. Mempunyai Simpul Khusus yang disebut Root, jika Simpul tersebut memiliki derajat keluar >= 0, dan derajat masuk = 0. 3. Mempunyai Simpul yang disebut sebagai Daun / Leaf, jika Simpul tersebut berderajat keluar = 0, dan berderajat masuk = 1. 4. Setiap Simpul mempunyai Tingkatan / Level yang dimulai dari Root yang Levelnya = 1 sampai dengan Level ke - n pada daun paling bawah. Simpul yang mempunyai Level sama disebut Bersaudara atau Brother atau Stribling.
5. Pohon mempunyai Ketinggian atau Kedalaman atau 5. Pohon mempunyai Ketinggian atau Kedalaman atau Height, yang merupakan Level tertinggi 6. Pohon mempunyai Weight atau Berat atau Bobot, yang banyaknya daun (leaf) pada Pohon. 7. Banyaknya Simpul Maksimum sampai Level N adalah : 2 (N) - 1 8. Banyaknya Simpul untuk setiap Level I adalah : N 2 ( I – 1) I = 1 Hutan (Forest) adalah kumpulan Pohon yang tidak saling berhubungan
Diketahui suatu bentuk Pohon Berakar T sebagai berikut : Pohon Diatas Mempunyai : a. Simpul sebanyak = 8 dan edge = n - 1 = 8 – 1 = 7 b. Root pada Pohon T diatas adalah Simpul P c. Mempunyai daun (Leaf) = 4, yaitu = R, S, V dan W
d. Level (tingkatan) Pohon = 4 yaitu :. Level 1 = Simpul P d. Level (tingkatan) Pohon = 4 yaitu : Level 1 = Simpul P Level 2 = Simpul Q dan T Level 3 = Simpul R, S dan U Level 4 = Simpul V dan W e. Ketinggian atau kedalaman = jumlah level = 4 f. Weight atau berat atau bobot = jumlah daun = 4 Dalam gambar Pohon T diatas dapat dibentuk 2 buah hutan (forest), bila simpul P dihilangkan, yaitu : Hutan 1 : Q,R,S Hutan 2 : T,U,V,W
g. Banyaknya Simpul Maksimum yang dapat terbentuk g. Banyaknya Simpul Maksimum yang dapat terbentuk sampai Level 4 (bila simpul pada pohon dianggap penuh) adalah : 2 (N) – 1 2 (4) – 1 = 16 – 1 = 15
h. Banyaknya Simpul maksimum untuk setiap Level I h. Banyaknya Simpul maksimum untuk setiap Level I (bila simpul pada pohon dianggap penuh) adalah : Maksimum Simpul pada level 2 = 2 ( I – 1) = 2 (2-1) = 2 Maksimum Simpul pada level 3 = 2 (3-1) = 4 Maksimum Simpul pada level 4 = 2 (4-1) = 2
POHON BINAR (BINARY TREE) Struktur ini biasanya digunakan untuk menyajikan data yang mengandung hubungan hirarkial antara elemen-elemennya. Bentuk Pohon Berakar yang lebih mudah dikelola dalam komputer adalah Pohon Biner (Binary Tree) yang lebih dikenal sebagai Pohon Umum (General Tree) yang dapat didefinisikan sebagai kumpulan simpul yang mungkin kosong atau mempunyai akar dan dua Subpohon yang saling terpisah yang disebut dengan Subpohon Kiri / cabang kiri (Left Subtree) dan Subpohon Kanan / cabang kanan (Right Subtree).
Karakteristik Pohon Binar (Binary Tree) : 1 Karakteristik Pohon Binar (Binary Tree) : 1. Setiap Simpul paling banyak hanya memiliki dua buah anak 2. Derajat Tertinggi dari setiap Simpul adalah dua. 3. Dibedakan antara Cabang Kiri dan Cabang Kanan. 4. Dimungkinkan tidak mempunyai Simpul Berikut ini diberikan contoh gambar Pohon Binar (Binary Tree) dengan Cabang Kiri dan Cabang Kanan.
ISTILAH PADA POHON BINER Pohon Biner Penuh (Full Binary Tree) Semua simpul (kecuali daun) memiliki 2 anak dan tiap cabang memiliki panjang ruas yang sama A B C D E F G Pohon Biner Lengkap (Complete Binary Tree) Hampir sama dengan Pohon Biner Penuh, semua simpul (kecuali daun) memiliki 2 anak tetapi tiap cabang memiliki panjang ruas berbeda A B C D E
Dua pohon yang memiliki struktur yang sama tetapi informasinya berbeda Pohon Biner Similer Dua pohon yang memiliki struktur yang sama tetapi informasinya berbeda A B C P Q R Pohon Biner Ekivalent Dua pohon yang memiliki struktur dan informasi yang sama P Q R P Q R
Pohon Biner Miring (Skewed Tree) Dua pohon yang semua simpulnya mempunyai satu anak / turunan kecuali daun
Deklarasi Pohon Biner (Dengan Program C++) Dalam setiap simpul selalu berisi dua buah Pointer untuk menunjuk ke cabang Kiri dan cabang Kanan dan informasi yang akan disimpan dalam simpul tersebut.
Penyajian Pohon Binar (Binary Tree) Tree dapat dibuat dengan menggunakan linked list secara rekursif. Linked list yang digunakan adalah double linked list non circular Data yang pertama kali masuk akan menjadi node root. Data yang lebih kecil dari data node root akan masuk dan menempati node kiri dari node root, sedangkan jika lebih besar dari data node root, akan masuk dan menempati node di sebelah kanan node root.
Bila diberikan untai HAKJCBL, maka proses untuk dapat membentuk pohon biner dari untai diatas adalah : 1. Karakter pertama ‘H’ ditempatkan sebagai akar (root) 2. Karakter ‘A’,karena lebih kecil dari ‘H’, maka akan menempati cabang kiri. 3. Karakter ‘K’, karena lebih besar dari ‘H’, maka akan menempati cabang kanan. 4. Karakter ‘J’, lebih besar dari ‘H’ dan kecil dari ‘K’, maka menempati cabang kiri ‘K’.
Dan begitu seterusnya sehingga terbentuk pohon biner seperti berikut :
3. Kunjungan secara Postorder, mempunyai urutan : a 3. Kunjungan secara Postorder, mempunyai urutan : a. Kunjungi Cabang Kiri b. Kunjungi Cabang Kanan c. Cetak isi simpul yang dikunjungi (Simpul Akar)
Pada ketiga cara kunjungan diatas, kunjungan ke Cabang Kiri dilakukan terlebih dahulu, baru kemudian kunjungan ke Cabang Kanan. Dengan orientasi semacam ini, Ketiga kunjungan diatas disebut dengan Left To Right Oriented (LRO). Jika kunjungan ke Cabang Kanan dilakukan lebih dahulu baru kemudian kunjungan ke Cabang Kiri, maka Orientasi semacam ini disebut Right To Left Oriented (RLO).
A B C D E A B D E C Klik Animasi
Klik Animasi
Kunjungan PreOrder dalam Program C++
A B C D E D B E A C Klik Animasi
Klik Animasi
Kunjungan InOrder dalam Program C++
3. Kunjungan secara Postorder, mempunyai urutan : a 3. Kunjungan secara Postorder, mempunyai urutan : a. Kunjungi Cabang Kiri b. Kunjungi Cabang Kanan c. Cetak isi simpul yang dikunjungi (Simpul Akar) A B C D E D E B C A Klik Animasi
Klik Animasi
Kunjungan PostOrder dalam Program C++
Kunjungan LevelOrder Selain kunjungan yang dijelaskan diatas, masih ada satu macam kunjungan masih ada satu macam kunjungan lagi yaitu kunjungan LevelOrder. Kunjungan dimulai dari simpul yang ada pada tingkat 1 (Akar), diteruskan pada simpul di tingkat 2, tingkat 3 dan seterusnya.
Secara singkat kunjungan Level Order ini dapat dijelaskan sebagai berikut. 1. Dimulai dengan memasukkan Akar kedalam antrean. 2. Kemudian mengeluarkan Akar tersebut keluar dari antrean. Pada saat Akar tersebut dikeluarkan dari antrean, cabang kiri dan cabang kanan secara berturut-turut dimasukkan dalam antrean. Dengan kata lain jika suatu elemen dikeluarkan dari antrean, maka cabang kiri dan kanan dari elemen yang baru saja dikeluarkan dimasukkan kedalam antrean.
APLIKASI POHON BINER NOTASI PREFIX, INFIX DAN POSTFIX Pada bagian ini akan dibahas tentang bagaimana menyusun sebuah Pohon Binar yang apabila dikunjungi secara PreOrder akan menghasilkan Notasi Prefix, kunjungan secara InOrder menghasilkan Notasi Infix, dan kunjungan PostOrder menghasilkan Notasi Postfix.
Berdasarkan Gambar diatas, apabila dilakukan kunjungan secara PreOrder, maka akan diperoleh Notasi Prefix dari persamaan-persamaan yang digambarkan tersebut, yaitu : +A*BC (Gambar.a) *+AB-BC (Gambar.b) ^-*+ABC-DE+FG (Gambar.c) Jika dilakukan kunjungan secara InOrder, akan diperoleh Notasi Infixnya, yaitu : (A+(B*C)) (Gambar.a) ((A+B) * (B-C)) (Gambar.b) (((A+B) * C) – (D-E)^(F+G) (Gambar.c)
Jika dilakukan kunjungan secara PostOrder, akan diperoleh Notasi Postfixnya, yaitu : ABC*+ (Gambar.a) AB+BC-* (Gambar.b) AB+C*DE-FG+^ (Gambar.c)
GRAPH Suatu Graph mengandung 2 himpunan, yaitu : 1. Himpunan V yang elemennya disebut simpul (Vertex atau Point atau Node atau Titik) 2. Himpunan E yang merupakan pasangan tak urut dari simpul. Anggotanya disebut Ruas (Edge atau rusuk atau sisi) Graph seperti dimaksud diatas, ditulis sebagai G(E,V).
Contoh : Gambar berikut menanyakan Graph G(E,V) dengan : 1 Contoh : Gambar berikut menanyakan Graph G(E,V) dengan : 1. V mengandung 4 simpul, yaitu simpul A,B,C,D. 2. E mengandung 5 ruas, yaitu : e1 = (A,B) e4 = (C,D) e2 = (B,C) e5 = (B,D) e3 = (A,D)
Gambar dibawah ini menyatakan suatu Multigraph Gambar dibawah ini menyatakan suatu Multigraph. Disini, ruas e2 pada kedua titik ujungnya adalah simpul yang sama, yaitu simpul A. Ruas semacam ini disebut Gelung atau Self-Loop. Sedangkan ruas e5 dan e6 mempunyai titik ujung yang sama, yaitu simpul-simpul B dan C. Kedua ruas ini disebut ruas berganda atau ruas sejajar. e5 e4 e3 e2 e1 e6
Suatu Graph yang tidak mengandung ruas sejajar maupun self-loop, sering disebut juga sebagai Graph sederhana atau simple Graph. Suatu Graph G’(E’,V’) disebut Sub Graph dari G(E,V), bila E’ himpunan bagian dari E dan V’ himpunan bagian dari V. Jika E’ mengandung semua ruas dari E yang titik ujungnya di V’, maka G’ disebut Subgraph yang direntang oleh V’ (Spanning Subgraph).
Contoh Sub Graph:
Contoh Spanning Sub Graph :
GRAPH BERLABEL Graph G disebut berlabel jika ruas dan atau simpulnya dikaitkan dengan suatu besaran tertentu. Khususnya jika setiap Ruas e dari G dikaitkan dengan suatu bilangan non negatif d(e), maka d(e) disebut bobot atau panjang dari ruas e.
Contoh : Gambar berikut ini menyajikan hubungan antar kota. Disini simpul menyatakan kota dan label d(e) menyatakan jarak antara dua kota.
DERAJAT GRAPH Derajat simpul V, ditulis d(v) adalah banyaknya ruas yang menghubungi v. Karena setiap ruas dihitung dua kali ketika menentukan derajat suatu Graph, maka : Jumlah derajat semua simpul suatu Graph (derajat) = dua kali banyaknya ruas Graph (Size) Atau dapat dituliskan : Derajat Graph = 2 x Size
Pada gambar diatas Jumlah Semua Simpul = 4, maka Jumlah Derajat Semua Simpul = 8 Jika Derajat masing-masing simpul pada Graph berjumlah Genap maka Graph tersebut disebut EULER Graph
E D B C A F Contoh :
Pada gambar diatas, banyak ruas/size = 7, sedangkan derajat masing-masing simpul adalah : d(A) = 2 d(B) = 5 d(C) = 3 d(D) = 3 d(E) = 1 d(F) = 0 maka, total jumlah derajat simpul adalah : 14 E disebut simpul bergantung/akhir, yaitu simpul yang berderajat satu. Sedangkan F disebut simpul terpencil, yaitu simpul yang berderajat Nol.
KETERHUBUNGAN Walk atau perjalanan dalam Graph G adalah barisan simpul dan ruas berganti-ganti : V1,e1,V2,e2,......., e n-1, Vn Disini ruas ei menghubungkan simpul Vi dan Vi+1. Banyaknya ruas disebut Panjang Walk. Walk dapat ditulis lebih singkat dengan hanya menulis deretan ruas : e1,e2, ...., en-1 atau deretan simpul : V1, V2,....., Vn-1, Vn dimana : V1 = simpul awal Vn = simpul akhir. Walk disebut tertutup bila V1 = Vn
·. Barisan ruas a,b,c,d,b,f,g,h adalah Walk bukan Trail · Barisan ruas a,b,c,d,b,f,g,h adalah Walk bukan Trail (karena ruas b dua kali muncul). · Barisan simpul A, B, E, F bukan Walk (karena tdk ada ruas yang menghubungkan simpul B ke F). · Barisan simpul A, B, C, D, E, C, F adalah Trail bukan Jalur/Path (karena c dua kali muncul) · Barisan ruas a, d, g, k adalah Jalur/Path karena menghubungkan A dengan F · Ruas a, b, h, g, e, a, adalah Cycle. Graph yang tidak mengandung Cycle disebut Acyclic. Contoh dari Graph Acyclic adalah pohon atau Tree.
MATRIKS PENYAJIAN GRAPH Misalnya disajikan Graph G dalam Matriks ruas B ukuran (M x 2), maka setiap baris Matriks menyatakan ruas, misalnya baris (4 7) menyatakan ada ruas menghubungkan simpul 4 dan 7. Matriks Adjacency dari Graph G, yaitu Matriks yang menghubungkan Vertex dengan Vertex, tanpa ruas sejajar adalah Matriks A berukuran (N x N) yang bersifat : 1 , bila ada ruas (Vi, Vj) aij= 0, bila dalam hal lain.
Matriks Adjacency merupakan matriks simetri Matriks Adjacency merupakan matriks simetri. Untuk Graph dengan ruas sejajar, Matriks Adjacency didefinisikan sebagai berikut : P, bila ada p buah ruas menghubungkan aij = (Vi, Vj)(p>0) 0, bila dalam hal lain. Matriks Incidence dari Graph G, yaitu Matriks yang menghubungkan Vertex dengan Edge, tanpa self-loop didefinisikan sebagai Matriks M berukuran (NXM) sebagai berikut : 1, bila ada ruas ej berujung di simpul Vi mij = 0, dalam hal lain.
e1 e2 e3 e4 e5 e6 e7 e8 V1 1 1 0 1 1 0 0 0 V2 1 0 1 0 0 0 0 0 V3 0 1 1 0 0 1 1 0 V4 0 0 0 1 0 1 0 1 V5 0 0 0 0 0 1 0 1
GRAPH TERARAH (DIRECTED GRAPH / DIGRAPH) Graph terarah adalah Graph yang dapat menghubungkan V1 ke V2 saja (1 arah). Maksimum jumlah busur dari n simpul adalah : n ( n - 1) Suatu Graph Berarah (Directed Graph) D terdiri atas 2 himpunan : 1) Himpunan V, anggotanya disebut simpul. 2) Himpunan A, merupakan himpunan pasangan terurut, yang disebut ruas berarah atau arkus.
Contoh, Gambar dibawah ini adalah sebuah Graph Berarah D(V,A) dengan : 1. V mengandung 4 simpul, yaitu 1, 2, 3 dan 4 2. A mengandung 7 arkus, yaitu (1,4) ,(2,1), (2,1), (4,2), (2,3), (4,3) dan (2) Arkus (2,2) disebut gelung (self-loop), sedangkan arkus (2,1) muncul lebih dari satu kali, disebut arkus sejajar atau arkus berganda.
Bila arkus suatu Graph Berarah menyatakan suatu bobot, maka Graph Berarah tersebut dinamakan jaringan / Network. Biasanya digunakan untuk menggambarkan situasi dinamis. Bila V’ himpunan bagian dari V serta A’ himpunan bagian dari A, dengan titik ujung anggota A’ terletak di dalam V’, maka dikatakan bahwa D’(V’,A’) adalah Graph bagian (Subgraph) dari D(V,A). Bila A’ mengandung semua arkus anggota A yang titik ujungnya anggota V’, maka dikatakan bahwa D’(V’,A’) adalah Graph Bagian yang dibentuk atau direntang oleh V’.
CRITICAL PATH 1 2 4 3 5
MINIMUM SPANNING TREE Merupakan Spanning Tree yang mempunyai Bobot dan tidak mempunyai arah dengan hasil penjumlahan bobotnya adalah minimum. Lihat gambar Graph G berikut : V1 V2 V4 V3 V5
Total Minimum Spanning Tree = 22 Langkah yang dilakukan untuk membentuk minimum spanning tree adalah : Bentuk kembali semua simpul tetapi tanpa ruas. Gambar dan telusuri ruas dengan bobot paling kecil, seterusnya (secara ascending) hingga semua simpul terhubung (4) V1 V2 V3 V4 V5 (5) (6) (7) Total Minimum Spanning Tree = 22
Karena V8 sudah dilewati setelah penelusuran ke V4, maka penelusuran yang berikutnya dianggap tidak dilewati lagi Klik Animasi
2. Breadth First Search (BFS) 2. Breadth First Search (BFS). Berbeda dengan cara BFS, dengan BFS penelusuran akan diawasi dari Node-1, kemudian melebar pada Adjacent Node dari Node-1 dan diteruskan pada Node-2, Node- 3 dan seterusnya.
Dari gambar di atas akan diperoleh urutan : V1 , V2 ---> V3 , V4 ---> V5 ---> V6 ---> V7, V8 Klik Animasi