Efficient Time Cost LZW Compression Without Hash - The Code
09.24Hari ini batas pengumpulan Tugas 1 SDA, gua ngerapihin tugas gua, dokumentasi, dan implementasi algo yag lebih mudah dibaca, soalnya yang di post Efficient Time Cost LZW Compression Without Hash susah banget dibaca dan dimengerti. Mungkin terlalu telat untuk share, tapi ga pa pa lah, siapa tau bisa buat belajar.
Gua implementasi Trie yang baru :
/**
* Kelas khusus Trie, sebagai struktur data untuk penyimpanan data kamus tambahan
*
* @author Thirafi Dide (Yusei) - 1206240814
*/
class Trie {
/**
* Node untuk data di dalam Trie
*/
class TrieNode {
//data
char key;
int value;
ArrayList next;
//constructor
public TrieNode(char key, int value) {
this.key = key;
this.value = value;
this.next = new ArrayList();
}
//to string (test purpose)
public String toString() {
return "( " + key + next.toString() + ")";
}
}
//header untuk trie
TrieNode header = new TrieNode('.', 0);
/**
* Menambahkan data ke dalam trie
*
* @param theString String key dari data yang ingin dimasukkan
* @param value int nilai dari data yang ingin dimasukkan
* @return boolean true jika berhasil dimasukkan, false jika tidak berhasil
*/
public boolean add (String theString, int value) {
TrieNode current = header;
int charAt = 0;
//ketika charAt belum menunjuk karakter terakhir
while (charAt < theString.length() - 1) {
//baca child (next) dari current
for (int i = 0; i < current.next.size(); i++) {
//jika ada child yang cocok, ganti current menjadi child tersebut dan
//majukan pointer charAt
if (current.next.get(i).key == theString.charAt(charAt)) {
current = current.next.get(i);
charAt++;
break;
}
}
}
//tambahkan data di current yang terakhir
return current.next.add(new TrieNode(theString.charAt(charAt), value));
}
/**
* Mengambil data value dari key tiap node
*
* @param theString String data yang ingin dicari nilai value-nya
* @return int nilai dari value data tersebut
*/
public int valueOf (String theString) {
TrieNode current = header;
int charAt = 0;
//ketika charAt belum menunjuk karakter terakhir
while (charAt < theString.length()) {
//simpan charAt sebelum dimanipulasi
int charAtToCheck = charAt;
//baca child (next) dari current
for (int i = 0; i < current.next.size(); i++) {
//jika ada child yang cocok, ganti current menjadi child tersebut dan
//majukan pointer charAt
if (current.next.get(i).key == theString.charAt(charAt)) {
current = current.next.get(i);
charAt++;
break;
}
}
//jika charAt tidak termanipulasi, berarti data tidak ditemukan
if (charAtToCheck == charAt) return - 1;
}
//kembalikan nilai value data current
return current.value;
}
//to string (test purpose)
public String toString() {
return header.next.toString();
}
/**
* Mengembalikan semua data child dari node header
*
* @return String Semua data child dari node header
*/
public String childList() {
StringBuilder childList = new StringBuilder();
for (int i = 0; i < header.next.size(); i++) {
childList.append(header.next.get(i).key);
}
return childList.toString();
}
}
Dan LZW-nya biasa aja, seperti ini :
/**
* MbakYuyun class, melakukan enkripsi string masukan dengan metode LZW
*
* @author Thirafi Dide (Yusei) - 1206240814
* @version 2.0b-unrecursive
*/
public class MbakYuyun {
//counter khusus untuk mengetahui jumlah data dalam kamus tambahan
public static int counter = 0;
/**
* Main Method
*/
public static void main (String[] args) throws Exception{
// For Test Only
// double before = System.currentTimeMillis();
//Input reader
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//ArrayList of String untuk sorting, dengan inisiasi nilai 255 char kosong
//255 adalah jumlah karakter ASCII
ArrayList kamus = new ArrayList(255);
for (int i = 0; i < 255; i++) {
kamus.add(null);
}
//kamus sebenarnya
Trie kamusIndex = new Trie();
//baca input
String inputS = reader.readLine();
//jika terdapat input
if (inputS != null) {
///// START OF SORTING SEQUENCE //////
/*
* SORTING ALGORITHM
* Metode sorting pseudo-counting sort. Menciptakan arraylist of char dengan size 255,
* lalu baca karakter dari input, set elemen ke-(nilai int dari char yang dibaca) menjadi
* char tersebut. Jika semua karakter sudah terbaca, salin elemen yang bukan null ke array
* kamus yang baru, sehingga array baru menjadi terurut
*/
//mengisi kamus sesuai ascii karakter
for (int i = 0; i < inputS.length(); i++) {
kamus.set((int) inputS.charAt(i), inputS.charAt(i));
}
//menambahkan hasil sort ka kamus yang sebenarnya
for (int i = 0; i < kamus.size(); i++) {
Character current = kamus.get(i);
if (current != null)
kamusIndex.add(current + "", ++counter);
}
//tampilkan kamus awal
System.out.println(kamusIndex.childList());
//mulai enkripsi
String S = "";
StringBuilder result = new StringBuilder();
StringBuilder input = new StringBuilder(inputS);
int inputLength = input.length();
//loop selama input masih bersisa
for (int i = 0; i < inputLength; i++) {
//baca karakter pertama dalam input
char c = input.charAt(i);
//hasil S + c
String SPlusC = S + c;
int sPcI = kamusIndex.valueOf(SPlusC);
//jika S + c tidak terdapat dalam kamus
if (sPcI < 0) {
//tambahkan S + c ke kamus, tambahkan output sesuai S, lalu S = c
kamusIndex.add(SPlusC, ++counter);
int SIndex = kamusIndex.valueOf(S);
result.append(SIndex);
result.append(' ');
S = "" + c;
//jika S + c ada di kamus
} else {
//S = S + c
S = SPlusC;
}
}
//tambahkan output dengan index sisa S
int SIndex = kamusIndex.valueOf(S);
result.append(SIndex);
//tampilkan output
System.out.println(result);
// For Test Only
// double after = System.currentTimeMillis();
// System.out.println((after - before) / 1000);
}
}
}
* Tolong gunakan kode untuk referensi, bukan untuk di copy-paste untuk tugas masing-masing
* Sebenarnya gua juga belom yakin apakah ini emang cara terbaik. Gua masih ngerasa kayaknya masih ada cara yang lebih mudah
0 komentar