Jooksupikkuskodeerimine (RLE)
Sisesta suvaline tekst ja vaata, kuidas see jaguneb kordusjadadeks — sama tähemärgi järjestikused kordused sulanduvad üheks (sümbol, arv) paariks. Pikad kordusjadad kahandavad andmeid; lühikesed kordusjadad kasvatavad neid.
miks tasakaalupunkt on täpselt 2 🖖
Iga kordusjada — sõltumata pikkusest — maksab salvestamisel sama palju: 2 ühikut, üks sümboli, üks arvu jaoks. Pikkusega L kordusjada tasub kodeerida ainult siis, kui see maksab vähem kui L toormärgi väljakirjutamine — see tähendab, kui L on suurem kui 2. Kogu sisendi peale keskmistatuna muutub see tingimuseks L̄ = N/R suurem kui 2, kus N on kogupikkus ja R kordusjadade arv — täpselt see joon, mida ülaltoodud valem kontrollib. Seepärast on RLE ka nõrk üldotstarbeline kompressor: inglise tekstis, lähtekoodis ja juhuslikes andmetes on kordusjadad harva pikemad kui 2, mistõttu RLE on jäetud andmetele, mis on tahtlikult loodud pikkade kordusjadadega — 1-bitised faksiskaneeringud, hõredad bittkaardid ja paletiga pildid ühevärviliste aladega. Päris formaadid viivad idee kaugemale: PNG rakendab enne tihendamist igal skaneerimisreal Paeth/Sub/Up deltafiltrit, muutes esmalt sujuvad üleminekud pikkadeks peaaegu-nulliliste erinevuste kordusjadadeks — RLE (DEFLATE'i kaudu) teeb ülejäänu. Proovi ülaltoodud halvima juhu näidet: kuusteist erinevat tähemärki annavad kuusteist pikkusega 1 kordusjada, seega vajab kodeerimine 16 tähemärgi salvestamiseks 32 ühikut — sisend kahekordistub.
pakkimine, mille leiutaksid ise 🖖
Jadapikkuskodeerimine (RLE) on ainus pakkimisidee, mille võiksid ise välja mõelda: selle asemel et kirjutada WWWWWWW täht-tähelt välja, ütled lihtsalt "7 W" — sama otsetee, mida inimesed kasutavad, öeldes telefoninumbris "kolm seitset". See läbib andmed ühe vasakult paremale käiguga ega mäleta midagi peale parasjagu loendatava jada, mistõttu on see kiire ja hõlpsasti voogedastatav. Ja see on kadudeta: paaridest (sümbol, arv) saad algandmed täpselt taastada — erinevalt JPEG-ist või MP3-st, mis loobuvad detailidest jäädavalt.
RLE sugulane, mis ei paisu 🖖
Naiivne RLE võib pakkimatuid andmeid kahekordistada, kuid Apple'i variant PackBits — sündinud 1980ndate MacPaintis ja tänini TIFF-i standardne pakkimisrežiim — on ehitatud nii, et see peaaegu kunagi ei kasva. Iga plokk algab ühe märgiga juhtbaidiga: mittenegatiivne väärtus tähendab "järgnevad baidid on sõnasõnalised", negatiivne "korda järgnevat baiti". Unikaalsed andmed kopeeritakse muutmata kujul kuni 128-baidistes plokkides, nii et halvimal juhul lisandub vaid üks juhtbait 128 kohta — alla 1% lisakulu, mitte 100%, milleni naiivne RLE võib küündida.
Näiteülesanded
- Klassikalised kordusjadad - "AAAAAABBBCCDDDDD" → (A,6)(B,3)(C,2)(D,5) — 16 tähemärki muutub 8 paariks
- Halvim juht - "ABCDEFGHIJKLMNOP" — kõik tähemärgid unikaalsed, iga paar on originaalist pikem
- Bittkaardi mask - "0010111100001111" — pikslirida, mis näitab, miks PNG rakendab enne RLE-d eelfiltrit
- Pildi skaneerimisrida - "WWWWWWWBBBBBWWWW" — lihtne must-valge pildirida, tugev korduste struktuur