Skip to main content

Rangkuman setengah semester


Setelah melewati setengah semester ini, untuk mata kuliah Data Structure kelas besar telah mempelajari tentang Array, Linked List (Single linked list dan Double linked list), konsep Stack & Queue, Binary Tree, dan juga Hashing. Berikut adalah rangkuman singkat dari apa yang telah di pelajari selama setengah semester ini.

·       Array dan Linked List
Pada minggu pertama di kelas besar Data Structure, membahas tentang linked list dan perbedaan nya dengan array. Pada saat dijelaskan saya baru mengetahui jika perbedaan paling mendasar antara array dan linked list adalah terdapat pada alokasi memory nya, array menggunakan alokasi memory yang fix sedangkan linked list menggunakan alokasi memory yang dynamic, sehingga penggunaan linked list lebih memory efficient dibanding dengan array. Linked list juga mempunyai kelebihan daripada array yaitu, karena alokasi memory yang dimiliki array fix, sehingga tidak bisa menambah lagi jumlah array nya setelah di deklarasikan di awal, sedangkan karena alokasi memory linked list dinamis jadi jumlah linked list nya bisa bertambah terus asal masih ada memori yang kosong.

Di minggu ini juga dosen menjelaskan macam-macam linked list seperti single/singly linked list, double/doubly linked list .Di materi ini pada saat dosen menjelaskan, dosen memberikan contoh tentang linked list dengan menggunakan orang sebagai contoh node nya dan tangan orang tersebut sebagai pointer next untuk menunjuk node berikut nya (untuk single dan double linked list) dan pointer previous (untuk double linked list). Di materi ini juga saya mendapatkan gambaran tentang bagaimana cara linked list bekerja dan juga bagaimana linked list di manage di memory.  Dosen juga memberikan gambaran bagaimana menambah dan menghapus linked list .

·       Stack and Queue
Pada minggu ketiga di kelas Data Structure, membahas tentang konsep Stack dan juga Queue. Stack dan Queue dapat digunakan baik pada array maupun linked list, perbedaan nya hanya terdapat pada seberapa banyak Stack dan Queue dapat terbentuk, pada array Stack dan Queue ukuran nya terbatas karena array tidak menggunakan dynamic memory alocation, sedangkan pada linked list ukuran nya tidak terbatas karena linked list menggunakan dynamic memory alocation. Di minggu ini juga dibahas tentang infix, prefix, dan postfix notation yang dapat mempercepat perhitungan aritmatik di komputer dengan menggunakan konsep dari Stack.

STACK
Stack merupakan konsep yang digambarkan seperti tumpukan piring. Ketika kita meletakan piring pada tumpukan piring maka piring yang akan keluar pertama atau diambil pertama adalah piring yang paling atas  (yang terakhir kali diletakan). Sehingga data yang disimpan dengan konsep Stack akan diakses dengan cara LIFO (Last In First Out) atau FILO (First In Last Out).

Stack memiliki 3 operation, yaitu:
·         Push(x)                : memasukan item x ke atas tumpukan (stack)
·         Pop()                     : membuang / menghapus item paling atas di tumpukan (stack)
·         Top()                     : memperlihatkan isi item paling atas tumpukan (stack)


Notasi Infix merupakan notasi aritmatika yang biasa digunakan sehari-hari, notasi prefix merupakan notasi aritmatika yang operator nya berada di sebelah kiri operand, sedangkan notasi postfix merupakan notasi aritmatika yang operator nya berada di sebelah kanan operand. Alasan mengapa notasi prefix dan postfix bisa mempercepat perhitungan dibandingkan dengan notasi infix adalah karena pada notasi prefix dan postfix tidak terdapat parentheses.

Contoh:
Infix       : ( (1 + 3) / ((100 * 5)^30) )
Prefix    : / + 1 3 ^ * 100 5 30
Postfix  : 1 3 + 100 5 * 30 ^ /

Ketiga contoh diatas merupakan operasi aritmatika yang menghasilkan angka yang sama akan tetapi berbeda pada cara penulisan nya.

DFS (Depth Fisrt Search) merupakan algoritma untuk berjalan dan mencari data pada tree atau graph. Dimulai dari root (paling atas) kemudian turun kebawah.


QUEUE
Queue merupakan konsep yang digambarkan seperti antrian. Orang yang pertama kali masuk ke dalam antrian akan keluar dari antrian pertama kali. Sehingga konsep Queue disebut juga FIFO (First In First Out).

Queue memiliki 3 operation, yaitu:
·         Push(x)                : memasukan item ke bagian belakang antrian (queue)
·         Pop()                     : menghapus item pada bagian depan antrian (queue)
·         Front()                  : memperlihatkan isi item paling depan antrian (queue)

Queue banyak digunakan pada management RAM pada operating system sehingga saat banyak aplikasi terbuka di background management RAM nya tidak kacau. Cara tersebut menggunakan Circular Queue, yaitu Queue yang ketika data nya sudah overflow, maka akan kembali lagi ke bagian paling depan / awal Queue.

Pada Queue juga terdapat Dequeue (Double Ended Queue) dibaca deck yaitu Queue yang untuk memasukan dan menghapus item nya dapat dilakukan dari 2 arah yaitu depan dan belakang. Terdapat dua jenis Dequeue, yaitu Input Restricted Dequeue dan Output Restricted Dequeue. Input Restricted Dequeue adalah Dequeue yang input nya hanya boleh dari 1 arah tetapi bisa di hapus dari 2 arah. Sedangkan, Output Restricted Dequeue adalah Dequeue yang input nya boleh dari 2 arah tetapi hanya bisa dihapus dari 1 arah.

BFS (Breadth First Search) sama saja dengan DFS tetapi perbedaanya BFS menggunakan konsep Queue.


·       Hashing dan Binary Tree
Materi minggu ini materi nya adalah Hashing dan Binary Tree. Hashing adalah metode yang digunakan untuk mencari dan memasukan data dengan cepat ke database. Konsep yang saya dapatkan itu hashing menggunakan array dan linked list sekaligus. Sehingga blok memori array akan digunakan sebagai head bagi linked list nya nanti.

Contoh syntax untuk hashing:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>

#define SIZE 20

struct DataItem{
    int data;
    int key;
};

struct DataItem* hashArray[SIZE];
struct DataItem* dummyItem;
struct DataItem* item;

int hashcode(int key){
    return key % SIZE;
}

struct DataItem *search(int key){
    // get the hash
    int hashIndex = hashcode(key);
    
    // move in array until an empty
    while(hashArray[hashIndex] != NULL){
        if(hashArray[hashIndex]->key == key){
            return hashArray[hashIndex];
        }
        
        // go to next cell
        hashIndex++;
        
        // wrap around the table
        hashIndex %= SIZE;
    }
    
    return NULL;
}

void insert(int keyint data){
    struct DataItem *item = (struct DataItem*malloc (sizeof(struct DataItem));
    
    item->data = data;
    item->key = key;
    
    // get the hash
    int hashIndex = hashcode(key);
    
    // move in array untul an empty or deleted cell
    while(hashArray[hashIndex] != NULL && hashArray[hashIndex]->key != -1){
        // go to next cell
        hashIndex++;
        
        // wrap around the table
        hashIndex %= SIZE;
    }
    
    hashArray[hashIndex] = item;
}

struct DataItem* deleteHash(struct DataItem* item){
    int key = item->key;
    
    // get the hash
    int hashIndex = hashcode(key);
    
    // move in array until an empty
    while(hashArray[hashIndex] != NULL){
        if(hashArray[hashIndex]->key == key){
            struct DataItem* temp = hashArray[hashIndex];
            
            // assign a dummy item at deleted position
            hashArray[hashIndex] = dummyItem;
            return temp;
        }
        
        // go to next cell
        ++hashIndex;
        
        // wrap around the table
        hashIndex %= SIZE;
    }
    
    return NULL;
}

void display(){
    int i = 0;
    
    for(i = 0; i < SIZE; i++){
        if(hashArray[i] != NULL){
            printf(" (%d, %d)"hashArray[i]->keyhashArray[i]->data);
        } else {
            printf("~~");
        }
    }
    
    printf("\n");
}

int main(){
    dummyItem = (struct DataItem*malloc (sizeof(struct DataItem));
    dummyItem->data = -1;
    dummyItem->key = -1;
    
    insert(120);
    insert(270);
    insert(4280);
    insert(425);
    insert(1244);
    insert(1432);
    insert(1711);
    insert(1378);
    insert(3797);
    
    display();
    
    item = search(37);
    
    if(item != NULL){
        printf("Element found: %d\n"item->data);
    } else {
        printf("Elemert not found\n");
    }
    
    deleteHash(item);
    display();
    item = search(42);
    
    if(item != NULL){
        printf("Element found: %d\n"item->data);
    } else {
        printf("Elemert not found\n");
    }
    
    display();
    item = search(13);
    
    if(item != NULL){
        printf("Element found: %d\n"item->data);
    } else {
        printf("Elemert not found\n");
    }
    
}



Pada hashing terdapat banyak cara untuk menkonstruksi hash function yaitu, Mid-square, division, folding, digit extraction, dan rotating hash.

Hashing sekarang banyak digunakan di dalam cryptocurrency seperti Bitcoin, karena transaksi akan diambil sebagai input yang nanti nya akan menghasilkan output berupa string dengan panjang yang tetap. Pada bitcoin algoritma hashing yang digunakan adalah SHA-256 (Secure Hashing Algorithm 256), yaitu algoritma yang menghasilkan output dengan panjang yang sama yaitu 256 bit, dengan panjang input berapapun.

Tree adalah data structure yang non-linear, tree memiliki banyak bagian, bagian paling atas dari tree disebut dengan root yang berada di level 0. Garis yang menghubungkan antar node disebut edge, dan node yang tidak memiliki anak disebut dengan leaf.

Binary tree adalah rooted tree yang setiap node nya memiliki paling banyak 2 anak.
Tipe Binary tree:
·         PERFECT Binary tree









·         COMPLETE Binary tree











·     
SKEWED Binary tree

·         BALANCED Binary tree






Comments