Menu
CoddyTech

Hash Table

Terakhir diperbarui

Hash table adalah struktur data yang menyimpan item dalam array berisi bucket. Untuk menempatkan atau mencari sebuah key, hash table memasukkan key itu ke fungsi hash lalu mengambil sisa bagi hasilnya dengan jumlah bucket, dan hasil itulah indeks bucket-nya, didapat dalam O(1). Tekan Putar di atas untuk melihat setiap key di-hash ke sebuah bucket dan disimpan, lalu sebuah pencarian langsung melompat ke bucket yang tepat.

Saat dua key di-hash ke bucket yang sama, yang disebut tabrakan (collision), visualisasi ini memakai separate chaining: setiap bucket menyimpan list kecil, dan key yang bertabrakan ditambahkan ke list itu. Selama tabelnya tidak terlalu penuh (load factor rendah) dan fungsi hash menyebarkan key dengan baik, rantainya tetap pendek dan penyisipan, pencarian, serta penghapusan bernilai O(1) secara rata-rata.

Kompleksitas waktu

OperasiRata-rataKasus terburuk
PenyisipanO(1)O(n) (semua key bertabrakan)
PencarianO(1)O(n)
PenghapusanO(1)O(n)
RuangO(n)O(n)

Konsep kunci

IstilahArti
Fungsi hashMemetakan key ke indeks bucket
Tabrakan (collision)Dua key jatuh di bucket yang sama
Separate chainingSetiap bucket menyimpan list berisi entri yang bertabrakan
Open addressingAlternatifnya: cari slot kosong berikutnya
Load factorentri / bucket, penentu kapan resize terjadi

Contoh penerapan

Menyisipkan key 20, 34, 9, 13 ke tabel dengan 7 bucket, memakai hash(k) = k % 7:

LangkahStrukturAksi
Sisipkan 20bucket 6: [20]20 % 7 = 6, bucket 6 kosong, simpan 20
Sisipkan 34bucket 6: [20, 34]34 % 7 = 6, bertabrakan dengan 20, tambahkan 34 ke rantai
Sisipkan 9bucket 2: [9]9 % 7 = 2, bucket 2 kosong, simpan 9
Sisipkan 13bucket 6: [20, 34, 13]13 % 7 = 6, tabrakan, tambahkan 13 ke rantai bucket 6
Cari 34bucket 6: [20, 34, 13]34 % 7 = 6, pindai rantai: 20 bukan, 34 cocok, ditemukan

Kapan memakai hash table

Pakai saatHindari saat
Kamu butuh penyisipan, pencarian, dan penghapusan rata-rata O(1) berdasarkan keyKamu butuh key yang tetap terurut: pakai BST yang seimbang
Key tidak punya urutan yang berguna dan kamu hanya menguji keanggotaan dengan pencocokan persisKamu butuh range query atau pencarian key terdekat
Kamu sanggup memakai sedikit memori tambahan untuk bucket dan load factor yang rendahMemori sangat terbatas dan setiap byte berarti
Ada fungsi hash yang bagus untuk tipe key-muLatensi kasus terburuk harus dibatasi: tabrakan membuatnya O(n)

Kode Hash Table

Implementasi Hash Table yang rapi dan siap dijalankan dalam Python, JavaScript, Java, C++, C. Pilih bahasa, salin kodenya, atau buka langsung di Coddy Playground.

Kode Hash Table dalam Python

Python
1class HashTable:2    def __init__(self, size=8):3        self.size = size4        self.buckets = [[] for _ in range(size)]5
6    def _index(self, key):7        # Hash the key to a bucket; different keys can collide8        return sum(ord(ch) for ch in key) % self.size9
10    def set(self, key, value):11        bucket = self.buckets[self._index(key)]12        for i, (k, _) in enumerate(bucket):13            if k == key:14                bucket[i] = (key, value)  # update existing key15                return16        bucket.append((key, value))  # chain on collision17
18    def get(self, key):19        for k, v in self.buckets[self._index(key)]:20            if k == key:21                return v22        raise KeyError(key)23
24    def delete(self, key):25        bucket = self.buckets[self._index(key)]26        for i, (k, _) in enumerate(bucket):27            if k == key:28                del bucket[i]29                return30        raise KeyError(key)31
32
33table = HashTable()34table.set("apple", 3)35table.set("banana", 7)36table.set("cherry", 5)37
38print("apple  ->", table.get("apple"))39print("banana ->", table.get("banana"))40table.set("apple", 10)41print("apple  ->", table.get("apple"))42table.delete("banana")43print("bucket sizes:", [len(b) for b in table.buckets])
Jalankan kode ini di Playground Python

FAQ Hash Table

Apa itu hash collision dan bagaimana cara menyelesaikannya?

Tabrakan (collision) terjadi saat dua key yang berbeda di-hash ke bucket yang sama. Dua solusi yang umum adalah separate chaining (setiap bucket menyimpan list, dan key yang bertabrakan ditambahkan ke sana, seperti yang ditampilkan di sini) dan open addressing (mencari slot kosong berikutnya di dalam array). Keduanya menjaga pencarian tetap benar; perbedaannya ada pada tata letak memori dan performa saat tabel penuh.

Berapa kompleksitas waktu hash table?
Penyisipan, pencarian, dan penghapusan bernilai O(1) secara rata-rata jika fungsi hash menyebarkan key secara merata dan load factor dijaga tetap rendah. Pada kasus terburuk, yaitu ketika setiap key bertabrakan di satu bucket, semuanya merosot menjadi O(n), itulah sebabnya fungsi hash yang bagus dan resize itu penting.
Apa itu load factor?

Load factor adalah jumlah entri yang disimpan dibagi jumlah bucket. Saat nilainya bertambah, rantai makin panjang dan operasi melambat, jadi sebagian besar hash table melakukan resize (hash ulang ke array yang lebih besar) begitu nilainya melewati ambang seperti 0,75.

Kapan sebaiknya memakai hash table, bukan binary search tree?
Pakai hash table saat kamu hanya butuh pencarian dengan pencocokan persis dan ingin kecepatan rata-rata O(1) tanpa kebutuhan urutan. Pakai binary search tree yang seimbang saat kamu butuh key yang terurut, range query, atau pencarian predecessor/successor, yang tidak bisa dilakukan hash table secara efisien. BST memberi jaminan operasi O(log n), sedangkan hash table menukar jaminan itu dengan performa rata-rata yang lebih cepat.
Apa perbedaan separate chaining dan open addressing?

Separate chaining menyimpan key yang bertabrakan dalam list per bucket, jadi satu bucket bisa menampung banyak entri dan tabel tidak pernah benar-benar penuh. Open addressing menyimpan semuanya di dalam array itu sendiri dan mencari slot kosong berikutnya saat terjadi tabrakan. Cara ini ramah cache, tetapi performanya turun tajam saat load factor mendekati 1 dan butuh penanganan penghapusan yang hati-hati. Chaining tahan terhadap load factor yang lebih tinggi; open addressing memakai memori dengan lebih ringkas.

Mengapa hash table tidak bisa diandalkan untuk menjaga key tetap sesuai urutan penyisipan atau terurut?
Fungsi hash sengaja menyebarkan key ke berbagai bucket untuk menghindari penumpukan, jadi urutan iterasi mencerminkan tata letak bucket, bukan urutan penyisipan atau urutan terurut. Jika kamu butuh urutan, pakai map/tree yang berurutan atau struktur seperti map yang mempertahankan urutan penyisipan (misalnya dict di Python mempertahankan urutan penyisipan, tetapi itu jaminan dari bahasanya, bukan sifat bawaan hash table). Jangan pernah berasumsi urutan iterasi sama dengan urutan kamu menyisipkan key, kecuali bahasanya menjanjikannya secara eksplisit.
Ilustrasi bahasa pemrograman di Coddy

Kuasai algoritma bersama Coddy

Mulai