» »

Compress

Compress

Fave ::

Razmišljam, kako najučinkoviteje kompresirati neko dato. Ideja je sledeča:

- datoteka se prebere in se za vse enake znake napravi sekvenca mest, ki jih zasedajo

Primer:

Znanost in tehnologija ...

z 1
n 2,4,10,15
a 3,22
o 5
....

- poišče se funkcijo(algoritem) za vsako sekvenco (to kar znata Eureqa ali Critticall)

- zapiše se komprimirana datoteka

Primer:

z 1
n 1.1917622+1.0221367*y*y-1.5289234*sin(0.8993634-1.0661639*y*y)-0.47005865*y 4
a 3,22
o 5
...

4 na koncu druge vrstice pove do kam naj šteje f(x) - za x = 1 to 4

Funkcija se zgenerira tako natančno, da z zaokroževanjem prideš do željenih rezultatov.
Če je funkcija daljša od sekvence, zapiši sekvenco.
Če funkcije ni mogoče najti, zapiši tako, ki pokrije največ vrednosti, nepokrite pa z novo funkcijo oz. sekvenco, če je ta krajša, ki je ločena s presledkom, itd...

Potem se pa novonastala kompresirana datoteka še zazipa :D

Ker nimam pojma kako delujejo drugi kompresi, prosim za mnenja?
My mind's a hyper tool that fixes everything.

technolog ::

Tole kar si pogruntal je po domače crap oz. ne bo delovalo. Preveč je pomanjkljivosti.

1.
n 2,4,10,15

Bolj efektivno je petkrat zapisat n. Sploh pa kakršne koli funkcije zavzamejo še več.

2. Nimaš nobenih separatorjev, ne veš kje se funkcija konča in začne nova črka. Prav tako bi bla glede tega mal kriza, če bi moral stiskat tud številke, potem bi pa res vse pomešal.

Če hočeš dobit neko osnovno predstavo, kako poteka kompresija si poglej hufmanov algoritem oz. kodiranje.

Fave ::

Ja, tule se jasno bolj splača zapisat, samo če pa imaš par mega enakih znakov razsutih po datoteki, se pa imho ne.

Sam format je prikazan principelno, končen zapis bi bil seveda drugačen.

Ne vem zakaj nebi delovalo?
My mind's a hyper tool that fixes everything.

technolog ::

Ne! Tud če maš par 1000 znakov, morš imet potem polinom 1000 stopnje, pa vsak člen more imet eno grozno decimalno število spredaj. Pa več različnih vrednosti kot imaš, bolj natančna števila moraš imet pred členi.

Vem da maš format idejno, samo opozarjam te, da ti bodo separatorji pobral še dodatne bajte, potem se pa sploh ne bo splačalo.

Fave ::

Eh, ne. Ni nujno, da je zapisan s polinomi. Si kdaj videl kakšne funkcije izpljune Eureqa?

Separatorji ne bodo pobrali nič več, kot je zgoraj napisano. V bistvu bi bili separatorji in markerji (ki bi povedali ali je funkcija ali sekvenca ali število do kam šteje) v enem.
My mind's a hyper tool that fixes everything.

technolog ::

no pa mi zapiši potem recimo zaporedje 1, 10, 58, 83, 100, 101, 102, 110, 200, 210 z manj kot 10 bajti, če trdiš, da so funkcije taka čarovnija.

Zgodovina sprememb…

Fave ::

Ne trdim, da so čarovnija. Nekatere sekvence se lahko zapišejo zelo enostavno, nekatere pa ne.

Razmišljam pa to, da bi imel na internetu look up tabelo vseh možnih sekvenc do recimo 10^12. Vsaka bi bila oštevilčena. Zapis bi bil enak zgornjemu, le namesto funkcije bi bila zaporedna številka sekvence v look up tabeli. Ker drugače bi zadeva predolgo trajala.
My mind's a hyper tool that fixes everything.

overlord_tm ::

Razmišljam pa to, da bi imel na internetu look up tabelo vseh možnih sekvenc do recimo 10^12

Good luck with that ;)

Glede kompresije, Shannon je cudezna beseda, google it :)

Thomas ::

Sekvenca sama, njena formula, ni zastonj, gledano z vidika števila potrebnih bitov. Včasih sicer je, precej ceneje, kakor pa direktni zapis, v splošnem pa ne.

Vprašanje je, kaj je s človeku uporabnimi datami. Te morda celo imajo (večkrat) skrite vzorce, ki nam omogočajo, da jih zapišemo na učinkovit način.

Se ne ve. Treba bi bilo probat bruta forca, šele potem bi zares vedeli.
Man muss immer generalisieren - Carl Jacobi

technolog ::

Fave je izjavil:

Ne trdim, da so čarovnija. Nekatere sekvence se lahko zapišejo zelo enostavno, nekatere pa ne.

Razmišljam pa to, da bi imel na internetu look up tabelo vseh možnih sekvenc do recimo 10^12. Vsaka bi bila oštevilčena. Zapis bi bil enak zgornjemu, le namesto funkcije bi bila zaporedna številka sekvence v look up tabeli. Ker drugače bi zadeva predolgo trajala.


Ne razmišljaš v redu.

Vseh možnih celoštevilkih sekvenc do 10^12 pa je 2^(10^12)-1. In zapis enega tega IDja zaporedja bi te koštal po par giga.

Sekvenca sama, njena formula, ni zastonj, gledano z vidika števila potrebnih bitov. Včasih sicer je, precej ceneje, kakor pa direktni zapis, v splošnem pa ne.


Oz. kar reciva da je zelo redko krajša, ponavadi pa kar konkretno daljša.

WarpedGone ::

fave, proof is in the puding.
Poskusi sprogramirat prototipni kompres in v praksi preveri svojo idejo.

Men se v glavi že dolgo kuha kompresija z implicitnim privzetkom - pri kompresiji se del informacije sploh ne zapiše v datoteko ampak je ta privzeto znana uporabniku kompresirane datoteke. Poleg kompresije je hkrati to tudi tako švoh/crap šifriranje.

Recimo, da svojo datoteko poiščeš v nekem diskretnem zaporedju cifer 0..9 al pa števil 0..254, ki so rezultat neke funkcije. Za katero funkcijo točno gre, v sam kompres ne vpišeš ampak vpišeš samo začetno mesto Z in dolžino datoteke D. Detajli funkcije so tuki tisti implicitni privzetek.

Varianta je tut, da maš na razpolago N vnaprej določenih različnih funkcij, ki generirajo zaporedja ki so "pogosteje vsebujejo" določene tipe datotek. Tuki poleg Z in D v kompres vpišeš še id te v naprej določene funkcije.

Je pa res, da si ne predstavljam še praktičnega algoritma kompresije na ta način. Obstoječe zaporedne mašine so v principu neprimerne za takšno opravilo.
Zbogom in hvala za vse ribe

Fave ::

technolog je izjavil:

Ne razmišljaš v redu.

Vseh možnih celoštevilkih sekvenc do 10^12 pa je 2^(10^12)-1. In zapis enega tega IDja zaporedja bi te koštal po par giga.


Saj bi ID lahko zapisal v 256-tiškem sistemu.
My mind's a hyper tool that fixes everything.

WarpedGone ::

Katerega morš na koncu pretvorit v binarnega.
Zbogom in hvala za vse ribe

Fave ::

122 - dec (3 bajti)
7A - hex (2 bajta)
z - 256iško (1 bajt)

Kje razmišljam narobe?
My mind's a hyper tool that fixes everything.

WarpedGone ::

Razmišljaš prav a ne dovolj daleč.
122 v decimalnem zapisu zahteva tri bajte, ker imaš na vsakem mestu 256 možnih različnih znakov, "tebi uporabnih" je pa samo 10.
7A v hex obliki pokuri le dva bajta še, ker izmer 256 možnih na vsakem mestu ponucaš 16 različnih.
z ponuca samo en bajt ker "izkoristiš" vseh 256 možnih.

Ko razmišljaš o kompresiji moraš razmišljat v svoji temeljni abecedi, ki pa je binarna. 256-iški sistem zahteva 256 različnih simobolov. Teh v obstoječih mašinah nimaš, imaš le dva.
Zbogom in hvala za vse ribe

technolog ::

No, naj si avtor osnove razpuca, potem pa razmišlja o kakih kompresijah.

lymph ::

Kaj pa če vzamemo neko številko, ki ima neponavljujoče cifre.. recimo PI.

Vsakič, preden kompresiramo fajl, zaženemo kalkulator PI in zgeneriramo file velik 100GB ter pretvorimo v 0 in 1ke. Po tem pa vzamemo recimo prvih 10 cifer iz fajla, ki ga kompresiramo: pr: 0100010101 in poiščemo kje se ta sekvenca nahaja v našem PIju. Nato pa namesto zaporedja zapišemo koordinato te sekvence.

Zdej edino ne vem, kako velik bi mogel biti naš PI file, da bi lahko poiskali dovolj velike kose, da bi se taka kompresija splačala... dolžina koordinate VS iskanega zaporedja.

Pač osnova bi bila, pa to je moja blodnja - ne vem če to tudi stoji, da je v PIju ŽE skrito vsako zaporedje... samo koordinate le tega rabimo.
"Belief is immune to counter example."

technolog ::

Ne bo šlo skozi..

Uštel si se na točki, ker bo lokacija (po tvoje "koordinate") sekvence skoraj vedno zasedla več bajtov kot zaporedje samo.

Jaz sem pred kratkim dobil idejo za kompresijo, ko imaš predefiniran seznam vseh slovenskih besed, pa potem zapisuješ samo zaporedne številke besed... To pa bi šlo! Pomankljivost pa je ta, da bi bilo treba izumit še nek escape sequence za kratice in ostale besede, ki jih ni na seznamu.

Zgodovina sprememb…

Thomas ::

Kar se tiče kompresa s PI, distanca do tapravega stringa, zapisana binarno, je približno enako dolga kot tisti string. "1010101010" mora biti kakšnih 1024 bitov daleč. Neka random sekvenca se ne sme kaj bistveno podaljšati v tem načinu zapisovanja, ali pa Pi ni normalno število.
Man muss immer generalisieren - Carl Jacobi

technolog ::

Tomas, plus še to, da moraš poleg odmika povedat še dolžino.

Thomas ::

Kar se tiče kompresiranja s sekvencami, velja isto. Preveč podaljšati nekega random binarnega stringa, z zanj optimalno sekvenco ali funkcijo, ne bi smel. Katere bi pa bistveno skrajšal in koliko bi jih skrajšal, je pa everybody's guess.

moraš poleg odmika povedat še dolžino.


Right. Ampak dolžina je majhna napram temu. Dvojiški logaritem. Dvajset bitov za megabit velik string. Mogoče 40, če upoštevaš vso režijo.
Man muss immer generalisieren - Carl Jacobi

Thomas ::



Tole je lep primer, kaj ti naredi vsega nekaj byteov. Nista to dva realna obraza, ampak zgubno skompresirana. Kljub zgubi večine informacije, je ostane dovolj.

Implicitna informacija pri prepoznavanju človeških obrazov, je pri ljudeh odločilna.
Man muss immer generalisieren - Carl Jacobi

Zgodovina sprememb…

  • zavarovalo slike: gzibret ()

boogie_xlr ::

Prvo pa zadnjo črko v besedi ohranimo, vmesne črke pa uredimo in damo v dictionary. To bi lahko bil primer lossy kompresiranega a še vedno berljivega teksta, kot je to dokazal nek profesor na Cambriški univerzi.

WarpedGone ::

Huffman vseeno zmaga, grem stavit :)
Zbogom in hvala za vse ribe

Rokm ::

Bolj kot Huffmanov kod se teoretični meji približa Aritmetični kod.

Fave ::

technolog je izjavil:

Vseh možnih celoštevilkih sekvenc do 10^12 pa je 2^(10^12)-1. In zapis enega tega IDja zaporedja bi te koštal po par giga.


Saj bi lahko ID zaporedja zapisal kot (2^n)+x ali nekaj podobnega, pač kar se najbolj splača.
My mind's a hyper tool that fixes everything.

WarpedGone ::

Vsak zapis se izvede z neko abecedo. Zapis (2^n)+x predstavlja ID zaporedja v ASCII abecedi. Ker lahko v tej abecedi zapišeš tudi "neveljvane" IDje, ki ne generirajo veljavnega zaporedja imaš v abecedi nekaj redundance, kar pomeni da tako zapisan ID pobere več bitov, kot bi blo treba.

Še enkrat osnovni nasvet: poskusi sprogramirat nek kompresor in nato naštudiraj zakaj je rezultat takšen kot bo, glej velikost izhodne datoteke v bajtih. Tako boš skapiral osnovne probleme, tkole na suho preveč stvari narobe razumeš.
Zbogom in hvala za vse ribe

Fave ::

Pravijo, da življenje podaljšuje to, da se vsaj enkrat na dan osmešiš....jaz sem si ga v preteklih dneh kar lepo podaljšal ;((
My mind's a hyper tool that fixes everything.

WarpedGone ::

Ne sekiraj se, še vedno krepko zaostajaš za mano ;)
Zbogom in hvala za vse ribe

Thomas ::

Ali pa za mano. Keep going in razmišljaj na svoj način naprej, Fave!
Man muss immer generalisieren - Carl Jacobi

nevone ::

Tako je!

Saj veš tisto: En "neumen" lahko več vpraša kot 10 pametnih odgovori.

(Ali pa tisto: En pameten lahko več odgovori kot 10 "neumnih" vpraša.)

o+ nevone
Either we will eat the Space or Space will eat us.

Fave ::

Hehe...ste same face tle gor ;)
My mind's a hyper tool that fixes everything.

technolog ::

Nevone, to je pa eno hudo protislovje :D

nevone ::

Hehe ... ni ... ker gre v vsakem primeru za različne osebe ... hehe :D

o+ nevone
Either we will eat the Space or Space will eat us.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Pomoč pri programiranju z javo

Oddelek: Programiranje
203341 (2268) milc
»

Množica celih števil (strani: 1 2 )

Oddelek: Znanost in tehnologija
725963 (3070) Thomas
»

[Naloga] : Max kompresija testne datoteke

Oddelek: Programiranje
342947 (1871) StratOS
»

Kompres proti virusu HIV (strani: 1 2 )

Oddelek: Novice / Znanost in tehnologija
858012 (6706) Thomas
»

popolno naklucje (strani: 1 2 )

Oddelek: Znanost in tehnologija
696662 (5007) Thomas

Več podobnih tem