Datakompression fö 7 p.1 Burrows-Wheelers transform Transformen själv ger ingen kompression, men gör det lättare att koda signalen med en enkel kodare. Antag att vi vill koda en sekvens av längd n. Skapa alla cykliska skift av denna sekvens och sortera dem lexikografiskt. Skicka den sista symbolen i varje rad som en sekvens L och positionen för originalsekvensen i den sorterade listan.
Datakompression fö 7 p.2 Exempel Antag att vi vill koda sekvensen abacabb. Vi bildar all cykliska skift och sorterar dem: Cykliska skift Sorterade cykliska skift abacabb babacab bbabaca abbabac cabbaba acabbab bacabba abacabb abbabac acabbab babacab bacabba bbabaca cabbaba Originalsekvensen återfinns på rad 1. Den information som skickas är alltså positionen 1 och sekvensen bcbbaaa.
Datakompression fö 7 p.3 Egenskaper Betrakta matrisen med sorterade sekvenser, A, och den matris, A s man får om man skiftar alla sekvenser cykliskt ett steg åt höger, så att den sista symbolen hamnar först A abacabb abbabac acabbab babacab bacabba bbabaca cabbaba A s babacab cabbaba bacabba bbabaca abacabb abbabac acabbab Alla sekvenser i A som börjar med en viss bokstav står i samma inbördes ordning som de gör i A s. Ekvivalent, om man betraktar alla sekvenser i A som börjar med samma bokstav, så står suffixen i samma inbördes ordning som prefixen i de sekvenser som slutar med denna bokstav.
Datakompression fö 7 p.4 Avkodning BWT Dessa egenskaper, som kommer av att de är cykliska skift vi sorterat, gör att vi kan avkoda transformen, trots att vi inte har tillgång till hela A. Den sekvens vi mottagit, L, är den sista kolumnen i A. Genom att sortera L får vi den första kolumnen, F,iA. Bokstaven på position k i F är den som kommer efter (cirkulärt) bokstaven på position k i L.
Datakompression fö 7 p.5 Avkodning BWT, forts. Om vi för vårt exempel skriver L och F bredvid varandra får vi L b c b b a a a F a a a b b b c Efter b nummer 1 kommer a nummer 1, efter c kommer a nummer 2, efter b nummer 2 kommer a nummer 3, efter b nummer 3 kommer b nummer 1, efter a nummer 1 kommer b nummer 2, efter a nummer 2 kommer b nummer 3 och efter a nummer 3 kommer c.
Datakompression fö 7 p.6 Avkodning BWT, forts. Givet den mottagna sekvensen L och den sorterade första kolumnen F kan vi alltså skapa en vektor T som hjälper oss ordna symbolerna i L irätt ordning. T [i] pekar ut det index i L där symbolen som kommer efter L[i] ligger. Det vill säga, i den avkodade sekvensen följs L[i] av L[T [i]] som i sin tur följs av L[T [T [i]]], o.s.v. Det kodade indexet I bestämmer var sekvensen börjar. I vårt exempel får vi alltså T = [5 6 7 1 3 4 2]. På position 1 i L står b nummer 1 som följs av a nummer 1 som återfinns på position 5 i L. På position 2 i L står c som följs av a nummer 2 som återfinns på position 6 i L, o.s.v.
Datakompression fö 7 p.7 Avkodning BWT, forts. En algoritm för avkodning kan alltså beskrivas med pseudokod enligt följande, där vi skapat vektorn T från L och F : k = T [I] D[1] = L[k] for j =2to n { k = T [k] D[j] =L[k] } Den avkodade sekvensen ligger nu i D.
Datakompression fö 7 p.8 Alternativ avkodning BWT Man kan även göra avkodningen baklänges, om man låter T [i] peka ut positionen i L för den symbol som kommer före L[i]. Det är ekvivalent med att säga att T [i] är den position i F där L[i] ligger. I vårt exempel blir T = [4 7 5 6 1 2 3]. Avkodningsalgoritmen blir: k = I D[n] =L[k] for j = n 1 downto 1 { k = T [k] D[j] =L[k] }
Datakompression fö 7 p.9 Komprimering Vi har fortfarande inte gjort någon komprimering, snarare tvärtom, eftersom vi förutom sekvensen även måste skicka en position. L kommer att vara partiellt sorterad, vilket kan utnyttjas vid komprimering. Ett sätt är att använda move-to-front coding (mtf). Börja med att lista symbolerna i någon ordning. För varje symbol som ska kodas skickar vi index till den symbolen, sedan lägger vi den symbolen först i listan. Detta kommer (under förutsättning att vi indexerar listan från 0) att ge oss långa skurar med nollor, och små värden kommer att bli väldigt vanliga. Vi har fortfarande inte gjort någon komprimering, men den nya sekvensen av index kommer att ha en väldigt skev fördelning mot låga värden, vilket kan utnyttjas enkelt av t.ex. en huffmankodare. Det är även ganska vanligt att man skurlängdskodar nollorna.
Datakompression fö 7 p.10 Exempel Originaltext (mellanslag och radbrytning utbytt mot _): Vi_CARL,_med_Guds_nåde,_Sveriges,_Götes_och_Vendes_Konung _&c._&c._&c.,_arvinge_till_norge,_hertig_till_schleswig_holstein, _Stormarn_och_Ditmarsen,_greve_till_Oldenburg_och_Delmenhorst_&c._ &c.,_göre_veterligt:_att,_sedan_riksens_ständer_enhälligt_antagit_och_ fastställt_den_successionsordning,_varefter_den_högborne_furstes,_ Svea_rikes_utkorade_kronprins,_hans_kungl._höghet_prins_JOHAN_ BAPTIST_JULII_manliga_bröstarvingar_skola_äga_rätt_till_den_ svenska_tronen,_samt_sveriges_rikes_styrelse_tillträda,_och_denna_ grundlag_till_vårt_nådiga_gillande_blivit_överlämnad,_have_vi,_i_ kraft_av_den_enligt_85_ _i_regeringsformen_oss_tillkommande_ rättighet,_velat_denna_av_riksens_ständer_samtyckta_ successionsordning_härmed_antaga,_gilla_och_bekräfta,_alldeles_ såsom_den_ord_för_ord_härefter_följer:
Datakompression fö 7 p.11 Exempel L (sista bokstaven i de sorterade cykliska skiften): snsea.an.sdeilantgtcccccl8_rthbc O_LTI RUA_ J AA I PSJ :_...tgtnihhd,gstsllnnvl,ss thel,dt,: atheavrmtlthrnherd,a,a dgn., iesi,stgnsa,tnrtisaae,r,rsnanseeggtseas e5attgdnggnlegtklnrrltt_ssdlmmh gvmmt_fl h g_n&&&&&uucc oooooosyaeerräeånanl l nnnånrrudgvdnddgvsrvmmsrrrtbvd DrsnmddddddVm ddssvjtdtdvvgtvhgtdtgklkcclhhvr_saäee nninriaaiiänörneiiiö an niii_cccccc ggcnn VV wtldrrtlllrrrrtttttggttennvvrrrssgvdllsiislt eiic_gllllllodlel Oehnrnlböliiiiiiiaäiäieeollrom_rt_rrloäaaieeeaeereeennmeaa ääeuroiuiiiuieeddaeeeoiieeaeooaao khskrriikk ss Ntfbhn_eeeeöeaokooooöaä_yguoee eppeeoäoaotkaouåegaatk beennennndeeeese l_rkkgssn_ånnoeerölra_t e_tegsgmg flarietifknnssffesört uis_lsaäämssssssgrnkbf_aa_aes_ sssö_rristt_rr_htltthhrrnnvshhffgrg_
Datakompression fö 7 p.12 Exempel Betrakta till exempel (början av) sekvenserna som slutar på c:.,_arvinge_till_norg.,_göre_veterligt:_a._&c.,_arvinge_till_._&c.,_göre_veterlig._&c._&c.,_arvinge_t cessionsordning,_var cessionsordning_härm essionsordning,_vare essionsordning_härme h_delmenhorst_&c._&c h_ditmarsen,_greve_t h_vendes_konung_&c._ h_bekräfta,_alldeles h_denna_grundlag_til h_fastställt_den_suc hleswig_holstein,_st kta_successionsordni
Datakompression fö 7 p.13 Exempel Sekvens efter mtf-kodning: 95 0 0 0 0 115 111 1 103 100 51 1 4 2 4 103 5 107 83 7 7 116 107 1 106 000011168131165858081500000911139688300959786 3911020105100000095975308312700162119625110 02874630181260280118264010119315410521531377 3929114610174122831111101110002147174167179 16235213993115541229660976114751250808335 270385450613820115735115451102402212094180 1850101940841147200710711175000011903801170 00002912220200190228222911511513000011020041 7 0 12 20 15 20 2 5 1 0 3 3 21 6 2 21 0 3 3 0 0 21 119 5 7 103 5 6 9 8 5 0 000011021303050812011411301232243341226171 2402607141111192121040017029172601064246527 5004707520140021200000100140240300019010 124 17 16 18 13 0 3 3 0 0 2 0 42 0 3 0 0 0 0 10 0 1 0 14 10 0 17 0 6 0 0 1706322904150129130105015396000002814271442 21 15 15 1 5...
Datakompression fö 7 p.14 Exempel 120 250 100 200 80 150 60 100 40 20 50 0 0 50 100 150 200 250 Histogram före mtf 0 50 0 50 100 150 200 250 Histogram efter mtf I exemplet har vi bara en sekvens av längd av 790. Ju längre sekvenser man kodar, desto bättre kompression kan man få.
Datakompression fö 7 p.15 Komprimering av bibeln.txt pack 4.51 bitar/symbol. compress -b 9 5.56 compress -b 12 3.65 compress -b 16 2.96 gzip -1 3.13 gzip -5 2.63 gzip -9 2.55 bzip2-1 2.14 bzip2-5 1.90 bzip2-9 1.84 pack är en minnesfri statisk huffmankodare. compress använder LZW, ordboksstorlek 2 b. gzip använder deflate, parametern bestämmer hur länge man söker. bzip2 använder BWT + mtf + huffmankodning, blockstorlek n 100000.