|
7 | 7 | */
|
8 | 8 | #include <iostream>
|
9 | 9 | #include <queue>
|
| 10 | +#include <string> |
10 | 11 |
|
11 | 12 | // huffman pohon node
|
12 | 13 | struct MinHeapNode {
|
13 |
| - // input karakter |
14 |
| - char data; |
15 |
| - // frekuensi dari karakter |
16 |
| - unsigned frekuensi; |
17 |
| - // kiri dan kanan node child |
18 |
| - MinHeapNode *kanan, *kiri; |
| 14 | + // input karakter |
| 15 | + char data; |
| 16 | + // frekuensi dari karakter |
| 17 | + unsigned frekuensi; |
| 18 | + // kiri dan kanan node child |
| 19 | + MinHeapNode *kanan, *kiri; |
19 | 20 |
|
20 |
| - MinHeapNode(char data, unsigned frekuensi) { |
21 |
| - kiri = kanan = NULL; |
22 |
| - this->data = data; |
23 |
| - this->data = frekuensi; |
24 |
| - } |
| 21 | + MinHeapNode(char data, unsigned frekuensi) { |
| 22 | + kiri = kanan = NULL; |
| 23 | + this->data = data; |
| 24 | + this->data = frekuensi; |
| 25 | + } |
25 | 26 | };
|
26 | 27 |
|
27 | 28 | // untuk membandingkan antara
|
28 | 29 | // heap node
|
29 | 30 | struct komparasi {
|
30 |
| - bool operator()(MinHeapNode *kiri, MinHeapNode *kanan) { |
31 |
| - return (kiri->frekuensi > kanan->frekuensi); |
32 |
| - } |
| 31 | + bool operator()(MinHeapNode *kiri, MinHeapNode *kanan) { |
| 32 | + return (kiri->frekuensi > kanan->frekuensi); |
| 33 | + } |
33 | 34 | };
|
34 | 35 |
|
35 | 36 | // menampilkan kode huffman dari
|
36 | 37 | // root pohon huffman
|
37 |
| -void printKode(struct MinHeapNode *root, std::string str) { |
38 |
| - if (!root) { |
39 |
| - return; |
40 |
| - } |
| 38 | +void printKode(struct MinHeapNode *root, const std::string& str) { |
| 39 | + if (!root) { |
| 40 | + return; |
| 41 | + } |
41 | 42 |
|
42 |
| - if (root->data != '$') |
43 |
| - std::cout << root->data << ":" << str << "\n"; |
| 43 | + if (root->data != '$') { |
| 44 | + std::cout << root->data << ":" << str << "\n"; |
| 45 | + } |
44 | 46 |
|
45 |
| - printKode(root->kiri, str + "0"); |
46 |
| - printKode(root->kanan, str + "1"); |
| 47 | + printKode(root->kiri, std::string(str) + "0"); |
| 48 | + printKode(root->kanan, std::string(str) + "1"); |
47 | 49 | }
|
48 | 50 |
|
49 | 51 | /**
|
50 | 52 | * bangun pohon huffman dan menampilkan kode dengan
|
51 | 53 | * melintasi pohon huffman yang dibagun
|
52 | 54 | */
|
53 | 55 | void KodeHuffman(char data[], int frekuensi[], int ukuran) {
|
54 |
| - struct MinHeapNode *kiri, *kanan, *atas; |
| 56 | + struct MinHeapNode *kiri, *kanan, *atas; |
55 | 57 |
|
56 |
| - // membuat min heap dan memasukkan semua karakter ke dalam data[] |
57 |
| - std::priority_queue<MinHeapNode *, std::vector<MinHeapNode *>, komparasi> |
58 |
| - minHeap; |
59 |
| - for (int i = 0; i < ukuran; ++i) |
60 |
| - minHeap.push(new MinHeapNode(data[i], frekuensi[i])); |
| 58 | + // membuat min heap dan memasukkan semua karakter ke dalam data[] |
| 59 | + std::priority_queue<MinHeapNode *, std::vector<MinHeapNode *>, komparasi> |
| 60 | + minHeap; |
| 61 | + for (int i = 0; i < ukuran; ++i) |
| 62 | + minHeap.push(new MinHeapNode(data[i], frekuensi[i])); |
61 | 63 |
|
62 |
| - // looping ketika ukuran heap tidak menjadi 1 |
63 |
| - while (minHeap.size() != 1) { |
64 |
| - kiri = minHeap.top(); |
65 |
| - minHeap.pop(); |
| 64 | + // looping ketika ukuran heap tidak menjadi 1 |
| 65 | + while (minHeap.size() != 1) { |
| 66 | + kiri = minHeap.top(); |
| 67 | + minHeap.pop(); |
66 | 68 |
|
67 |
| - kanan = minHeap.top(); |
68 |
| - minHeap.pop(); |
| 69 | + kanan = minHeap.top(); |
| 70 | + minHeap.pop(); |
69 | 71 |
|
70 |
| - // buat simpul internal baru dengan frekuensi sama |
71 |
| - // dengn jumlah dua node. |
72 |
| - // buat juga dua simpil yang diekstrasi sebagai child kiri |
73 |
| - // dan kana dan node baru ini, maka ditambahkan simpul ini |
74 |
| - // ke min heap "$" adalah nilai khusus untuk kode internal |
75 |
| - atas = new MinHeapNode('$', kiri->frekuensi + kanan->frekuensi); |
76 |
| - atas->kiri = kiri; |
77 |
| - atas->kanan = kanan; |
78 |
| - minHeap.push(atas); |
79 |
| - } |
| 72 | + // buat simpul internal baru dengan frekuensi sama |
| 73 | + // dengn jumlah dua node. |
| 74 | + // buat juga dua simpil yang diekstrasi sebagai child kiri |
| 75 | + // dan kana dan node baru ini, maka ditambahkan simpul ini |
| 76 | + // ke min heap "$" adalah nilai khusus untuk kode internal |
| 77 | + atas = new MinHeapNode('$', kiri->frekuensi + kanan->frekuensi); |
| 78 | + atas->kiri = kiri; |
| 79 | + atas->kanan = kanan; |
| 80 | + minHeap.push(atas); |
| 81 | + } |
80 | 82 |
|
81 |
| - // tampilkan kode huffman |
82 |
| - // menggunakan pohon huffman |
83 |
| - // yang sebelumnya sudah dibuat |
84 |
| - printKode(minHeap.top(), ""); |
| 83 | + // tampilkan kode huffman |
| 84 | + // menggunakan pohon huffman |
| 85 | + // yang sebelumnya sudah dibuat |
| 86 | + printKode(minHeap.top(), ""); |
85 | 87 | }
|
86 | 88 |
|
87 | 89 | // jalankan semua fungsi
|
88 | 90 | int main() {
|
89 |
| - char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'}; |
90 |
| - int frekuensi[] = {5, 9, 12, 13, 16, 45}; |
| 91 | + char arr[] = {'a', 'b', 'c', 'd', 'e', 'f'}; |
| 92 | + int frekuensi[] = {5, 9, 12, 13, 16, 45}; |
91 | 93 |
|
92 |
| - int ukuran = sizeof(arr) / sizeof(arr[0]); |
| 94 | + int ukuran = sizeof(arr) / sizeof(arr[0]); |
93 | 95 |
|
94 |
| - KodeHuffman(arr, frekuensi, ukuran); |
95 |
| - return 0; |
| 96 | + KodeHuffman(arr, frekuensi, ukuran); |
| 97 | + return 0; |
96 | 98 | }
|
0 commit comments