Selasa, 10 Maret 2020

Hashing and Binary Tree

Hashing

Apa sih hashing itu? Hashing adalah sebuah teknik yang digunakan untuk menyimpan dan mengambil kunci dalam waktu yang cepat atau singkat. Dalam hashing, string akan diubah menjadi string yang lebih pendek atau kunci yang merepresentasikan string awal. Hashing dapat diartikan sebagai konsep pembagian kunci dalam array (hash table) dengan fungsi yang telah ditentukan sebelumnya (hash function).
Oke, sekarang kita sudah tau apa itu hashing. Kalau gitu, hash table itu apa sih? Hash table adalah sebuah tabel (array) dimana kita menyimpan string awal (original string). Biasanya ukuran dari hash table lebih kecil dari jumlah total string. Jadi ada kemungkinan beberapa string memiliki hash key yang sama.

Gambar diatas menunjukan hash table dengan ukuran n = 10. Setiap posisi dari hash table disebut slot. Hash table tidak mengandung item, sehingga setiap slotnya kosong. Contoh, kita memiliki integer items {26, 70, 18, 31, 54, 93}. Salah satu cara yang paling umum untuk mentukan hash key adalah dengan cara:
Hash key = nilai key % jumlah slot
Cara diatas merupakan cara menentukan hash key dengan metode division. Dengan menggunakan cara tersebut, maka berikut adalah hasil dari hash key
Data Item
Hash Key
Hash Value
26
26 % 10 = 6
6
70
70 % 10 = 0
0
18
18 % 10 = 8
8
31
31 % 10 = 1
1
54
54 % 10 = 4
4
93
93 % 10 = 3
3
Setelah itu, kita masukkan ke dalam hash table

Selain menggunakan cara diatas, berikut merupakan metode yang dapat digunakan untuk membangun fungsi hash:
Mid square
Kuadratkan nilai dari key, lalu ambil nilai tengah dari hasil kuadrat tersebut. Contoh: key = 3121, key2 = 9740641, bagian yang diambil = 406
Division
Bagi string atau identifier dengan menggunakan operator modulus (seperti contoh diatas). Metode ini merupakan metode yang paling sering dipakai.
Folding
Partisi string / identifier menjadi beberapa bagian, lalu menambahkan bagian-bagian yang ada untuk mendapatkan hash key.
Digit Extraction
Digit yang telah ditentukan dari nomor yang diberikan dianggap sebagai alamat dari hash.
Rotating Hash
Menggunakan metode hash apapun (seperti division, atau folding). Setelah mendapatkan hash code/alamat dari hash method, lakukan rotasi. Rotasi dilakukan dengan shifting digits untuk mendapatkan alamat hash yang baru.


Trees and Binary Tree

Salah satu materi dalam Data Structures yang paling penting adalah Tree. Tree biasa digunakan untuk mewakili data yang memiliki struktur hierarki antar elemen. Selain itu, Binary Tree adalah tipe spesial dari tree dimana setiap node antara tidak memiliki node, memiliki satu node atau dua node. Ada dua cara untuk mewakili binary tree, yaitu dengan menggunakan array dan dengan menggunakan linked list. Child node dalam binary tree di sebelah kiri disebut sebagai “left child node” dan child node di sebelah kanan disebut sebagai “right childe node”.

Pada gambar di atas, root node 8 (root merupakan node yang paling atas) memiliki 2 anak (3 dan 10), kemudian kedua child node bertindak sebagai parent node untuk child node 1 dan 6 (bagi left parent node) dan 14 (bagi right parent node) dan seterusnya.
Binary tree memiliki beberapa bentuk atau jenis, berikut merupakan beberapa contohnya:
Full Binary Tree

Complete Binary Tree

Skewed Binary Tree

Dan lain-lain


References:

Selasa, 03 Maret 2020

Linked List

Linked List

Apa sih linked list itu? Jadi, linked list (seranai berantai) adalah struktur data yang mengandung/memiliki urutan record data dimana setiap record data memiliki suatu tempat (field) yang menyimpan alamat dari record data selanjutnya. Elemen-elemen dari suatu data disebut Node.
Lalu, apa bedanya dengan array?? Biasanya, pada array, kita telah mendeklarasikan berapa jumlah yang akan digunakan nantinya, sedangkan linked list tidak. Linked list menggunakan malloc (memory allocation) untuk menambah/mereserve NODE. Selain itu, jika kita mereserve tempat untuk array, address dari setiap index akan berdekatan/memiliki kelipatan yang sama. Sedangkan dalam linked list tidak, karena linked list menggunakan malloc, maka NODE baru dapat memiliki address yang berjauhan dengan NODE sebelumnya (address tersebut dapat random, sesuai dengan memory yang sedang tidak digunakan oleh komputer).
Dalam suatu linked list, akan ada 3 pointer yang akan digunakan, yakni pointer HEAD, TAIL, dan CURRENT.
Pointer HEAD, digunakan untuk menunjuk address dari NODE pertama dalam linked list.
Pointer TAIL, digunakan untuk menunjuk address dari NODE terakhir dalam linked list.
Pointer CURRENT, digunakan sebagai pembantu pointer HEAD dan TAIL.
Sebuah linked list dinyatakan kosong apabila isi dari pointer HEAD adalah NULL. Dalam single linked list, linked list yang telah dibuat tidak dapat menunjuk ke NODE yang ada dibelakangnya (previous) dan hanya bisa menunjuk NODE yang ada di depannya (next), karena single linked list hanya memiliki satu buah tangan yang digunakan untuk menyimpan address dari NODE selanjutnya.
Dalam linked list terdapat 3 fungsi, yaitu:
Push
Push atau insert, digunakan untuk memasukkan data. Push sendiri terdapat 3 macam, yaitu: push depan (NODE baru akan berada di depan NODE yang lama), push belakang (NODE baru akan berada di belakang NODE yang lama), dan push tengah (NODE baru akan berada di tengah-tengah NODE yang lama). Berikut merupakan contoh program yang menggunakan push depan:

Dalam potongan program tersebut dapat diketahui bahwa program tersebut digunakan untuk menambahkan/memasukkan data berupa pensil dengan harga 5000.
Delete
Seperti namanya, delete merupakan fungsi yang digunakan untuk menghapus suatu data dalam linked list. Delete juga memiliki 3 jenis, yaitu delete depan, delete belakang, dan delete tengah. Berikut merupakan contoh program yang menggunakan fungsi delete:

Dalam potongan program tersebut dapat diketahui bahwa program tersebut digunakan untuk menghapus data buku. Mengapa data buku yang terhapus dan bukannya pensil? Karena program tersebut menggunakan push depan, sehingga data ada dalam linked list akan seperti ini: Buku, Pensil. Jika kita menggunakan fungsi delete depan maka, data bukulah yang akan terhapus.
Print
Fungsi print, digunakan untuk menampilkan seluruh data yang ada pada linked list. Berikut merupakan contoh dari fungsi print:

Dalam potongan program tersebut, dapat dilihat bahwa, selama nilai curr->next bukan NULL, maka ia akan ngeprint nilai dari curr.


References: