Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit
Stránky: 1
Ahoj,
zajímalo by mě, zda existuje nějaký efektivní algoritmus, který dokazatelně dobře bezztrátově komprimuje libovolná data. Mám však ale poněkud specifické požadavky na to, co považuji za dobrou kompresi.
Neformálně řečeno chci aby existovala nějaká konstanta K, tak aby zkomprimovaný soubor měl velikost maximálně K krát větší než tolik kolik obsahoval původní vstupní soubor skutečné informace. Teď ale ještě musím vysvětlit co to znamená "množství skutečné informace".
Opět to spíše řeknu neformálně miliarda náhodných bajtů z alternaivního rozložení s 50%ní pravděpodobností jednotlivých stran obsahuje informace celkem miliardu bajtů.
Když budou pravděpodobnosti jednotlivých stran jiné než 50% bude ve stejně dlouhém souboru informace méně. (Viz. pojem informační entropie http://cs.wikipedia.org/wiki/Entropie#I … D_entropie)
Zkomprimovat nuly a jedničky z alternativního rozložení je ale nuda, stejně tak komprese textu dle četnosti písmen, dvojic písmen či n-tic písmen.
To vše jsou jen nějaké konkrétní způsoby jak zkomprimovat některé často používané druhy dat. Věřím, že na takovýchto způsobech pro obvyklé typy dat jsou založeny všechny v praxi používané kompresní programy.
Já bych si přál ale znát efektivní algoritmus, který dokáže nejen počítat četnosti bitů nebo bajtů, ale který dokáže rozpoznat obecně JAKÉKOLI pravidelnosti ve vstupním souboru a v případě, že bude vstupní soubor dostatečně velký, tak aby program všech těchto vlastností dokázal využít.
Tady je neefektivní algortmus, který jsem vymyslel:
opakuj pro každý turingův stroj od jednodušších ke složitějším
spusť turingův stroj (s prázdným vstupem)
if (turingův stroj skončí a na pásku zapíše stejnou posloupnost jako ta kterou mám zkompresovat) then
return nějaká reprezentace turingova stroje
Tento algoritmus má všechny požadované vlastnosti kromě efektivity. Vím, že to nemám dobře zformalizované, ale je vidět, že tento algoritmus je komprimuje lépe a nebo alespoň stejně dobře jako všechny ostatní kompresní algoritmy (až na konstantu).
Existuje něco podobného efektivního? (Slovem efektivní nemyslím ani tak nějakou rychlost nebo asymptitickou složitost ale spíše se obávám, že tohle zavání vyčíslitelností, kterou neumím a že vůbec nebude existovat žádný algoritmus, pro turingův stroj nebo existující počítače.)
Je nějaký důvod proč by tímto způsobem ideální a zároveň efektivní komprese nemohla existovat? Kde mám hledat odpověď? Jaký to je vůbec obor? Nebo podle jakých klíčových slov hledat články?
Offline
↑ isaak:
Ahoj, jsi si jistý, že Tvůj algoritus zafunguje? Nevidím, proč by měla taková konstanta k existovat. Co když bude Turingův stroj o mnoho větší než řetězec, který nakonec vypíše?
Offline
Možná toto záleží na tom, jaká formalizace a jaké zakódování turingova stroje se zvolí. Když se ale budou používat turingovy stroje s jednou pomocnou páskou, tak si jsem jistý, že bude dokonce existovat aditivní konstanta k' tž zakódování turingova troje (včetně pomocné pásky) bude nejvýše o k' větší než posloupnost ke kompresi.
Potřebný turingův stroj bude mít takovýto program:
1. Pokud nejsi na konci přepiš znak z pomocné pásky na výstupní pásku
2. Opakuj
Takovýto turingův stroj zabírá konstantní velikost při libovolném zakódování. Projistotu zvolíme takové zakódování, aby z posloupnosti znaků, která stroj kóduje tak, aby bylo poznat, kde tento kód končí. Délku si označíme k'.
Díky tomu, že máme kódování, které umí rozlišit konec kódu turingova stroje můžeme turingův stroj spolu s obsahem pomocné pásky reprezentovat jen tak, že obsah pomocné pásky připojíme beze změny za kód turingova stroje.
Do pomocné pásky se umístí posloupnost ke kompresi. Jelikož stroj opisuje pomocnou pásku na výstup, tak je to stroj který chceme a navíc jeho délka je odpovídá délce posloupnosti ke kompresi + k'.
V případě, že budeme kódovat jen neprázdné posloupnosti tedy existuje i multiplikativní konstanta k, tak aby byla podmínka splněna.
Jinak si mě málem dostal právě na této prázdné posloupnosti. To bych jedině musel dodefinovat, že prázdný archiv znamená, že i vstupní soubor pro kompresi byl prázdný.
Jinak, ale pokud se mě ptáš, jestli na té podmínce trvám, tak odpověď je ne. Zajímají mě i slabší komprese s podobně zajímavými vlastnostmi.
Offline
↑ isaak:
Ještě je potřeba vyřešit problém a to jak co nejlépe zakódovat Turingův stroj - ale na to by se dal rekurentně použít tentýž postup. :-))
Nejsem si jist, zda budeš dosahovat vždy lepších výsledků než běžné komprimační algoritmy - pokud nebudeš mít vyřešeno zakódování Turingova stroje.
Offline
Nevím, proč by mělo mít zakódování turingova stroje nějakou roli? Navíc už není třeba kód turingova stroje nijak kompresovat. Jsem spokojený s kódováním pomocí všeho daného vedle sebe, odděleného nějakým oddělovačem. Případně překódované do nul a jedniček, když to má být pro počítač.
Hlavní kouzlo a krása této komprese, kterou hledám, je komprese věcí, které mají nějaký vnitřní systém.
Třeba:
3.14159
a další miliardy cifer by má ideální komprese měla dokázat zkomprimovat na minimum. Nejprve by poznala, že se jedná o číslo PI (tzn. vymyslela program pro libovolně přesnou aproximaci čísla PI) a pak jen uložila kolik cifer má být na výstupu.
Na tom multiplikativní konstantě říkající, jestli to bude 1kB nebo 1GB mi nezáleží. Jde o tu schopnost poznání systému a pravidelností v čemkoli.
Jinak číslo PI je zajímavé tím, že všechny jeho cifry se v limitě vyskytují stejně často a zdají se být náhodné. Proto si s tím běžné komprese moc neporadí.
Offline
↑ isaak:
Pokud Ti nejde o konstantu K, tak pak ano - ale myslel, jsem o to Ti právě jde - aby byla co nejmenší. Potom tedy mohu na výstup poslat vše co mám na vstupu a dosáhnu K=1. Rovněž si myslím, že lepší komprese než K=1 - v průměru za všechny možné řetězce na vstupu - stejně nedosáhnu, takže je to z tohoto poheldu optimální algoritmus. :-)
Offline
Neporozuměl jsi vůči čemu konstantu K měřím!!!
Cituji původní dotaz: 'existovala nějaká konstanta K, tak aby zkomprimovaný soubor měl velikost maximálně K krát větší než tolik kolik obsahoval původní vstupní soubor skutečné informace. Teď ale ještě musím vysvětlit co to znamená "množství skutečné informace".'
Množství skutečné informace může splívá s velikostí vstupního souboru, pouze pokud by vstupní soubor obsahoval náhodný bordel.
Ale například pokud bych si ukládal mnoho cifer z čísla PI, tak té skutečné informace je méně než kolik bajtů zabírá nezkomprimovaný zápis.
Konkrétně se dá vstupní posloupnost popsat dvěma fakty:
1. je to číslo PI a je ve formátu textového souboru uloženo v desítkové soustavě. (+ něco technického o tom, že číslice nula je v textovém souboru dnešních počítačů znak s asci kódem 48)
Toto zabírá velikost, která se vejde do další nezajímavé konstanty, třeba c.
2. kolik jeho cifer je třeba uložit
Pokud by bylo potřeba uložit n cifer. Tak tato informace zabírá O(log n) místa.
Tedy chci, aby zkomprimovaný soubor měl velikost maximálně K krát větší než c + log n.
Offline
↑ isaak1:
Nevím, jak chceš definovat množství skutečné informace. Uvedl jsi jen příklad s číslem pi. Co další čísla? , , ? To bys musel mít nějakou množinu známých výrazů, které pak zakóduješ tak, že jde o "číslice mezi n-tým a m-tým místem výrazu v". Ale ta množina výrazů musí být nějaká rozumná, asi nejlépe konečná.
Ve svém prvním příspěvku se odvoláváš na entropii, ale nejsem jist zda příklad s pi a entropie nejsou dvě odlišné věci. Dokonce bych řekl, že posloupnost číslic pi bude z hlediska entropie náhodná a tedy nekomprimovatelná. Tedy je nutné nejprve definovat to množství skutečné informace.
Ale je pravda, že pi půjde asi vygenerovat nějakým algoritmem, jehož zápis by mohl být i podstatně kratší než vlastní vygenerovaná posloupnost.
Offline
Stránky: 1