Efficient Time Cost LZW Compression Without Hash - The Code

09.24

Hari 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

You Might Also Like

0 komentar

When you think 11 and 12 is close, remember that there is infinite real numbers between them

Still, it's close enough
Diberdayakan oleh Blogger.