Pakkausalgoritmi

Seuraa 
Viestejä45973
Liittynyt3.9.2015

Ohjelmoinpas tässä aikani kuluksi tällaisen pikku pakkausalgoritmin ja päätin pistää sen tänne open source-ohjelmien tapaan muidenkin fundeerattavaksi.

Valmiin algoritmin olisi määrä tunnistaa muuttujasta useamman saman merkin sarjoja tyyliin:

hdrgyyyeyorjjjjjshhhh
--->
hdrg3yeyor5js4h



Nykyisellään algoritmi toimii vielä väärin ja antaa täysin vääriä pakkauksia.

Koodini on melkoista puuroa, kun en ole C:llä ohjelmoinut pitkään aikaan.

Koodin toiminnasta hiukan niille, jotka eivät ymmärrä:
Ohjelma siis lukee tiedoston tieto.txt ja ulostaa pakatun tiedon tiedostoon pakattu.txt. Sen jälkeen se tarkistaa viiden merkin sarjoja ja korvaa ne.

Olisi hyvä, jos joku osaisi antaa kehittäviä kommentteja.

[code:2dnz60tw]#include
#include
int main(void)
{
int a = 0;
int b = 1;
int c = 2;
int d = 3;
int e = 4;
int f = 5;
int pakka = 1;
int pakkb = 2;
int pakkc = 3;
int koko =100;
int pakattukoko=100;
char x[1];
char tieto[100];
char pakattutieto[pakattukoko];
FILE * pFile;
pFile = fopen ("tieto.txt" , "r");
if (pFile == NULL) perror ("Tiedostoa ei voitu avata");
else {
fgets (tieto , 100 , pFile);
fclose (pFile);
}
FILE *sFile;
sFile = fopen ("pakattu.txt", "w");
if (sFile == NULL) perror ("Tiedostoa ei voitu avata");
else
{
do
{
if (tieto[a]==tieto[b] && tieto[b]==tieto[c] && tieto[c]==tieto[d] && tieto[d]==tieto[e]);
fprintf(sFile, "5%c" , tieto[a]);
a=a+5;
b=b+5;
c=c+5;
d=d+5;
e=e+5;
}
while (a<100);
fclose(sFile);
}
return 0;
}

[/code:2dnz60tw]

Kommentit (6)

Kosh
Seuraa 
Viestejä21228
Liittynyt16.3.2005

Vai että kommentteja... mistäköhän aloittaisi.

Ensin pitänee sanoa, että turha vaiva. Kaikki on jo tehty paremmin. Mutta ainahan voi harratsaa, joten katsotaanpa. Ensinnäkin, pakkaus on turhaa jos ei ole vastaavaa purkua. Menetelmässäsi on se ongelma, että miten tunnistetaan purettaessa ne merkkijonot jotka voidaan prukaa. Esimerkiksi 3y voi olla yyy tai sitten ihan oikeasti 3y. Tuo ongelma on pakko ratkaista ensin.

Toinen juttu, että pakkauksesi hyötysuhde on melko surkea. Jos rajoitut vain saman merkin monikertoihin, suurimmassa osassa tekstiä todennäköisyys saavuttaa mitään hyötyä (yli kaksi samaa merkkiä peräkkäin) on erittäin pieni, ja sittenkin näitä monikertakirjaimia on tosi harvassa. Kannattaisi mieluummin etsiä vaikka vapaavalintaisia kirjainkombinaatiota jotka esiintyvät materiaalissa useamman kerran, ja korvata ne jollain koodilla. Sitten tarvitaan hakutaulukko kaikille korvatuille merkkijonoille. Eli esim. korvataan tekstin jokainen "_on_" (jossa alaviiva tarkoittaa välilyöntiä) merkkijonolla %¤ ja tiedoston alkuun kirjoitetaan %¤=" on ". Jos noita komboja on puolenkymmentä tai enemmän, säästetään tilaa. Samoin voidaan pakata yleisimpiä tavuja tai sanoja korvauskoodilla.

Jos viedään ajattelua pidemmälle, niin ascii-merkit kannattanee korvata jollain muulla merkistökoodauksella. Voi käyttää vaikkapa niiden kahdenkasnbittisiä numeroarvoja desimaali- tai binaarilukuina. Binaaritiedostossa löytynee helposti toistuvia sekvenssejä joilla pakkaaminen onnistuu paremmin.

Tosiasiassa ascii-tekstin pakkaaminen on kai aika läpikoluttua kamaa. Ja varsin hyödytöntä, sillä informaatiosisältöön suhteutettuna kirjoitettu teksti on melko tilaystävällinen talletusmuoto. Muunlaisissa signaleissa voi riittää enemmänkin pähkittävää.

Koodia en jaksa edes lukea, saati kommentoida.

Se oli kivaa niin kauan kuin sitä kesti.

Vierailija

char lause[]="aaaaaaaaaaaaabaaaaa";
char * tmp;

tmp=etsijakorvaa(lause,"aa",2a) ; // 2a2a2a2a2a2ab2a2aa
tmp=etsijakorvaa(lause "2a2a",4a); // 4a4a4ab4aa

noin se käy aika kätevästi

etsijakorvaakin on varmaan jossain kirjastossa

Vierailija

tmp=etsijakorvaa(lause,"aa",2a) ; // 2a2a2a2a2a2ab2a2aa
tmp=etsijakorvaa(lause "2a2a",4a); // 4a4a4ab4aa

tuossahan on bugi ^..................^ ja tuossa syntax error

entäs jos laskisi nollabitit ja ykkösbitit?

Vierailija

Sitten kun saat kehiteltyä algoritmin joka supistaa alkuperäsen tekstin 10-20 prosenttiin niin olet jo melkeen saavuttanut jotain. Ei tämä vielä mitään.

Uusimmat

Suosituimmat