Selasa, 27 Maret 2018

Pertemuan ke - 4 - Introduce Tree, Binary Tree - 2101691676 - Handi Putra Tjioe

TREE


Tree adalah bentuk struktur data non-linear, dengan bentuk 2 dimensi yang mempunyai properti yang berbeda dari struktur data linear lainnya, seperti: 

Linked list
- Queue
- Stack.


Sama seperti struktur data lainnya tree juga mengandung node yang juga dihubungkan dengan pointer-pointer lainnya untuk mengakses data yang ada pada tree.

Umumnya, dapat dikategorikan bahwa tree adalah kumpulan dari subtree-subtree yang digabungkan menjadi sebuah tree. sementara ada juga istilah forest yang merupakan kumpulan dari tree.

Bagian-bagian yang ada pada tree:

1. Node
    Pada tree sendiri banyak istilah node yang berbeda yakni:
- Root node : node pertama (puncak) dari sebuah tree

- Terminal node/Leaf node : node yang tidak memiliki child, sehingga memiliki degree 0

2. Root/root node
Akar dari sebuah tree dimana akan diturunkan kepada child nodenya sendiri

3. Children
Turunan dari parent/anchestor sehingga menghasilkan node yang baru pada sebuah tree

4. Siblings
Node yang memiliki children yang sama, dari sebuah parent


di bawah akan diuraikan istilah-istilah umum dalam tree :

    1. Prodecessor : node yang berada diatas node tertentu.
    2. Successor : node yang berada di bawah node tertentu.
    3. Ancestor : seluruh node yang terletak sebelum node tertentu dan terletak pada jalur yang sama.
    4. Descendant : seluruh node yang terletak sesudah node tertentu dan terletak pada jalur yang sama.
    5. Parent : predecssor satu level di atas suatu node.
    6. Child : successor satu level di bawah suatu node.
    7. Sibling : node-node yang memiliki parent yang sama dengan suatu node.
    8. Subtree : bagian dari tree yang berupa suatu node beserta descendantnya dan memiliki semua karakteristik dari tree tersebut.
    9. Size : banyaknya node dalam suatu tree.
    10. Height : banyaknya tingkatan/level dalam suatu tree.
    11. Root : satu-satunya node khusus dalam tree yang tak punya predecssor.
    12. Leaf : node-node dalam tree yang tak memiliki seccessor.
    13. Degree : banyaknya child yang dimiliki suatu node




BINARY TREE


Binary tree adalah sejenis tree yang dimana pada setiap node hanya bisa mengandung/memiliki 2 node saja untuk diturunkan ke node selanjutnya.

Jenis-jenis binary tree :

1. Perfect binary tree
Jenis binary tree yang semua level atau depth sama.

2.Completed binary tree
  
3.Skewed binary tree

4. Balanced binary tree


Operasi-operasi pada Binary Tree :

  1. Create : Membentuk binary tree baru yang masih kosong.
  2. Clear : Mengosongkan binary tree yang sudah ada.
  3. Empty : Function untuk memeriksa apakah binary tree masih kosong.
  4. Insert : Memasukkan sebuah node ke dalam tree. Ada tiga pilihan insert: sebagai root, left child, atau right child. Khusus insert sebagai root, tree harus dalam keadaan kosong.
  5. Find : Mencari root, parent, left child, atau right child dari suatu node. (Tree tak boleh kosong)
  6. Update : Mengubah isi dari node yang ditunjuk oleh pointer current. (Tree tidak boleh kosong)
  7. Retrieve : Mengetahui isi dari node yang ditunjuk pointer current. (Tree tidak boleh kosong)
  8. DeleteSub : Menghapus sebuah subtree (node beserta seluruh descendantnya) yang ditunjuk current. Tree tak boleh kosong. Setelah itu pointer current akan berpindah ke parent dari node yang dihapus.
  9. Characteristic : Mengetahui karakteristik dari suatu tree, yakni : size, height, serta average lengthnya. Tree tidak boleh kosong. (Average Length = [jumlahNodeLvl1*1+jmlNodeLvl2*2+…+jmlNodeLvln*n]/Size)
  10. Traverse : Mengunjungi seluruh node-node pada tree, masing-masing sekali. Hasilnya adalah urutan informasi secara linier yang tersimpan dalam tree. Ada tiga cara traverse : Pre Order, In Order, dan Post Order.

Pertemuan ke - 5 - Binary Search Tree - 2101691676 - Handi Putra Tjioe

Binary Search Tree ( Pengantar Struktur Data )

Pengertian Binary Tree

Binary Tree adalah struktur data yang hampir mirip juga dengan Linked List untuk menyimpan koleksi  dari  data.  Linked  List  dapat  dianalogikan  sebagai  rantai  linier sedangkan Binary Tree bisa digambarkan sebagai rantai tidak linier. Binary Tree dikelompokkan menjadi unordered Binary Tree (tree yang tidak berurut) dan ordered Binary Tree (tree yang terurut).

Binary Tree dapat digambarkan berdasarkan kondisinya, sebagai berikut:


Gambaran dari Binary Tree yang terdiri dari 3 (tiga) node:


Binary Search Tree (BST)

Binary Search Tree adalah tree yang terurut (ordered Binary Tree). Aturan yang harus dipenuhi untuk membangun sebuah BST adalah sebagai berikut:

Semua data dibagian kiri sub-tree dari node t selalu lebih kecil dari data dalam node t itu sendiri.

Semua data dibagian kanan sub-tree dari node t selalu lebih besar atau sama dengan data dalam node t.


Pembentukan BST

Bila diketahui sederetan data 5, 3, 7, 1, 4, 6, 8, 9 maka proses inserting (memasukkan) data tersebut dalam algoritma BST langkah per langkah adalah sebagai berikut.

Langkah 1: Pemasukan data 5 sebagai root

Langkah 2: Pemasukan data 3 disebelah kiri simpul 5 karena 3 < 5.

Langkah 3: Pemasukan data 7 disebelah kanan simpul 5 karena 7 > 5.


Langkah 4:   Pemasukan data 1. Karena data 1 lebih kecil dari data di root yaitu 5 maka penelusuran dilanjutkan kesebelah kiri root. Kemudian karena disebelah kiri sudah ada daun dengan nilai 3 dan data 1 lebih kecil dari data 3 maka data 1 disisipkan disebelah kiri simpul 3.


Langkah 5:   Pemasukan data 4.



Langkah 6:   Pemasukan data 6. Karena data 6 lebih besar dari data di root yaitu 5 maka penelusuran dilanjutkan kesebelah kanan root. Kemudian karena disebelah kanan sudah ada simpul dengan nilai 7 dan data 6 lebih kecil dari data 7 maka data 6 disisipkan disebelah kiri simpul 7.




Langkah 7:   Pemasukan data 8. Karena data 8 lebih besar dari data di root yaitu 5 maka penelusuran dilanjutkan kesebelah kanan root. Kemudian karena disebelah kanan sudah ada simpul dengan nilai 7 dan karena data 8 lebih besar dari data 7 maka data 8 disisipkan disebelah kanan simpul 7. 




Langkah 8:   Pemasukan data 9. Karena data 9 lebih besar dari data di root yaitu 5 maka penelusuran dilanjutkan kesebelah kanan root. Kemudian karena disebelah kanan bukan merupakan daun yaitu simpul dengan nilai 7 dan karena data 9 lebih besar dari data 7 penelusuran terus dilanjutkan kesebelah kanan. Selanjutnya ditemukan daun dengan nilai 8, karena data 9 lebih besar dari 8 maka data 9 disisipkan disebelah kanan simpul 8.




Implementasi BST


Diskusikan  secara  kelompok  implementasi  dari  algoritma  Binary  Search  Tree berikut ini.

















Bagian  deklarasi  di atas  kita asumsikan  disimpan  menjadi  sebuah  header  file dengan nama bst.h. Fungsi-fungsi di bawah ini kita asumsikan disimpan dalam bst.c

























Menghapus Simpul Dalam BST

Menghapus simpul (node) dalam BST merupakan proses yang lumayan rumit. Namun, penghapusan merupakan hal yang penting dan sering dilakukan dibanyak aplikasi yang menggunakan struktru data BST. Langkah awal dalam menghapus simpul dalam BST adalah  mencari  simpul  (node)  yang  ingin  dihapus.  Setelah  simpul  ditemukan,  ada  3 kondisi (kasus) yang mungkin:

1.   Simpul  yang  ingin  dihapus  adalah  simpul  daun  (leaf),  yaitu  simpul  yang  tidak memilik sub
      node
2.   Simpul yang ingin dihapus memiliki satu sub node (satu anak)
3.   Simpul yang ingin dihapus memiliki dua sub node (dua anak, di kiri dan di kanan)

Kasus 1: Simpul yang ingin dihapus adalah simpul daun
Untuk menghapus  simpul  ini, pointer  dari parent  yang menunjuknya  diubah  menjadi
NULL  dan  menggunakan  sebuah  pointer  yang  tunjuk  ke simpul  yang  akan  dihapus, simpul di hapus dari memori.



Kasus 2: Simpul yang ingin dihapus adalah simpul dengan satu sub-node
Untuk menghapus simpul yang memiliki satu anak, naikkan 1 level semua sub node dari simpul yang dihapus. Coba hapus simpul 7.



Kasus 3: Simpul yang ingin dihapus adalah simpul dengan dua sub-node
Kasus ini sedikit lebih rumit. Untuk menghapus simpul tertentu, simpul successor dari
simpul yang akan dihapus harus ditemukan dulu. Kemudian,  ganti simpul yang ingin dihapus dengan simpul successor dan hapus simpul successor tersebut. Coba hapus node 7.


Selasa, 13 Maret 2018

Pertemuan ke - 3 - Linked List Implementation II - 2101691676 - Handi Putra Tjioe



Linked List Implementation II



Sub Topik Stack : 


   Introduction to Linked List :


-Stack Concept
-Stack using Array and Linked List
-Infix, Postfix and Prefix Notation
-Evaluation
-Conversion
-Depth First Search
-Queue Concept
-Queue using Array and Linked List
-Priority Queues
-Breadth First Search



1. Stack Concept

Stack adalah struktur data penting yang menyimpan unsur-unsurnya secara teratur




Analogi:


Anda pasti pernah melihat setumpuk piring tempat piring diletakkan di atas yang lain. Bila Anda ingin melepaskan piring, Anda melepaskan piring paling atas terlebih dahulu. Oleh karena itu, Anda dapat menambahkan dan menghapus elemen (yaitu pelat) hanya di / dari satu posisi yang merupakan posisi paling atas.

Stack sebenarnya apa :

  • Stack adalah struktur data linier yang dapat diimplementasikan dengan menggunakan array atau linked list.
  • Elemen dalam tumpukan ditambahkan dan dihapus hanya dari satu ujung, yang disebut bagian atas.
  • Data disimpan dalam cara Last In First Out (LIFO).





2. Array Representation


Stack mempunyai 2 variable, yaitu :

  • TOP yang digunakan untuk menyimpan alamat elemen paling atas dari stack
  • MAX yang digunakan untuk menyimpan jumlah maksimum elemen yang dapat disimpan stack

  • Jika TOP = NULL, maka menunjukkan bahwa stack kosong
  • Jika TOP = MAX - 1, maka stack sudah penuh

  • TOP = 4, insertion dan deletion akan dilakukan pada posisi ini



3. Linked List Representation

Teknik membuat stack menggunakan array lebih mudah, namun kekurangannya adalah array harus dinyatakan memiliki beberapa ukuran tetap.

Dalam sebuah linked stack, setiap node memiliki dua bagian:

  • Yang menyimpan data
  • Salah satu yang menyimpan alamat simpul berikutnya
  • Petunjuk START dari linked list digunakan sebagai TOP
  • Semua penyisipan dan penghapusan dilakukan pada simpul yang ditunjukkan oleh TOP
  • Jika TOP = NULL, maka itu menunjukkan bahwa stack kosong




4. Stack Operations

  • dorong (x): tambahkan item x ke bagian atas tumpukan.
  • pop (): hapus item dari atas tumpukan.
  • top (): mengungkapkan / mengembalikan item teratas dari stack.

Catatan: atas juga dikenal sebagai mengintip.


Contoh dari Stack Operation :



5. Stack Application


Ada beberapa aplikasi yang menggunakan data stack

struktur yang akan kita bahas:

  • Evaluasi infiks
  • Evaluasi postfix
  • Evaluasi awalan
  • Infiks ke Postfix konversi
  • Infiks ke Awalan konversi
  • Kedalaman Pertama Cari

Infix, Postfix, and Prefix Notation


Ada tiga notasi aritmatika yang diketahui:

  • Pemberitahuan awalan, juga dikenal sebagai notasi Reverse Polish.
  • Notasi infiks (biasa digunakan)
  • Notasi postfix, juga dikenal sebagai notasi Polandia.

Notasi postfix diberikan oleh Jan Lukasiewicz yang adalah seorang Polandia ahli logika, matematikawan, dan filsuf. Tujuannya adalah untuk berkembang Notasi awalan bebas tanda kurung (juga dikenal sebagai notasi Polandia) dan notasi postfix yang lebih dikenal dengan Reverse Polish Notasi atau RPN.


  • Prefix (Awalan) : operator ditulis sebelum operan
  • Infiks: operator ditulis antara operan
  • Postfix: operator ditulis setelah operan


Mengapa kita membutuhkan awalan / postfix notasi?

  • Pemberitahuan awalan dan postfix tidak memerlukan tanda kurung untuk memprioritaskan prioritas operator.
  • Awalan dan postfix jauh lebih mudah bagi komputer untuk dievaluasi.




Evaluation: Infix Notation


Evaluasi ekspresi infiks yang diberikan:

4 + 6 * (5 - 2) / 3.

Untuk mengevaluasi notasi infiks, kita harus mencari preseden tertinggi operator dalam string

4 + 6 * (5 – 2) / 3  search the highest precedence operator, it is ( )
4 + 6 * 3 / 3  search the highest precedence operator, it is *
4 + 18 / 3  search the highest precedence operator, it is  /
4 + 6  search the highest precedence operator, it is +

10


Dalam setiap pencarian, kita harus iterate melalui 
string dan kita melakukan ini untuk setiap operator
yang ada, maka keseluruhan kompleksasinya adalah 
O (N2) dengan N adalah panjang tali itu


Evaluation: Postfix Notation

Manually

Scan from left to right
7   6   5   x   3   2   ^   –    +  , scan until reach the first operator
7   6   5   x   3   2   ^   –    +  , calculate 6 x 5
7   30           3   2   ^   –    +  , scan again until reach next operator
7   30           3   2   ^   –    +  , calculate 32
7   30           9             –    +  , scan again to search next operator
7   30           9             –    +  , calculate 30 – 9
7   21                                +  , scan again
7   21                                +  , calculate 7 + 24
28    , finish


Menggunakan Stack Mengevaluasi notasi postfix bisa
dilakukan di O (N), yang lebih cepat dari O (N2)
Algoritma: 
Pindai string dari kiri ke kanan, untuk setiap karakter
dalam string:

  • Jika itu adalah operan, dorong ke dalam tumpukan.
  • Jika itu adalah operator, pop dua kali (simpan dalam
  • variabel A dan B masing-masing) dan dorong
  • (operator B A).
  • Perhatikan di sini! Ini adalah (operator B A), bukan
  • (Operator B).
  • Hasilnya akan disimpan dalam satu-satunya elemen dalam stack.

Evaluation: Prefix Notation

Manually
Scan from right to left
+   7   –   x   6   5   ^   3   2
+   7   –   x   6   5   ^   3   2
+   7   –   x   6   5   9
+   7   –   x   6   5   9 
+   7   –   30           9
+   7   –   30           9
+   7   21
+   7   21
28

Menggunakan Stack

Mengevaluasi notasi awalan mirip dengan notasi postfix.
Petunjuk: string dipindai dari kanan ke kiri.




6. QUEUE

Antrian adalah struktur data penting yang menyimpan unsur-unsurnya secara teratur

Contoh:

  • Orang-orang bergerak di eskalator. 
  • Orang-orang yang naik eskalator pertama akan menjadi orang pertama yang melangkah keluar dari situ. 
  • Orang-orang menunggu bus. 
  • Orang yang berdiri di telepon akan menjadi orang pertama yang masuk ke bus  Koper disimpan di ban berjalan 
  • Mobil berjejer untuk mengisi bensin
  • Mobil berjejer di jembatan tol




Queue Operations

  • dorong (x): tambahkan item x ke bagian belakang antrian.
  • pop (): hapus item dari bagian depan antrian.
  • depan (): mengungkapkan / mengembalikan barang paling depan dari antrian.



depan juga dikenal sebagai mengintip.




7. Circular Queue

  • Kita bisa membungkus indeks L dan R.
  • Jika R mencapai MAXN maka atur R sebagai nol, lakukan hal yang sama dengan L.
  • Hal ini juga dikenal sebagai antrian melingkar.




Queue Applications

Ada beberapa aplikasi yang menggunakan data antrian struktur yang akan kita bahas:

  • Deques
  • Antrian Prioritas
  • Breadth First Search




Deques :

Sebuah deque (diucapkan sebagai 'dek' atau 'dequeue') adalah daftar di elemen mana yang bisa disisipkan atau dihapus di kedua ujungnya. Hal ini juga dikenal sebagai daftar kepala-ekor terkait, karena elemen dapat ditambahkan ke atau dihapus dari depan (kepala) atau belakang (ekor).




Priority Queue

Antrian prioritas adalah tipe data abstrak dimana masing-masin elemen diberi prioritas Aturan umum elemen pemrosesan antrian prioritas bisa diberikan sebagai:

  • Elemen dengan prioritas lebih tinggi adalah proses sebelum elemen dengan prioritas lebih rendah
  • Dua elemen dengan prioritas yang sama diproses berdasarkan first come first served (FCFS)




Breadth First Search (BFS) seperti DFS juga merupakan algoritma untuk melintasi atau mencari di pohon atau grafik. Kita mulai dari akar pohon (atau beberapa simpul acak di grafik) dan jelajahi semua level node tetangga per level sampai kita menemukan tujuannya. BFS memiliki banyak aplikasi, seperti:

  • Menemukan komponen yang terhubung dalam grafik.
  • Menemukan jalur terpendek dalam grafik tanpa bobot.
  • Metode Ford-Fulkerson untuk menghitung arus maksimum.
  • dll.

Perbedaan antara DFS dan BFS iteratif

  • Implementasi hanyalah struktur data yang digunakan.
  • DFS menggunakan stack sementara BFS menggunakan antrian.



Breadth First Search

Algorithm:

Prepare an empty queue
Push source/root into queue
Mark source/root
While queue is not empty
  Pop an item from queue into P
  For each node X adjacent with P
  If X is not marked
  Mark X
  Push X into queue