Skip to content

Commit 85864d4

Browse files
Feat/quadratic probing
# Deskripsi (Description) Menambahkan program salah satu metode untuk menangani tabrakan pada hash table dengan teknik `open addressing`, yaitu `quadratic probing` menggunakan division method sebagai fungsi hash. ## Perubahan yang dilakukan - Menambahkan file implementasi quadratic_probing/divsion_method.cpp - Menambahkan dokumentasi dan penjelasan langkah pada README # Checklist: ##### Umum: - [x] Saya menambah algoritma terbaru. - [x] Saya menambah dokumentasi. ##### Contributor Requirements (Syarat Kontributor) dan Lain-Lain: - [x] Saya sudah membaca (I have read) [CONTRIBUTING](https://github.com/bellshade/CPP/blob/main/CONTRIBUTING.md) dan sudah menyetujui semua syarat. - [x] Saya telah menambahkan komentar kode yang memberikan penjelasan maksud dari kode yang saya buat. - [x] Saya menggunakan bahasa Indonesia untuk memberikan penjelasan dari kode yang saya buat. # Environment Saya menggunakan (I'm using): - ``OS`` = `Linux` - ``g++`` = `15.2.1` # Link Issues Issues : # This Commit License https://github.com/bellshade/CPP/blob/main/license Co-authored-by: bellshadebot <bellshade07@gmail.com>
1 parent 70e65ee commit 85864d4

File tree

2 files changed

+222
-0
lines changed

2 files changed

+222
-0
lines changed
Lines changed: 176 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,176 @@
1+
/**
2+
* @file quadratic_probing.cpp
3+
* @brief Implementasi metode Quadratic Probing untuk menangani tabrakan
4+
* (collision) pada hash table.
5+
*
6+
* # Deskripsi (Description)
7+
* Menambahkan program salah satu metode untuk menangani tabrakan pada hash
8+
* table dengan teknik *open addressing*, yaitu **Quadratic Probing**.
9+
*
10+
* Pada metode ini, jika terjadi tabrakan di posisi hasil hash awal `h(k)`, maka
11+
* posisi baru dihitung menggunakan fungsi kuadrat dari indeks percobaan (`i`):
12+
*
13+
*
14+
* h(k, i) = (h(k) + i^2) % m
15+
*
16+
* di mana:
17+
* - `h(k)` : hasil hash awal.
18+
* - `i` : jumlah percobaan (0, 1, 2, 3, ...).
19+
* - `m` : kapasitas tabel hash.
20+
*
21+
* Metode ini mengurangi kemungkinan *primary clustering* yang sering muncul
22+
* pada *linear probing*.
23+
* @note Quadratic probing memerlukan bahwa ukuran tabel (`m`) sebaiknya
24+
* bilangan prima agar distribusi posisi hasil probing lebih merata.
25+
*
26+
* @see linear_probing.cpp untuk perbandingan metode linear probing.
27+
*
28+
*/
29+
#include <cstddef>
30+
#include <iostream>
31+
class HashTable {
32+
private:
33+
enum Status { EMPTY, OCCUPIED, DELETED };
34+
35+
private:
36+
/**
37+
* @struct Entry
38+
* @brief Struktur data untuk merepresentasikan satu slot (entri) pada hash
39+
* table.
40+
*
41+
* Struktur `Entry` digunakan untuk menyimpan elemen pada tabel hash,
42+
* sekaligus menandai status dari setiap slot (apakah kosong, terisi, atau
43+
* dihapus) saat menggunakan metode *open addressing* seperti **Quadratic
44+
* Probing**.
45+
*
46+
* ---
47+
* @details Field (Anggota Data)
48+
* - `int key`
49+
* Menyimpan nilai kunci (key) yang akan dimasukkan ke dalam tabel hash.
50+
* Nilai `key` digunakan dalam perhitungan fungsi hash.
51+
*
52+
* - `Status status`
53+
* Menyimpan status dari entri:
54+
* - `Status::EMPTY` → slot belum pernah terisi.
55+
* - `Status::OCCUPIED` → slot saat ini terisi oleh sebuah kunci.
56+
* - `Status::DELETED` → slot pernah terisi tapi sekarang kosong (dihapus),
57+
* tetap dipertahankan agar probing tidak terputus.
58+
*
59+
* ---
60+
*
61+
*/
62+
struct Entry {
63+
int key;
64+
Status status;
65+
Entry() {
66+
this->key = 0;
67+
this->status = Status::EMPTY;
68+
}
69+
};
70+
71+
private:
72+
std::size_t capacity;
73+
std::size_t size;
74+
Entry *table;
75+
const int c1 = 1;
76+
const int c2 = 1;
77+
78+
public:
79+
HashTable() {
80+
this->capacity = 8;
81+
this->size = 0;
82+
this->table = new Entry[capacity];
83+
}
84+
HashTable(std::size_t cap) {
85+
this->capacity = cap;
86+
this->size = 0;
87+
this->table = new Entry[capacity];
88+
}
89+
HashTable(const HashTable &others) {
90+
capacity = others.capacity;
91+
size = others.capacity;
92+
table = new Entry[capacity];
93+
for (size_t i = 0; i < capacity; i++) {
94+
table[i].key = others.table[i].key;
95+
table[i].status = others.table[i].status;
96+
}
97+
}
98+
~HashTable() { delete[] table; }
99+
100+
private:
101+
int hash(std::size_t key) { return key % capacity; }
102+
103+
public:
104+
double load_factor() { return static_cast<double>(size) / capacity; }
105+
106+
public:
107+
bool insert(int key) {
108+
std::size_t index = hash(key);
109+
std::size_t i = 0;
110+
while (i < capacity) {
111+
std::size_t new_index = (index + c1 * i + c2 * i * i) % capacity;
112+
if (table[new_index].status == Status::EMPTY ||
113+
table[new_index].status == Status::DELETED) {
114+
table[new_index].key = key;
115+
table[new_index].status = Status::OCCUPIED;
116+
return true;
117+
}
118+
i++;
119+
}
120+
return false;
121+
}
122+
bool search(int key) {
123+
std::size_t index = hash(key);
124+
std::size_t i = 0;
125+
while (i < capacity) {
126+
std::size_t new_index = (index + c1 * i + c2 * i * i) % capacity;
127+
if (table[new_index].status == Status::EMPTY &&
128+
table[new_index].status != Status::DELETED) {
129+
return false;
130+
}
131+
if (table[new_index].status == Status::OCCUPIED &&
132+
table[new_index].key == key) {
133+
return true;
134+
}
135+
i++;
136+
}
137+
return false;
138+
}
139+
bool remove(int key) {
140+
std::size_t index = hash(key);
141+
return false;
142+
std::size_t i = 0;
143+
while (i < capacity) {
144+
std::size_t new_index = (index + c1 * i + c2 * i * i) % capacity;
145+
if (table[new_index].status == Status::OCCUPIED &&
146+
table[new_index].key == key) {
147+
table[new_index].key = 0;
148+
table[new_index].status = Status::DELETED;
149+
}
150+
i++;
151+
}
152+
}
153+
154+
public:
155+
void print() {
156+
for (size_t i = 0; i < capacity; i++) {
157+
std::cout << i << ": ";
158+
if (table[i].status == OCCUPIED) {
159+
std::cout << table[i].key << std::endl;
160+
} else {
161+
std::cout << "[x]" << std::endl;
162+
}
163+
}
164+
}
165+
};
166+
int main() {
167+
HashTable hash(10);
168+
hash.insert(7);
169+
hash.insert(13);
170+
hash.insert(15);
171+
hash.insert(1);
172+
hash.insert(10);
173+
hash.print();
174+
std::cin.get();
175+
return 0;
176+
}

struktur_data/hash_table/open_adressing/readme.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,49 @@ Dimana:
7171
5. Ulangi langkah 3 sampai menemukan slot kosong atau tabel penuh
7272

7373
Salah satu implementasi Linear Probing dapat digunakan pada hash function: [division_method.cpp](struktur_data/hash_table/hash_table.cpp)
74+
75+
### Quadratic Probing
76+
**Quadratic Probing** adalah salah satu metode penanganan collision pada `hash table` untuk menangani **collision (tabrakan)**
77+
78+
Jika sebuah slot index hash penuh, maka algoritma akan mencari slot kosong menggunakan **fungsi kuadrat** terhadap jumlah percobaan `probe`
79+
80+
Rumus **Quadratic probing**
81+
```math
82+
h(k) = (h(k) + c1 * i + c2 *i * i) \bmod \text{capacity}
83+
```
84+
85+
dimana:
86+
87+
`h(k)` = index hash
88+
89+
`i` = jumlah percobaan(probe) ke -i
90+
91+
`c1,c2` = kostanta(biasanya `c1 = c2 = 1`)
92+
93+
`capacity` = kapasitas hash table(banyak bucket)
94+
95+
**Langkah-langkah Quadratic Probing**
96+
1.Gunakan fungsi hash untuk mendapatkan posisi awal
97+
```math
98+
h(k) = key \bmod \text{capacity}
99+
```
100+
2.periksa apakah slot kosong
101+
102+
- jika posisi h(k) kosong -> simpan data disitu
103+
104+
- jika sudah terisi lanjut ke langkah berikutnya
105+
106+
3.Gunakan fungsi kuadrat untuk mencari posisi baru
107+
saat terjadi `collision` ke-i,hitung posisi baru:
108+
```math
109+
h(k) = (h(k) + c1 * i + c2 *i * i) \bmod \text{capacity}
110+
```
111+
4.cek apakah slot hasil probing kosong
112+
113+
- jika posisi h(k) kosong -> simpan data disitu
114+
115+
- jika sudah terisi ->increment i(i++)
116+
117+
5.berhenti jika ditemukan posisi kosong atau table penuh
118+
119+
Salah satu implementasi Quadratic Probing dapat digunakan pada hash function: [Quadratic Probing.cpp](struktur_data/hash_table/open_adressing/quadratic_probing/division_method.cpp)

0 commit comments

Comments
 (0)