Lz77 / Lempel-Ziv Algorithm
-
Upload
veysi-ertekin -
Category
Data & Analytics
-
view
311 -
download
4
Transcript of Lz77 / Lempel-Ziv Algorithm
LZ77(Lempel-Ziv Algoritması)
@veysiertekin
TARİHÇE
* Abraham Lempel and Jacob Ziv tarafından 1977-78 yılları arasında yapılan çalışmanın ürünü olduğu için LZ77 adı verilmiştir. [1]
* Algoritmaya kod adının verilmesindeki neden birçok varyasyonu arasından ayırt etmek.
* Sınırsız veri akışının (yani verinin gerçek boyutu bilinmeden) daha az yer kaplayacak şekilde kodlanmasını sağlar.
* Kayıpsız bir sıkıştırma algoritmasıdır.
[1] J.Ziv and A.Lempel, “Compression of individual sequences by variable rate coding, “IEEE Trans. Information Theory, 1978.
Verinin ilk defa verimli şekilde aktarımının yolunu açması, günümüz internetinin yaygınlaşmasındaki ivmeyi beraberinde getirdi
• Günümüzde duyduğumuz/kullandığımız birçok sıkıştırma-kodlama algoritmasının temelinde yer almakta:
zip, bzip, gzip, WinRAR, LZMA,LZO, LZ4, JPEG, PNG, GIF …
1- LZ ile başlayanlar hemen hemen aynı algoritmayı farklı yöntemler kullanarak uyguluyorlar (ör: direk dönüşüm yerine binary hale çevirip algoritmayı uygulamak yada verinin işleniş sıralamalarında değişiklik yapmak gibi) 2- Diğer algoritmalar (zip, JPEG vs) bu algoritma üzerine Huffman kodlaması gibi ek yöntemlere başvuruyorlar
Algoritma Oran Sıkıştırma Açma
memcopy 1.000 4200 MB/s 4200 MB/s
LZ4* 2.101 385 MB/s 1850 MB/s
LZO 2.06 2.108 350 MB/s 510 MB/s
QuickLZ 1.5.1.b6 2.238 320 MB/s 380 MB/s
Snappy 1.1.0 2.091 250 MB/s 960 MB/s
LZF v3.6 2.073 175 MB/s 500 MB/s
zlib 1.2.8 -1 2.730 59 MB/s 250 MB/s
LZ4* HC 2.720 22 MB/s 1830 MB/s
zlib 1.2.8 -6 3.099 18 MB/s 270 MB/s
Kaynak: https://github.com/Cyan4973/lz4
Benchmark;
*LZ4 Yann Collet tarafından 2011 yılında tanıtıldı
Benchmark;
Yahoo’da Hadoop Cluster'larında kullanılan sıkıştırma algoritmalarının oranları
Algoritma (Pseudo Code)
begin görünümü gelen veri ile doldur while (görünüm boş olmadığı sürece) do begin görünümün başındaki veriden arama tamponundaki en uzun eşleşmeyi bul i := arama tamponunda bulunan kaydın indeksi j := eşleşme uzunluğu X := eşleşen veriden hemen sonraki veri çıktıyaAktar(i,j,X)
arama tamponunun başlangıç indeksini eşleşen veriden sonrasına taşı
endend
Örnek
Arama önbelleği Gelen veriSatır 121110 9 8 7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 8 9 … Çıktı1 a a b b c a b c b b (0,0,a)
2 a a b b c a b c b b c (1,1,b)
3 a a b b c a b c b b c a c (1,1,c)
4 a a b b c a b c b b c a c b c (4,2,c)
5 a a b b c a b c b b c a c b c c a ∅ (6,4,c)
6 a a b b c a b c b b c a c b c c a ∅ (4,2,c)
7 b c a b c b b c a c b c c a ∅ (5,1,null)