Zudoku / hydraulic-press

Projektin aiheena on toteuttaa Huffman coding, Lempel-Ziv (LZ77) tiedostonpakkaus algoritmit.
0 stars 0 forks source link

Vertaispalaute #1 #2

Open kotommi opened 5 years ago

kotommi commented 5 years ago

Noudettu 11.4. klo 18 26e2679

Ylipäätään koodisi on luettavaa ja jaettu Javamaisiin kokonaisuuksiin. Osa bittimagiasta olisi ehkä tarvinnut kommentteja.

Ainoa toteutukseen liittyvä ongelma minkä huomasin on BitBlobin append-metodin kutsuminen monta kertaa joka ei ole kovin kevyt operaatio, koska luot uudet ja kopiot niiden sisäiset taulukot todella monta kertaa. Onnistuisiko tässä jokin toinen tapa jossa ensin keräät yksittäiset bittijonot kokoelmaksi ja lopuksi konkatenoisit ne kerralla?

Jos lisäät seuraavat rivit build.gradle-tiedostoon niin ohjelman voi ajaa komennolla gradle run. gradlen luoman 'portable executable'n gradlew voisi sisällyttää projektiin niin silloin toisten olisi helpompi aloittaa projektin käyttö.

apply plugin: 'application'
mainClassName = 'fi.zudoku.hydraulic.Main'

Projekti ei kääntynyt koneellani checkstylen errorien takia. Kannattaa vaihtaa sen asetuksista errorit warningeiksi jos ei viilaa niitä heti pois.

<property name="severity" value="warning"/>

Checkstylen korjattuani tämä testi ei mennyt läpi:

fi.zudoku.hydraulic.domain.huffman.CompressHuffManCodingTest > testTreeIsSerializedTheRightWay FAILED
    java.lang.AssertionError at CompressHuffManCodingTest.java:44

Mutta kun kommentoin sen pois ohjelma näytti toimivan testisyötteellä. (Tai no se räjäytti ide:ni terminaalin, mutta toimi normaalilla terminaaliemulaattorilla. En usko että se on ohjelmasi vika) Vika testissä on rivillä 45 ja sain sen korjattua ja toimimaan.

// original
results.put(byteCutOff, nodeFrequency);
// fixed
results.put(dataToCompress, nodeFrequency);

BitBlob-luokan rivi 42 yksinkertaistuu

int byteIndex = (int) Math.floor((numOfBits - 1) / 8);
int byteIndex = (numOfBits - 1) / 8

Huffman-koodauksen otsake näyttää aika isolta, mutta toisaalta se nyt toimiva toteutus ja sitä voi optimoida myöhemmin jos aikaa jää. Yksi tapa on käyttää kanonista Huffman-koodausta tai käydä puu läpi jollain tavalla ja kirjoittaa vain koodisanat ja solmut sinne. Esim. puumuodolla saa viilattua yli tavun per merkki otsakkeessa.

kotommi commented 5 years ago

Testasin vielä ohjelmaa isommalla syötteellä ja se on todella hidas. Kannattaa tosiaan miettiä miten ohjelmasta saa tehokkaamaan. Tuossa purkamisvaiheessa growByteArrayWithOne-metodin kutsuminen moneen kertaan on todennäköisesti suurin vaikuttaja nopeuteen(hitauteen?). Nyt kopioit taulukon joka kerta ennen kuin lisäät sinne yhden alkion joka on todella raskasta kun syötekoko kasvaa. Joku dynaaminen taulukko kuten Javan ArrayList olisi varmaan sopiva tähän käyttötarkoitukseen.

tomko@kupo:~/tira/hydraulic-press/hydraulic-press$ gradle run

> Task :run
original: 1810827

starting to compress
appends: 1810827
compressed: 1808048

compression done, took: 371seconds
uncompressed:1810827

decompression done, took: 181 seconds

BUILD SUCCESSFUL in 9m 12s

Tässä linkki nopeasti häkättyyn mainiin jota käytin gist Tuosta isosta pakkauskoosta ei kannata välittää koska tiedosto oli (jo valmiiksi pakattu) pdf.