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; ArrayListnext; //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 ArrayListkamus = 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