• Sonuç bulunamadı

LZ78 sıkıştırma algoritması üzerinde yapılmış sıkıştırılmış dizgi eşleme çalışmaları

4. SIKIŞTIRILMIŞ DİZGİ EŞLEME

4.1. Üzerinde Sıkıştırılmış Dizgi Eşleme Yapılan Algoritmalar

4.1.5. Kelime tabanlı bayt kodlamalar üzerinde yapılmış sıkıştırılmış dizgi eşleme çalışmaları

4.1.6.2. LZ78 sıkıştırma algoritması üzerinde yapılmış sıkıştırılmış dizgi eşleme çalışmaları

Navarro ve Raffinot 1999 yılında metnin blok sırası halinde olduğu durumlar için bir sıkıştırılmış dizgi eşleme algoritması geliştirmişlerdir. Bu blok yapısı da Lempel – Ziv sıkıştırma ailesinin karakteristik özelliğidir.

Geliştirdikleri algoritmayı önce LZ77 sıkıştırma algoritmasına uygulamışlardır. LZ78 sıkıştırma algoritmasına, algoritmanın uygulanması ile daha etkili sonuç veren bir algoritma olduğu ortaya çıkmıştır. Daha sonra LZ77 ile LZ78 sıkıştırma algoritmalarının birleşimi şeklinde davranan algoritma sunmuşlardır. Bu algoritma

LZ77 sıkıştırma algoritması gibi hızlı sıkıştırıp, LZ78 sıkıştırma algoritması gibi hızlı dizgi eşleme zamanına sahiptir.

Yaklaşımları basittir ve bit paralelliğine dayanmaktadır. Bit paralelliği bir makine kelimesinin (gelen olarak 32 veya 64 bit) işlemci tarafından bütün bitlerinin aynı zamanda işlenmesi esasına dayanmaktadır.

Dizgi eşleme tekniklerinin temel tanımı, metnin karakter yerine bloklar halinde verildiği zaman verilebilmektedir. Bloklar ya 1 karakterden ya da önceden var olan blokların birleşmesiyle oluşmaktadır. Blok blok metin işlenir. Her yeni B bloğu için, B’nin bir tanımı çıkarılır. Şekil 4.10 blokların önek ve sonek olma durumlarını göstermektedir.

( ) = ( , , , , )

= | |, B’nin karakter olarak uzunluğu

= ( ), B’nin işlendiği zamana kadar olan metin uzunluğu

= ( ), B’nin tam geçtiği ya da dizgi sonekinin B önekiyle uyuştuğu konum

= ( ), B’nin tam geçtiği ya da dizgi önekinin B sonekiyle uyuştuğu konum

= ℎ ( ), dizginin geçtiği blok konumları

Şekil 4.10 Uzun ve kısa bloklar için önek (P) ve sonek (S) durumları

a- Blok tek bir karakterdir ve tanım doğrudan elde edilir.

b- Blok önceden geçmiş blokların birleşimidir. Tanım önceki blokların tanımları incelenerek elde edilir.

Yeni bir blok tanımı elde edildiği zaman, bu tanım dizgi eşleme durumunu güncellemek için kullanılır. Blok işlenmesi tamamlanmış olur ve bir sonraki bloğa geçilir.

Çalışmalarında sunulan birleşik yaklaşım ise dizgi eşlemede LZ77 sıkıştırma algoritmasının en kötü yanı olan blokların kendi kendini çağırmasını engellemek amacıyla geliştirilmiştir. Geliştirilen algoritma LZ77 ile LZ78 sıkıştırma algoritmaları arası bir algoritmadır. Örnek 4.6’da yeni yaklaşıma bir örnek ve çizelge 4.6’da da yeni algoritmanın diğer algoritmalarla kıyaslanması verilmiştir.

T metninin … öneki = … olarak sıkıştırılmış kabul edildiğinde, … ’nun en uzun sıkıştırılmış … v öneki aranır. Eğer birden fazla alternatif var ise minimum blok sayısı olan alınır. (r,h) bloğu kodlanır. v boş ise (0, ) olarak kodlanır.

Örnek 4.6: Metin = ananas

Okunan ilk karakter=a, Sözlük boş olduğu için 1 numaralı sözlük indeksine a yazılır.

Çıktı=(0,a)

Sözlük = 1-a

Okunan karakter = n, Sözlükte yer almaz. Sözlüğün sıradaki elemanına eklenir. Çıktı(0,n)

Sözlük= 1-a, 2-n

Okunan karakter = n, Sözlükte 2 numaralı indekste bulunur. Çıktı olarak ilk bulunan indeks ve iki indeks arası fark yazılır. Sözlüğe “an” eklenir.

Çıktı = (1,1)

Sözlük= 1-a, 2-n, 3-an

Okunan karakter = a, Sözlükte 1 numaralı indekste. Bir karakter daha okunur.

Okunan karakter = s, Sözlükte yer almaz.

Çıktı = (1,0)

“as” ikilisi sözlükte yer almadığı için çıktı olarak a’nın indeksi ve 0 üretilir. Kalan “s” karakteri ise sözlükte yer almadığı için çıktı olarak (0,s) üretilir [Navarro ve Raffinot, 1999].

Sözlük= 1-a, 2-n, 3-an, 4-s

Sıkıştırılmış metin = (0,a)(0,n)(1,1)(1,0)(0,s)

Çizelge 4.6 Üç metot arasında ortalama sıkıştırma oranları

Dosya Boyut (Kb) LZ77(%) LZ78(%) Hybrid(%)

English 1324 29,67 36,15 29,28 DNA 1390 28,03 25,30 29,08 book1 751 34,10 40,70 35,62 book2 597 29,33 40,21 30,44 paper1 52 32,33 46,20 34,29 paper2 80 32,68 43,00 34,80 paper3 45 35,10 45,50 38,12 paper4 13 37,60 47,95 41,07 paper5 12 39,85 50,79 41,74 paper6 37 33,60 47,72 35,69 Progc 39 32,21 47,99 34,16 Progl 70 22,45 39,10 23,30 Progp 48 21,34 40,36 22,46

Navarro ve Tarhio 2000 yılında LZ78 ve LZW sıkıştırma algoritmaları üzerinde Boyer – Moore dizgi eşleme yaklaşımı kullanarak sıkıştırılmış dizgi eşleme çalışması yapmışlardır.

Bu çalışmaya kadar BM tekniği sıkıştırılmış dizgi eşlemeler için kullanılmamıştır. Bu uygulamayla daha önceden var olan uygulamaların arama zamanında %30 önüne geçmişlerdir.

Çalışmada öncelikle LZ78 ve LZW sıkıştırma algoritmalarının, daha sonra da BM tekniğinin detaylı bir tanımı verilmiştir. LZW sıkıştırma algoritması ayrı bir teknik değil de LZ78 sıkıştırma algoritmasının bir çeşidi olarak ele alınmıştır.

Şekil 4.11’de LZ78 sıkıştırma tekniğine kuramsal pencere yaklaşımı ile örnek verilmiştir. Siyah kutular b=(s,c) bloğunun belirgin karakterini, düz çizgi ise iç karakterlerini simgelemektedir. Bir metin daha önceden işaret edilmiş blokların tekrar sıralanmasıyla elde edilir. (s, s tarafından işaret edilen blok ve onun öncesi … gibi)

Şekil 4.11 LZ78 sıkıştırma algoritmasındaki blok yaklaşımı

Bu duruma BM tekniğini uygulamak maliyetlidir. Çünkü blok içi karakterlere ulaşmak gereklidir. Bloğun son karakterine i uzaklıktaki bir karakter için zincirde i blok geri gidilmelidir.

Bu sebeple önce belirgin karakter düşünülerek işe başlanır. Kaydırmaları maksimize etmek için, en sağdan en sola doğru gidilir.

( , ) = min ({ } ∪ − , 1 ≤ ≤ ∧ = ) 4.4

formülü penceredeki i konumundaki c karakteri için en yüksek güvenli kaydırmayı vermektedir. Eğer pencerenin o konumunda dizgi var ise bu kaydırma 0 olacaktır. Belirgin karakterin 0 kaydırma vermediği durumlarda, pencere kaydırılır. Aksi halde iç karakterler de düşünülmek zorunda kalınır.

Algoritma sıkıştırılmış veriyi blok blok okumak sureti ile uygulanabilmektedir. 0 ya da daha fazla bloğu pencereye okuyup önceki işlemleri kaydırma yapabildiği sürece tekrarlamak mümkündür. Her okunan blok için, son karakteri, işaret ettiği blok, sıkıştırılmış verideki konumu ve uzunluğu (bu son iki eleman sıkıştırılmış dosyada yoktur ama okurken hesaplanabilir) saklanır.

Bu durum, yukarıdaki algoritmanın bloğun dizginin tüm karakterleri ile eşlenip eşlenmediğine bakmak için bloğu açması durumunda, dizginin blok içerisinde geçmesi suretiyle mümkündür. Bu da dizginin blok uzunluğundan çok küçük olmadığı durumlarda etkilidir.

Bir nevi “döngü atlama” özelliği eklenerek algoritma üzerinde küçük bir iyileştirme yapılabilmektedir. Bu iyileştirme, yeterince blok okunana kadar kaydırmayı ertelemek yerine her okunan bloğun belirgin karakterini kullanarak kaydırma yapmaktadır. Pratikte bu, belirgin karakterleri soldan sağa sırada düşünmek anlamına gelmektedir. Çok ve küçük kaydırma kullanılır ve daha önceden saklanmış karakterleri daha az sıralar. Bu çalışmada orijinal sürüm “basit BM” ve iyileştirilmiş sürüm “basit – opt – BM” olarak adlandırılmıştır.

Bu basit metot geniş alfabeler için etkiliyken DNA gibi dar alfabe içeren metinler için etkili kaydırmalar üretmekte başarısızdır. Bir karakter yerine q karakter grubu kullanılarak kaydırma yapan çoklu karakter tekniği bu durumlarda kullanılabilir.

Çalışmada bu konu ve tam blok kaydırma üzerinde de durulmuştur. Çizelge 4.7’de bu konuda yapılan testlerin sonuçları verilmiştir. [Navarro ve Tarhio, 2000]

Çizelge 4.7 Değişik algoritmalar için sıkıştırılmış dizgi eşleme zamanları (sn)

Navarro ve Tarhio 2005 yılında daha önce yaptıkları çalışmaya paralel olarak LZgrep adını verdikleri ve sıkıştırılmış dizgi eşleme yapan bir yazılım üretmişlerdir. BM tekniği üzerinde çeşitli uyarlamalar yaparak, LZ78 ve LZW sıkıştırma algoritmaları ile kodlanmış olan metin üzerinde belirgin karakterleri kullanarak kaydırma yapar hale getirmişlerdir. LZgrep bir LZW sıkıştırma algoritması kodlayıcısı olan Unix’in Compress algoritması ile sıkıştırılmış dosyalar üzerinde grep gibi doğrudan dizgi eşleme yapabilen bir araçtır. Ayrıca LZgrep Unix’in gzip algoritması ile sıkıştırılmış dosyalarda da mevcut olan yöntemlerden daha hızlı olarak açarak arama yapmaktadır. [Navarro ve Tarhio, 2005]

4.1.6.3. LZW sıkıştırma algoritması üzerinde yapılmış sıkıştırılmış dizgi eşleme