Pseudocode Analisis Perbandingan Kinerja Algoritma Shannon-Fano, Arithmetic Coding, Dan Huffman Pada Kompresi Berkas Teks Dan Berkas Citra Digital

28

3.2 Pseudocode

Pseudocode adalah penjelasan dari algoritma pemrograman komputer yang menggunakan struktur sederhana dari bahasa pemrograman. Biasanya yang ditulis dari pseudocode adalah variabel dan fungsi. Tujuan penggunaan utama dari pseudocode adalah untuk memudahkan dalam memahami prinsip-prinsip dari suatu algoritma. 3.2.1 Pseudocode pembacaan berkas Pada pembacaan berkas, berkas yang dibaca merupakan berkas yang dimasukkan secara digital. Pseudocode pembacaan berkas: bacafile { input file; String keluaran; if file == .txt { file = StringBuffer.toString; } else if file == .bmp { byte[] imageBytes = ByteArrayOutputStream.toByteArray; file = BASE64Encoder.encodeimageBytes; } output keluaran; } Flowchart dari pseudocode pembacaan berkas dapat dilihat pada Gambar 3.6. Universitas Sumatera Utara 29 Input File; String keluaran; File == .txt File = StringBuffer.toString; File == .bmp Output keluaran Selesai Mulai ya ya tidak tidak Byte[] imageBytes = ByteArrayOutputStream.toByteArray; File = BASE64Encoder.encodeimageBytes; Gambar 3.6 Flowchart Pembacaan Berkas 3.2.2 Pseudocode pengurutan frekuensi Pada pengurutan frekuensi, pengurutan dilakukan secara menaik. Pseudocode pengurutan frekuensi: sorting { array arr_char[int count,String char]; nchar = arr_char.count; kchar = arr_char.char; String char temp; for int i=0; ichar.length; i++ { for int j=0; jchar.length-1; j++ { if nchar[j] nchar[j+1] { temp = nchar[j]; nchar[j] = nchar[j+1]; nchar[j+1] = temp; } nchar[j].index = j; nchar[j+1].index = j+1; Universitas Sumatera Utara 30 } char.length-1--; } for int i=0; ichar.length; i++ { output kchar[i],nchar[i]; } } Flowchart pengurutan frekuensi karakter dapat dilihat pada Gambar 3.7. array arr_char[int count,String char]; nchar = arr_char.count; kchar = arr_char.char; String char temp; Mulai nchar[j] nchar[j+1] temp = nchar[j]; nchar[j] = nchar[j+1]; nchar[j+1] = temp; ya ya ya nchar[j].index = j; nchar[j+1].index = j+1; tidak Output kchar[i],nchar[i]; Selesai ya int i=0; ichar.length; i++ int j=0; jchar.length-1; j++ int i=0; ichar.length; i++ tidak tidak tidak char.length-1--; Gambar 3.7 Flowchart Pengurutan Frekuensi Karakter Universitas Sumatera Utara 31 3.2.3 Pseudocode kompresi algoritma Shannon-Fano Pseudocode proses kompresi algoritma Shannon-Fano: splitint my_index { ifmy_index 1 { array my_char[int s0_index, int s1_index, int s0_count, int s1_count]; String g_char, g_code; s0_char = my_char.length]; s1_char = my_char.length]; int i_s0_char = 0; int i_s1_char = 0; s0_index = 0; s1_index = my_index-1; s0_count = my_char[s0_index].g_count; s1_count = my_char[s1_index].g_count; s0_char = s_addmy_char[s0_index],s0_char,i_s0_char; i_s0_char++; s1_char = s_addmy_char[s1_index],s1_char,i_s1_char; i_s1_char++; karakter_s0 = my_char[s0_index].g_char; kode_s0 = my_char[s0_index].g_code; karakter_s1 = my_char[s1_index].g_char; kode_s1 = my_char[s1_index].g_code; my_char[s0_index].add_code1; outputkarakter_s0+ , +kode_s0; my_char[s1_index].add_code0; outputkarakter_s1+ , +kode_s1; forint i=0; imy_index; i++ { ifs1_index-s0_index == 1 || s1_index-s0_index == - 1 { ifs0_count s1_count { s0_index++; s0_count += my_char[s0_index].g_count; Universitas Sumatera Utara 32 my_char[s0_index].add_code1; s0_char = s_addmy_char[s0_index],s0_char,i_s0_char; i_s0_char++; outputkarakter_s0+ , +kode_s0; } else { s1_index--; s1_count += my_char[s1_index].g_count; my_char[s1_index].add_code0; s1_char = s_addmy_char[s1_index],s1_char,i_s1_char; i_s1_char++; outputkarakter_s1+ , +kode_s1; } } } splits0_char, i_s0_char; splits1_char, i_s1_char; } } Flowchart proses kompresi algoritma Shannon-Fano dapat dilihat pada Gambar 3.8 dan Gambar 3.9. Mulai My_index 1 array my_char[int s0_index, int s1_index, int s0_count, int s1_count]; String g_char, g_code; s0_char = my_char.length; s1_char = my_char.length; s1_index = my_index-1; s0_count = my_char[s0_index].g_count; s1_count = my_char[s1_index].g_count; s0_char = s_addmy_char[s0_index],s0_char,i_s0_char; i_s0_char++; s1_char = s_addmy_char[s1_index],s1_char,i_s1_char; i_s1_char++; ya tidak a b Gambar 3.8 Flowchart Kompresi Algoritma Shannon-Fano 1 Universitas Sumatera Utara int i=0; imy_index; i++ karakter_s0 = my_char[s0_index].g_char; kode_s0 = my_char[s0_index].g_code karakter_s1 = my_char[s1_index].g_char; kode_s1 = my_char[s1_index].g_code my_char[s0_index].add_code1; my_char[s1_index].add_code0; s0_count s1_count ya ya tidak splits0_char, i_s0_char; splits1_char, i_s1_char; ya output karakter_s0+ , +kode_s0; output karakter_s1+ , +kode_s1; Selesai s0_index++; s0_count += my_char[s0_index].g_count; my_char[s0_index].add_code1; s0_char = s_addmy_char[s0_index],s0_char,i_s0_char; i_s0_char++; s1_index--; s1_count += my_char[s1_index].g_count; my_char[s1_index].add_code0; s1_char = s_addmy_char[s1_index],s1_char,i_s1_char; i_s1_char++; s1_index – s0_index == 1 || s1_index – s0_index == -1 tidak tidak a b Gambar 3.9 Flowchart Kompresi Algoritma Shannon-Fano 2 Universitas Sumatera Utara 34 3.2.4 Pseudocode dekompresi algoritma Shannon-Fano Pseudocode proses dekompresi algoritma Shannon-Fano: decode { String bin, biner; array tree[String g_char, String g_code]; int binLength = bin.length; char[] binCharAt = bin.toCharArray; Stringbuffer bf; biner = ; for int i=0; ibinLength; i++ { biner += binCharAt[i]; for int j=0; jtree.length; j++ { output biner+ , +tree[j].g_code; if biner.equalstree[j].g_code { output karakter : +tree[j].g_char; bf.appendtree[j].g_char; output string : +bf; biner = ; } } } } Flowchart proses dekompresi algoritma Shannon-Fano dapat dilihat pada Gambar 3.10. Universitas Sumatera Utara 35 String bin, biner; array tree[String g_char, String g_code]; int binLength = bin.length; char[] binCharAt = bin.toCharArray; Mulai int i=0; ibinLength; i++ biner += binCharAt[i]; int j=0; itreeLength; j++ biner.equalstree[j].g_code bf.appendtree[j].g_char; biner; Output tree[j].g_char+bf; ya ya ya tidak tidak tidak Selesai Gambar 3.10 Flowchart Dekompresi Algoritma Shannon-Fano Universitas Sumatera Utara 36 3.2.5 Pseudocode kompresi algoritma Arithmetic Coding Pseudocode proses kompresi algoritma Arithmetic Coding: findDecimaldouble low, double high, String text { array header[symbol,range_min,range_max]; double min,max; iftext.length 0 { int i = 0; whiletext.charAt0 = header.symbol[i] { i++; } min = low+high-lowheader.range_min[i]; max = low+high-lowheader.range_max[i]; text =removeFirstChartext; findDecimalmin, max, text; } } final String findBinarydouble a,double b, String result{ ifa0.5 b0.5{ result = findBinary2a, 2b, result+0; }else ifa0.5 b0.5{ result = findBinarya-0.52, b-0.52, result+1; }else ifa==0 b=0.5{ result = result+0; }else ifa=0.5 b==1{ result = result+1; }else ifa=0.5 b= 0.5{ result = 1-2a b-0.52 - 0 ? findBinary2a, 1, result+0 : findBinary0, b-0.52, result+1; } return result; } arithmetic { double ifLength; char[] ifCharAt; StringBuffer sb; Universitas Sumatera Utara 37 String buff,bin; ifLength = inputfile.length; ifCharAt = inputfile.toCharArray; buff = ; for int i=0; iifLength; i++ { buff += ifCharAt[i]; if buff.length == 2 { findDecimal0,1,buff; bin = findBinarymin,max,; output buff+ : + min + - + max + bin : +bin; sb.appendbin; buff = ; } } if buff.length == 1 { findDecimal0,1,buff; bin = findBinarymin,max,; output buff+ : + min + - + max + bin : +bin; sb.appendbin; } Output sb; } Flowchart proses kompresi Arithmetic Coding dapat dilihat pada Gambar 3.11, Gambar 3.12, Gambar 3.13 dan Gambar 3.14. Universitas Sumatera Utara 38 Mulai Double ifLength; Char[] ifCharAt; StringBuffer sb; String buff,bin; ifLength = inputFile.length; ifCharAt = inputFile.toCharArray; buff = “”; int i=0; iifLength; i++; buff += ifCharAt[i]; buff.length == 2 findDecimal0,1,buff; bin = findBinarymin,max,””; sb.appendbin; buff = “”; ya ya tidak tidak output buff+ : + min + - + max + bin : +bin; a Gambar 3.11 Flowchart Kompresi Algoritma Arithmetic Coding 1 Universitas Sumatera Utara 39 buff.length == 1 findDecimal0,1,buff; bin = findBinarymin,max,””; sb.appendbin; ya tidak Selesai a Output sb; Gambar 3.12 Flowchart Kompresi Algoritma Arithmetic Coding 2 double low,high; String text; array header[symbol,range_min,range_max]; double min,max; int i = 0; Mulai findDecimal text.length 0 text.charAt0 = header.symbol[i] i++; tidak ya ya min = low+high-lowheader.range_min[i]; max = low+high-lowheader.range_max[i]; text =removeFirstChartext; findDecimalmin, max, text; Selesai tidak Gambar 3.13 Flowchart Method findDecimal Universitas Sumatera Utara 40 Mulai findBinary Double a,b; String result; a0.5 b0.5 result = findBinary2a, 2b, result +”0; a0.5 b0.5 result = findBinarya-0.52, b-0.52, result +”1; ya ya tidak a==0 b=0.5 result = result +”0; ya tidak a=0.5 b==1 result = result +”1; ya tidak a=0.5 b= 0.5 result = 1-2a b-0.52 - 0 ? findBinary2a, 1, result+0 : findBinary0, b-0.52, result+1; ya tidak result; tidak Selesai a a Gambar 3.14 Flowchart Method findBinary Universitas Sumatera Utara 41 3.2.6 Pseudocode dekompresi algoritma Arithmetic Coding Pseudocode proses dekompresi algoritma Arithmetic Coding: decodearith { int binLength,tempLength; array binRange[double range_min,double range_max]; array libRange[String libSymbol,double lib_min,double lib_max]; array header[String hsymbol,double h_min,double h_max]; char[] binCharAt,tempCharAt; StringBuffer sb; String bin,temp; binLength = bin.length; binCharAt = bin.toCharArray; temp = ; for int i=0; ibinLength; i++ { temp += binCharAt[i]; tempLength = temp.length; tempCharAt = temp.toCharArray; range_min = 0; range_max = 1; binRange = binValuebinRange,temp; for int j=0; jlibRange.length; j++ { if libRange[j].lib_min = binRange.range_min libRange[j].lib_max = binRange.range_max { sb.appendlibSymbol[j]; temp = ; } } } if temp.length = 0 { for int j=0; jsymbolLength; j++ { if header[j].h_min =binRange.range_min header[j].h_max=binRange.range_max { Universitas Sumatera Utara 42 sb.appendhsymbol[j]; temp = ; } } } Output sb; } Flowchart proses dekompresi algoritma Arithmetic Coding dapat dilihat pada Gambar 3.15 dan Gambar 3.16. Mulai int binLength,tempLength; array binRange[double range_min,double range_max]; array libRange[String libSymbol,double lib_min, double lib_max]; array header[String hsymbol,double h_min,double h_max]; char[] binCharAt,tempCharAt; StringBuffer sb; String bin,temp; binLength = bin.length; binCharAt = bin.toCharArray; temp = ; int i=0; ibinLength; i++; temp += binCharAt[i]; tempLength = temp.length; tempCharAt = temp.toCharArray; range_min = 0; range_max = 1; binRange = binValuebinRange,temp; int j=0; jLibLength; j++; libRange[j].lib_min = binRange.range_min libRange[j].lib_max = binRange.range_max sb.appendlibSymbol[j]; temp = “”; ya ya tidak tidak tidak a Gambar 3.15 Flowchart Dekompresi Algoritma Arithmetic Coding 1 Universitas Sumatera Utara 43 temp.length = 0 int j=0; jsymbolLength; j++; ya header[j].h_min =binRange.range_min header[j].h_max=binRange.range_max sb.appendheader.symbol[j]; temp = “”; ya tidak tidak Output sb; tidak Selesai a ya Gambar 3.16 Flowchart Dekompresi Algoritma Arithmetic Coding 2 3.2.7 Pseudocode kompresi algoritma Huffman Pseudocode proses kompresi algoritma Huffman: find_lowesthufftree[] mytree, int index { banding { bool kosong = true; int index = 0; int sum = 0; } banding[0] = new banding; banding[1] = new banding; array tchar[String g_char, String g_code, int g_count]; Universitas Sumatera Utara 44 for int i=0; iindex; i++ { output tchar[i].g_char,tchar[i].g_code; if mytree[i].sum = 0 { if result[0].kosong { result[0].index = mytree[i].index; result[0].sum = mytree[i].sum; result[0].kosong = false; } else if mytree[i].sum result[0].sum { result[0].sum = mytree[i].sum; result[0].index = mytree[i].index; } } } for int i=0; iindex; i++ { if mytree[i].sum = 0 mytree[i].index = result[0].index { if result[1].kosong { result[1].index = mytree[i].index; result[1].sum = mytree[i].sum; result[1].kosong = false; } else if mytree[i].sum result[1].sum { result[1].sum = mytree[i].sum; result[1].index = mytree[i].index; } } } int[3] out; out[0] = result[0].index; out[1] = result[1].index; if result[0].kosong || result[1].kosong { Universitas Sumatera Utara 45 out[2] = 1; } else { out[2] = 0; } returnout; } the_huffmanhufftree[] mytree,int i_mytree { int[3] lowest; lowest = find_lowestmytree,i_mytree; if lowest[2] == 0 { for int i=0; imytree[lowest[0].i_char_index; i++ { mytree[lowest[0]].char_index[i].add_code0; output tchar[i].g_char,tchar[i].g_code; } for int i=0; imytree[lowest[1].i_char_index; i++ { mytree[lowest[1]].char_index[i].add_code1; output tchar[i].g_char,tchar[i].g_code; } } } Flowchart proses kompresi algoritma Huffman dapat dilihat pada Gambar 3.17, Gambar 3.18, dan Gambar 3.19. Universitas Sumatera Utara 46 Mulai Find_lowest huffree[] mytree; int index; bool kosong = true; int index = 0; int sum = 0; array tchar[String g_char, String g_code, int g_count]; int i=0; iindex; i++; mytree[i].sum = 0 result[0].kosong result[0].index = mytree[i].index; result[0].sum = mytree[i].sum; result[0].kosong = false; mytree[i].sum result[0].sum result[0].sum = mytree[i].sum; result[0].index = mytree[i].index; ya ya ya ya tidak tidak tidak tidak a Gambar 3.17 Flowchart Method FindLowest 1 Universitas Sumatera Utara 47 int i=0; iindex; i++; mytree[i].sum = 0 mytree[i].index = result[0].index result[1].kosong result[1].index = mytree[i].index; result[1].sum = mytree[i].sum; result[1].kosong = false; mytree[i].sum result[1].sum result[1].sum = mytree[i].sum; result[1].index = mytree[i].index; ya ya ya ya tidak int[3] out; out[0] = result[0].index; out[1] = result[1].index; result[0].kosong || result[1].kosong out[2] = 1; ya out[2] = 1; tidak out Selesai tidak tidak tidak a Gambar 3.18 Flowchart Method FindLowest 2 Universitas Sumatera Utara 48 Mulai hufftree[] mytree,int i_mytree; int[3] lowest = find_lowestmytree,i_mytree; lowest[2] == 0 int i=0; imytree[lowest[0].i_char_index; i++ mytree[lowest[0].char_index[i].add_code0; output tchar[i].g_char,tchar[i].g_code; int i=0; imytree[lowest[1].i_char_index; i++ mytree[lowest[1]].char_index[i].add_code1; output tchar[i].g_char,tchar[i].g_code; Selesai tidak tidak tidak Gambar 3.19 Flowchart Kompresi Algoritma Huffman Universitas Sumatera Utara 49 3.2.8 Pseudocode dekompresi algoritma Huffman Pseudocode proses dekompresi algoritma Huffman: decode { String bin, biner; array tree[String g_char, String g_code]; int binLength = bin.length; char[] binCharAt = bin.toCharArray; Stringbuffer bf; biner = ; for int i=0; ibinLength; i++ { biner += binCharAt[i]; for int j=0; jtree.length; j++ { output biner+ , +tree[j].g_code; if biner.equalstree[j].g_code { output karakter : +tree[j].g_char; bf.appendtree[j].g_char; output string : +bf; biner = ; } } } } Flowchart proses dekompresi algoritma Huffman dapat dilihat pada Gambar 3.20. Universitas Sumatera Utara 50 String bin, biner; array tree[String g_char, String g_code]; int binLength = bin.length; char[] binCharAt = bin.toCharArray; Mulai int i=0; ibinLength; i++ biner += binCharAt[i]; int j=0; itreeLength; j++ biner.equalstree[j].g_code bf.appendtree[j].g_char; biner; Output tree[j].g_char+bf; ya ya ya tidak tidak tidak Selesai Gambar 3.20 Flowchart Dekompresi Algoritma Huffman Universitas Sumatera Utara 51

3.3 Perancangan Antarmuka