Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Sort kompresija podataka

[es] :: Art of Programming :: Sort kompresija podataka

[ Pregleda: 2611 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
212.200.249.*



+1 Profil

icon Sort kompresija podataka24.10.2008. u 14:59 - pre 188 meseci
Davno sam dosao na ovu ideju, ali do sada nisam stigao da se pozabavim tematikom.
Planiram da napravim jedno istrazivanje na tu temu, pa sam hteo da vidim
kako ocenjujete samu ideju i da li ce neko imati neke smernice za samo istrazivanje.

Evo o cemu se radi.

Pod pretpostavkom da imamo niz bajtova proizvoljne duzine bez obzira na samu strukturu
(entropiju, kao i sekvence koje se ponavljaju)

entropija informacije koliko kojih bajtova ima unutar datog niza je dosta mala (tabela frekvencija).
Za recimo 64K nam treba 512 bajtova u opstem slucaju da se zapishe tabela frekvencija.
Po word za svaki bajt ulaznog niza a posto ima 256 razlicitih vrednosti, i imamo bafer od 64K
matematika je jasna - 512 bajtova (index u word array-u oznacava za koji bajt se gleda, a sama
vrednost word-a je broj ponavljanja datog bajta)

Ova informacija se moze iskoristiti da bi se rekonstruisao niz od 64K bajtova koji imaju sledecu
karakteristiku:

Svi bajtovi koji su prisutni u rekonstruisanom nizu, prisutni su i u ulaznom nizu. Tacno onoliko
razlicitih vrednosti koliko ima u ulazu ima i u izlaznom nizu. Izlazni niz je zapravo ulazni
niz, soritiran tako da vrednosti budu po rastucem ili opadajucem redosledu.

Pored ove table frekvencija, bilo bi bitno zapisati i redosled operacija kojim se od ulaznog niza
doslo do izlaznog niza kako bi se moglo backtrackingom rekonstruisati ulazni niz.

U opstem slucaju, operacije koje se koriste prilikom sortiranja mogu se vrlo lako kodirati u samo
par bita.

Obicno su to operacije tipa :
- poredjenje 2 vrednosti i ishod poredjenja
- zamena mesta vrednostima
- prelazak na sledece poredjenje (pomeranje indexa, u jednu ili drugu stranu)

Znaci za svaki sort algoritam se moze konstruisati varijanta algoritma koja ce prilikom sortiranja
generisati niz brojeva (i to iz dosta malog skupa, od par cifara) takav da opisuje trenutnu operaciju
u datom algoritmu, a iz kojeg se moze rekonstruisati pocetno stanje u odnosu na zavrsni sortirani niz

Odokativnom metodom sam dosao do zakljucka da je vrlo moguc sledeci scenario:
u zavisnosti od algoritma, odredjene sekvence bajtova unutar ulaznog niza
(vishebajtne reci koje se ponavljaju) ce proizvesti iste sekvence operacija u izlazu, znaci ovom
transformacijom bi se u odredjenim slucajevima zadrzala redudancija ulaznog niza, pa je moguce
na izlaznom nizu transformacije (kodovi operacija) primeniti neki od vec postojecih algoritama
za kompresiju koji se oslanjaju na redudanciju informacija ovog tipa.

Takodje mi se cini da ce odredjeni algoritmi za sortiranje proizvesti distinktno razlicite frekvencije
operacija (mnogo vishe poredjenja nego recimo zamena ili dosta pomeranja indexa u odnosu na ostale
operacije), samim tim i neka vrsta entropijskog kodiranja izlaza dolazi u obzir.

Da li znate za istrazivanja koja su se bavila ovom idejom, i ako da, do kakvih rezultata se doslo?
Sta generalno mislite o samoj ideji?

Vredi li se upustati u istrazivanje i implementaciju ovakvog pristupa kompresiji?
Voleo bih kada bi zainteresovani prodiskutovali ovaj pristup pre nego sto se upustim u bilo
kakav istrazivacki rad na datu temu.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.222.97.*



+2790 Profil

icon Re: Sort kompresija podataka25.10.2008. u 20:36 - pre 188 meseci
Ta ideja se koristi za sortiranje nizova sa malim fiksnim skupom vrednosti u linearnom vremenu. Prebroj koliko ima kojih članova i ispali ih po toliko puta.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p6-214.bvcom.net.



+1064 Profil

icon Re: Sort kompresija podataka26.10.2008. u 00:28 - pre 188 meseci
Odlicna ideja. Da sortirano posaljes zajedno sa kontrasortom, koliko sam shvatio.

Jedina operacija koja ti je potrebna tu je swap dva elementa. Nista drugo.
I redom kako ispratis swapove dobio si original. E sad treba ti sort algoritam koji
ima najmanje swapova. Mislim da je to enhanced shell sort. Probaj da dokazes
da broj swapova kod ovog sorta u proseku ne prelazi velicinu u slucaju da nisi kompresovao
i imas resenje ;)
Sto se redundantnosti tice operaciju belezis sa index-index i vise ti nista ne treba.
Sa te strane imaces malo redundansnosti mislim u okviru samog niza operacija,
sto je algoritam efikasniji u tom smislu.

Pozdrav!

Nadam se da sam malo pomogao.
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.222.97.*



+2790 Profil

icon Re: Sort kompresija podataka26.10.2008. u 16:58 - pre 188 meseci
Svaki niz dužine n se može sortirati sa najviše n-1 premeštanja, pod uslovom da znamo šta treba da premeštamo.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p3-219.BVCOM.NET.



+1064 Profil

icon Re: Sort kompresija podataka27.10.2008. u 11:27 - pre 188 meseci
To je problem, mislim da i kod enhanced shell sorta kad je niz bas random
bude 3 puta n.

Pozdrav!
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
212.200.249.*



+1 Profil

icon Re: Sort kompresija podataka27.10.2008. u 11:59 - pre 188 meseci
Evo sam nesto malo stigao da razmisljam,
za pocetak bi krenuo sa malo vezbanja i bubble sort-om.

Znaci prvi korak bi bio napraviti bubble sort sa odgovarajucim izlazom
kao i inverzni bubble sort koji ce sortirani niz, na osnovu izlaza iz samog
sorta da vrati u originalno stanje.

Za bubble sort, mislim da je dovoljno da se izbacuju vrednosti 0,1
za svaku operaciju.

Code:

bool sorted = false;

while(!sorted){
  sorted = true;
  for(int i=0;i<(n-1);i++){
    if(buffer[i]<buffer[i+1]){
      swap(buffer[i],buffer[i+1];
      output(1);  
      sorted = false;
    }else{
      output(0);
    }
  }
}


Ova verzija bubble sorta, prati promene u buffer nizu i u slucaju da se ne uradi ni jedan
swap zakljucuje da je sortiranje zavrseno.

Mislim da se sa sigurnoscu moze odbaciti poslednjih n-1 nula u izlazu, zato sto nisu
neophodni za rekonstrukciju.

Sam izlaz ce biti (n-1)*k bitova (vrednosti 0,1)

a za njihovo kodiranje je potrebno uzeti neki pogodan algoritam od vec postojecih

Iskreno, sumnjam da ce ova transformacija sa bubble sortom, doprineti vecem
stepenu kompresije, ali je interesantna za razmisljanje o pravljenju izlaza sort
algoritma kao i inverznog algoritma za vracanje u prvobitno stanje.

Ostaje u ovoj konkretnoj vezbi da se napravi inverzni algoritam.
Ima li neko zelju da se oproba?
 
Odgovor na temu

X Files
Vladimir Stefanovic
Pozarevac

SuperModerator
Član broj: 15100
Poruke: 4902
*.dynamic.sbb.rs.

Jabber: xfiles@elitesecurity.org


+638 Profil

icon Re: Sort kompresija podataka27.10.2008. u 13:38 - pre 188 meseci
@vlaiv

Samo da javim da pratim ovu temu... Trenutno sam u guzvi sa redovnim obavezama, ali u nekom trenutku cu se valjda i aktivnije ukljuciti.

Mogao bi ovu temu da postavis i u TOP dok god bude bila aktivna. Meni deluje obecavajuce.
 
Odgovor na temu

Branimir Maksimovic

Član broj: 64947
Poruke: 5534
c-bg-d-p3-219.bvcom.net.



+1064 Profil

icon Re: Sort kompresija podataka27.10.2008. u 15:15 - pre 188 meseci
Malo sam razmisljao i dosao do sledeceg zakljucka.
Najbolji sort za ovo je selection sort cini mi se jer on obezbedjuje n-1 swapova maximum
na n elemenata.
Kako je broj bitova potreban da se zabelezi koji sa kojim se swapuje odredjen velicinom
niza to je za 64k buffer potrebno 16 bitova. Sto ce reci potreban je u najgorem slucaju
niz od 16*(n-1) bitova, a u najboljem 0 bitova kad je sortirano.
Sto ce reci u proseku se sa ovim ne postize kompresija.

Za tvoj bubble sort. Kako je kompleksnost n^2 u najgorem slucaju imas toliko
bitova. U slucaju najbolje redundantnosti potrebno ti je minimum 16*(n-1)
bitova da bi to kompresovao, sto je isto kao kod selection sorta u najgorem slucaju.
Dakle po meni sve jedno je da li ces kompresujes redundante bitove ili ces da zapises index sa obzirom da
drugi index vec znas u slucaju selection sorta sa tim da u slucaju selection sorta
u najgorem slucaju dobijas dvaput veci niz a kod bubble jos veci od toga
posto zavisi od kompresije samih bitova?

Ili sam negde pogresio ;)

Pozdrav!

 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
212.200.249.*



+1 Profil

icon Re: Sort kompresija podataka27.10.2008. u 15:41 - pre 188 meseci
Potpuno si u pravu.

Najgori slucaj za bubble sort scenario bi bio naravno
kada je najmanji bajt na poslednjem mestu.

generalno broj prolaza (od kog zavisi broj bitova) k,
je u slucaju predlozene varijante bubble sorta sledeci

max(i-j), unsorted = sorted[j] i<j, i,j < n

ili kada poslednji element treba da se prebaci na prvo mesto
(po jedan pomeraj po prolazu)

u tom slucaju imamo (n-1)*(n-1) bitova sto je
64K*8K oko 8000 puta vishe bajtova (za ulaz od 64K)

Cak i sa nekom srednjom vrednoscu, a dalo bi se izracunati
distribucija verovatnoce broja prolaza, opet je situacija nepovoljna.

Ono sto sam hteo da demonstriram sa bubble sort-om, jeste sledecih par stvari:

- Nacin da se napravi inverzija u odnosu na sortiranje (minimum potrebnih informacija) a u zavisnosti od izabranog
algoritma
- Postojanje mogucnosti da se zadrzi redudancija informacija iz pocetnog skupa (to cu dole pokazati)
- Izbor adekvatnog kompresionog algoritma da se informacija o sortiranju zapishe kako bi se postigle ushtede.

Znaci citav ovaj proces sortiranja treba posmatrati kao transformaciju ulaza radi postizanja bolje komresije
(ukoliko je moguce naravno).

E sad, sto se same redudancije tice, a koristi se u vishe razlicitih algoritama (lzw, lz77/78, ppm i sl, zapravo
svi koji se oslanjaju na neki rechnicki metod), mozemo zakljuciti sledece:

uzmimo ulazni niz koji izgleda ovako
........ 9,2,7,4,5,8 ...... 9,2,7,4,5,8 ....

u prvom prolazu ce posle algoritma situacija biti :

......... 2,7,4,5,8,9 ...... 2,7,4,5,8,9 .....

a izlazi ce biti

....... 1,1,1,1,1,1 ...... 1,1,1,1,1,1 .....

drugi prolaz ce recimo uciniti sledece

...... 2,4,5,7,8,9 ....... 2,4,5,7,8,9 ....

sto ce na izlazu dati sledece :

....... 0,1,1,0,0,0 ..... 0,1,1,0,0,0 ....

Znaci da iste sekvence brojeva transformacijom daju iste
sekvence bitova, i samim tim, ne gubi se eventualna redudancija
koja bi se mogla iskoristiti u nekoj recnickoj metodi.

Znaci, samo sortiranje nije po sebi metod kompresije, nego pokusaj
da se zapishe unutrasnja struktura rasporeda informacija, kako bi se ona
eventualno bolje iskomprimovala naknadno (nekim od postojecih algoritama).

Pored toga, bubble sort daje izuzetno mali izlazni skup (0,1), ostali algoritmi
ce sigurno imati veci izlazni skup.

I sam bubble sort se moze drugacije odraditi, odnosno da se napravi da daje
veci izlazni skup.

Recimo, umesto da se izbacuje 1 za swap i 0 za nastavak, moze se izbacivati
0 za swap i broj pomeraja bez swap-a ukoliko se pokaze da je u opstem
slucaju veca frekvencija broja pomeraja u odnosu na swap-ove.

Ali to nije neophodno raditi. Ista stvar se dobija ako se uposli RLE na izlazni
skup (0,1)

U svakom slucaju, nakon konstrukcije odgovarajuceg inverznog sortiranja
za bubble, bilo bi zgodno pogledati i druge sort algoritme, konstruisati odgovarajuce
izlaze i inverzije i prodiskutovati sta oni donose u konkretnom slucaju.

Kao podsetnik predlazem

http://en.wikipedia.org/wiki/Sorting_algorithm
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2790 Profil

icon Re: Sort kompresija podataka27.10.2008. u 16:33 - pre 188 meseci
Ako ti kvadratno vreme nije preskupo, mogu ti dati algoritam za nalazenje najmanjeg moguceg niza transpozicija kojim se niz sortira.

Pretpostavimo da ti je dat niz

9,3,2,5,4,7,8,1,6

Sortiran izgleda ovako

1,2,3,4,5,6,7,8,9

Izaberi bilo koji element koji nije na svom mestu. Ja cu ovde primera radi uzeti 9. Na mestu na kome treba da je 9 stoji 6, a na mestu na kome treba da je 6 stoji 7, a na mestu na kome treba da je 7 stoji 8, a na mestu na kome treba da je 8 stoji 1, a na mestu na kome treba da je 1 stoji 9. Vratili smo se do 9 i belezimo ovaj ciklus:

(9,6,7,8,1)

Sada izaberimo bilo koji broj koji nije na svom mestu i koji nije u navedenom ciklusu. Ja cu uzeti broj 3. Na mestu na kome treba da je 3 stoji 2, a na mestu na kome treba da je 2 stoji 3. Vratili smo se do 3 i belezimo ovaj ciklus.

(3,2)

Broj 5 nije na svom mestu i nije u navedenim ciklusima. Na mesti na kome treba da je 5 stoji 4, a na mestu na kome treba da je 4 stoji 5. Vratili smo se do 5. Bezelimo ovaj ciklus:

(5,4)

Konacno, niz transpozicija je:

9,3,2,5,4,7,8,1,6 pocetno stanje
6,3,2,5,4,7,8,1,9 9 i 6 su zamenili mesta
7,3,2,5,4,6,8,1,9 6 i 7 su zamenili mesta
8,3,2,5,4,6,7,1,9 7 i 8 su zamenili mesta
1,3,2,5,4,6,7,8,9 8 i 1 su zamenili mesta
1,2,3,5,4,6,7,8,9 3 i 2 su zamenili mesta
1,2,3,4,5,6,7,8,9 4 i 5 su zamenili mesta

Dakle, broj transpozicija je zbir duzina ciklusaumanjenih za po 1, tj. zbir duzina svih ciklusa umanjen za ukupan broj ciklusa (u nasem slucaju (5-1)+(2-1)+(2-1)=(5+2+2)-3=6). Dati niz je nemoguce sortirati sa manjim brojem transpozicija.

Ovo je bio slucaj kada u nizu nema ponavljanja. U suprotnom, postupak je slican , samo sto sa vredosti treba preci na pozicije. Problem je u tome sto isti element moze biti na razlicitim pozicijama, pa treba naci ono resenje koje ima najveci broj ciklusa. Dakle, ciklusi treba da budu sto kraci.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
77.46.207.*



+1 Profil

icon Re: Sort kompresija podataka27.10.2008. u 18:05 - pre 188 meseci
@Nedeljko

To takodje ne bi bilo loshe za pogledati, mozes li napraviti
neki adekvatan izlaz (mada i same transpozicije su izlaz pomocu
kojeg se moze rekonstruisati polazni niz).

Ovde u generalnom slucaju zavisi od broja transpozicija, a cenim
da bi trebalo 4 bajta po transpoziciji znaci ukupna kolicina informacija
moze lako preci polaznu kolicinu, pitanje je samo da li se moze to
iskoristiti kako bi se zapisalo na neki nacin (nekom kompresijom)
na manje prostora.

Takodje, ako imash vremena, mozes pruziti i neku ideju
o recimo prostoru za zapis broja n gde je n razlika izmedju
sortiranog niza i pocetnog niza u smislu permutacija, odnosno
koliko puta treba permutovati da bi se od pocetnog niza doshlo
do sortiranog.

Za koje slucajeve bi to bilo isplativo u smislu prostora zapisa tog
broja (odnos shirine ulaznog niza u odnosu na duzinu i sl).
 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
195.222.97.*



+2790 Profil

icon Re: Sort kompresija podataka27.10.2008. u 18:17 - pre 188 meseci
Ako u nizu nema ponavljanja, već sam dao postupak za nalaženje najkraćeg mogućeg niza transpozicija kojim se niz sortira. Najgori slučaj je kada imaš jedan ciklus dužine n i onda ti treba n-1 transpozicija. No, bolje je pamtiti cikluse, nego transpozicije.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
212.200.249.*



+1 Profil

icon Re: Sort kompresija podataka28.10.2008. u 13:29 - pre 188 meseci
Inverzija za bubble sort nije nesto problematicna.

Ako se ne varam, otprilike bi ovo trebalo da bude:
(radim napamet)

Code:


int n; //sadrzi broj bajtova

unsigned char buffer[]; //sadrzi sortirani niz
int bit_stream[]; //sadrzi izlaz i bubble sort-a

int count; //broj bitova u bit stream-u

while(count>=0){
  for(int i=n-1;i>=0;i++){
    if(bit_stream[count--]==1)
      swap(buffer[i],buffer[i+1]);
  }
}


No kako smo rekli, bubble sort zapravo proizvodi daleko veci output i pitanje
je kakva svojstva ima taj output i da li se moze postici neka usteda njegovim
komprimovanjem i kolika.

U daljem razmatranju, hteo bih da se osvrnemo na radix sort, on mi se cini kao
pogodan, ukoliko kodiramo na slican nacin kao kod bubble sorta, postoji mogucnost
da cemo moci da zapishemo izlaz sa tacno onoliko bajtova koliko ima na ulazu.

Za svaki tezinski bit, imacemo onoliko bitova koliko ima bajtova ulaza, a posto
imamo ukupno 8 tezinskih bita, matematika je jasna.

Jedino ostaje da se vidi, da li je moguce na osnovu te informacije rekonstruisati
ulaz. Ono sto me zabrinjava jeste da kod radix sorta imamo subdiviziju na nekim granicnim
vrednostima pri prelasku na bit manje tezine, da li ce ova informacija ostati u sortiranom skupu?

Mislim da hoce, no trebalo bi proveriti nekim razmisljanjem.

Na dalje mi se cini da bi radix sort poremetio redudanciju koja se pojavljuje od istih uzastopnih
sekvecni u ulaznom nizu, ali i ovo zahteva potvrdu.

Upravo sad razmisljam, i mislim da ipak za radix sort nece biti potrebno ukljuciti informaciju
o granicama subdivizije pri prelasku na bit manje vaznosti. Ta informacija je prisutna u samom
sortiranom nizu.

Sledeci korak bi bio implementacija odgovarajucih radix i invers_radix algoritama.
Cim nadjem vremena, okacicu neki pseudo kod.


 
Odgovor na temu

Nedeljko
Nedeljko Stefanović

Član broj: 314
Poruke: 8632
*.dynamic.sbb.rs.



+2790 Profil

icon Re: Sort kompresija podataka28.10.2008. u 13:55 - pre 188 meseci
Algoritmi za sortiranje vam nisu podesni, jer su pravljeni da za sto krace vreme sortiraju niz (broj svih operacija, poredjenja + transpozicije, da bude sto manji). Umesto toga vam treba algoritam koji ce mozda i vise da se oznoji (da napravi veci broj poredjenja), ali da da manji broj transpozicija. Ja sam vam dao algoritam koji vam daje najvise n-1 transpozicija, dok ce vam algoritmi za sortiranje dati po n log n ili vise. Treba li da implementiram sve ovo? Fabula radnje je da autor ideje treba da formulise uslove koji niz treba da zadovolji da bi prednosti ovog algoritma dosle do izrazaja. Tek onda ima smisla raditi nesto dalje.
Nije bitno koji su zaključci izvučeni, već kako se do njih došlo.
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
212.200.249.*



+1 Profil

icon Re: Sort kompresija podataka28.10.2008. u 14:21 - pre 188 meseci
Da li da implementirash? Pa ako si voljan da se pozabavish tematikom i imash vremena, sto da ne ...

Hajde da onda ponovim, sta sam pod ovim thread-om zamislio, cisto da ne bude zabune.

Pre izvesnog vremena sam doshao na tu ideju da bi mozda sortiranje ulaznog niza proizvelo
zapis interne strukture i odnosa medju elementima ulaznog niza koji bi mozda bili pogodniji
za kompresiju u odnosu na standardne metode kompresije (koji i inace koriste elemente interne
strukture i uredjenosti).

Nadalje, pokrenuo sam ovaj thread kako bi svi zainteresovani mogli da ucestvuju u diskusiji na
ovu temu, iznesu svoje ideje i eventualne zakljucke.

Prva faza rada na ovome je ispitivanje i ponasanje sort algoritama, u smislu izlaza koji proizvode
kao i diskusija koji bi uopste sort algoritmi bili pogodni za dalje razmatranje.

Nakon sto se odaberu kandidati i prodiskutuje kako bi se uopste kreirao njihov izlaz i formulacija
inverznog algoritma, da se na osnovu sortiranog niza dobije pocetni, predlozio bih analizu
strukture izlaza u odnosu na strukturu samog ulaznog niza. Pod ovim se podrazumeva da se
proveri da li i na koji nacin izlaz zadrzava neku korelaciju sa frekvencijama elemenata u ulaznom nizu.
Da li se sekvence koje se pojavljuju u ulaznom nizu preslikavaju u neke odgovarajuce sekvence u izlaznom
nizu. Da li se isplati uvecanje u kolicini informacija ako ce se postici bolja kompresija naknadno.

Treca faza je naravno da se ispita koji bi kompresioni algoritam pasovao kom sort algoritmu i njegovom
izlazu kao i kada je to isplativo raditi.

Nadam se da ce se naci neko zainteresovan da se zajedno samnom pozabavi ovom tematikom,
a ako i ne, bar da ce biti interesantno shtivo za procitati svima onima koji bi zeleli ovako necim
ili slicnim da se pozabave.

Vratimo se na konkretan algoritam koji si ti predlozio.
Mozemo i o njemu da prodiskutujemo u svetlu prve faze. Algoritam imamo u opisnoj formi (ako je
neko zainteresovan moze ga pretochiti u neki pseudo kod).

Prvi nacin da se zapishe izlaz iz tog algoritma su parovi word vrednosti koji predstavljaju
pojedinacne transpozicije elemenata.

Vrednost na indexu i zameniti sa vrednoscu na indexu j

Ovakav nacin zapisivanja dovodi do toga da imamo po 4 bajta za svaku transpoziciju ili
4*t, t<=n-1 (najvishe n-1 transpozicija).

Takodje se moze zapisati, kao sto si i predlozio u vidu lanaca, sto svakako umanjuje kolicinu
informacija potrebnu za zapis.

To bi se moglo izvesti na ovaj nacin:

Za svaki lanac zapisati:
duzinu lanca + 2 bajta po elementu lanca
ili ukupno
2 bajta * (duzina lanca +1)

(ovo sve naravno vazi za ulazni blok od 64K, za neke druge velicine ulaza, treba korigovati
i racunicu a spram neophodnog prostora za zapis recimo indexa, za 64K to je word)

Takodje bi trebalo, makar okvirno videti sta se desava sa redudancijom u ulaznom nizu,
i da li se gubi i na koji nacin u izlazu.
 
Odgovor na temu

vlaiv
Vladimir Vlaisavljevic
Novi Sad

Član broj: 15993
Poruke: 352
212.200.249.*



+1 Profil

icon Re: Sort kompresija podataka29.10.2008. u 15:31 - pre 188 meseci
Radix sort se ispostavio kao dosta velika glavolomka.

Evo nekog koda, za koji se nadam da bi se eventualno mogla naci inverzija.

Code:


unsigned char buffer[]; //ulazni bafer
int n; //duzina bafera (u ovim razmatranjima, 64K)

void radix(int lower_bound, int upper_bound, int bit_pos){
    if(bit_pos>=0){
        if(lower_bound<upper_bound){
            int i1 = lower_bound;
            int i2 = lower_bound+1;
            while(i2<=upper_bound){
                if(bit_lit(i2, bit_pos)<bit_lit(i1, bit_pos)){
                    swap(i1, i2);
                    output(1);    
                }else
                    output(0);
                if(bit_lit(i1,bit_pos))
                    i1+=1;
                i2+=1;
            }
            radix(lower_bound, i1-1, bit_pos-1);
            radix(i1, upper_bound, bit_pos-1);
        }
    }
}

/*

output - izlaz sortiranja
swap - zamena elemenata
bit_lit - provera datog bita npr.  (buffer[index]>>bit_pos)&1, vraca vrednosti iz (0,1)

*/


radix(0,n-1,7);



u ovo slucaju se dobija izlaz "po dubini" posto je u pitanju rekurzija, moze se implementirati
i bez rekurzije, pa bi u tom slucaju izlaz bio "po sirini" (mozda cak i bolje resenje).

Nisam siguran da li je na osnovu ovog izlaza moguce rekonstruisati ulazni niz.

U slucaju rekurzivnog sortiranja, broj izlaznih bita moze biti manji od 8*64K
U slucaju nerekurzivnog sortiranja, mislim da bi broj izlaznih bita bio tacno 8*64K

ono sto me muci u konkretnom slucaju je sledeci deo

Code:

...
            if(bit_lit(i2, bit_pos)<bit_lit(i1, bit_pos)){
                swap(i1, i2);
                output(1);    
            }else
                output(0);
            if(bit_lit(i1,bit_pos))
                i1+=1;
            i2+=1;
...


koji bi se za uspesnu rekonstrukciju ipak morao ovako odraditi (nisam siguran,
pricam napamet)

Code:

...
            if(bit_lit(i2, bit_pos)<bit_lit(i1, bit_pos)){
                swap(i1, i2);
                output(1);
                i1+=1;
                i2+=1;
            }else{
                if(bit_lit(i1,bit_pos)){
                    i1+=1;
                    output(0);
                }else
                    output(2);
                i2+=1;
            }
...


Sto automatski prosiruje prostor izlaza na 3 vrednosti, a samim tim
i povecava znatno kolicinu informacija koje algoritam proizvodi.
 
Odgovor na temu

[es] :: Art of Programming :: Sort kompresija podataka

[ Pregleda: 2611 | Odgovora: 15 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.