Sıkıştırmayı optimize etmek için verileri yeniden sıralamak (dizeler kümesi)?


12

Sıkıştırmayı optimize etmek için verileri yeniden sıralamak için herhangi bir algoritma var mı? Bunun veri ve sıkıştırma algoritmasına özgü olduğunu anlıyorum, ancak bu konu için bir kelime var mı? Bu alanda nerede araştırma bulabilirim?

Özellikle, ben 1,5 milyon dizeleri bir json listesi var ve gzip (HTTP için) sıkıştırma optimize böylece dizeleri yeniden sıralamak istiyorum. Dizeleri sıralamak oldukça iyi, ama bunun optimal olup olmadığını gerçekten bilmiyorum.


1
Dizeleri gzip sıkıştırma için en uygun şekilde yeniden sıralamak (küçük sürgülü pencereli LZ77) NP zor bir sorun gibi geliyor. Muhtemelen en kısa yaygın süper sicim probleminden bir azalma ile gelebilirsiniz.
Jouni Sirén

@ JouniSirén En uzun ortak alt dize daha iyi bir yaklaşım olduğunu düşünüyorum çünkü en kısa ortak süper sicim beni ortak kısmı arka arkaya almamla sınırlıyor, değil mi? İzlenebilir olduğu sürece NP-hard'i umursamıyorum (modern bir makinede çalıştırmak için bir gün sürer).
Jayen

Yanıtlar:


6

Bu Navin Goyal'ın cevabına bir ektir.

Bir JSON dosyası bir ağaç veri yapısı olarak kabul edilebildiğinden, ağaçlar için XBW dönüşümünü kullanabilirsiniz ; bu, dizeler için Burrows-Wheeler dönüşümünün bir uzantısıdır.


1
Bunun için teşekkürler. Ben sadece bir JSON listesi / dizi, herhangi bir JSON nesneleri var, bu yüzden nasıl bir ağaç olarak kabul göremiyorum. Dizeleri bir üçgene dönüştürebilirim, ama sonra bunun XBW dönüşümü ile nasıl ilişkili olduğunu görmüyorum.
Jayen

4

Burrows - Wheeler dönüşümü , sıkıştırılacak dizedeki karakterleri yeniden sıralayarak çalışan iyi bilinen bir sıkıştırma algoritmasıdır.


1
Bunun için teşekkürler, ama bu bilgiyi nasıl kullanabileceğimden emin değilim. Sıkıştırmak için listedeki dizeleri yeniden sıralamak istiyorum, ancak orijinal siparişi geri alıp alamayacağım umurumda değil.
Jayen

1

Gzip sıkıştırmasını iyileştirmek için "benzer" dizelerin listede yakın olmasını istersiniz. Böyle bir benzerliği tanımlamanın birkaç yolu vardır; pratikte iyi çalışan makul bir tanesini açıklayayım. Gzip'in blok boyutunun 64K olduğunu hatırlayın. Böylece, verileriniz 64K baytlık bloklara bölünecek ve her blok bağımsız olarak sıkıştırılacaktır. Sıkıştırmayı optimize etmek için, her bloktaki farklı k-mer (k boyutunda alt dizeler) sayısını en aza indirmek gerekir. Motivasyon, bu tür tüm alt dizelerin bir tanımlayıcı ile değiştirilmesidir.

Yukarıdaki problem teoride zor olsa da (hipergraf bölümlemenin bir çeşididir), hızlı pratik algoritmalar vardır. Verilerinizin üzerinden tek bir geçişle uygulanabilen LSH benzeri kümelemeyi öneririm . (Alfabetik olarak) sıralamanın, benzer dizeleri birlikte "kümelemenin" başka bir yolu olduğuna dikkat edin. Ancak, özel kümeleme algoritmaları daha iyi performans gösterebilir.

Bir alternatif, (i) daha hızlı olan, (ii) daha yüksek sıkıştırma oranları elde eden ve (iii) blok boyutu üzerinde sınırlamalara sahip olmayan (ve böylece giriş sırasına bakılmaksızın dizeleri eşit derecede sıkıştırır) olan zstd kullanmaktır .


0

Bir süre önce faydalı olabilecek bir algoritma gördüm. Her sözcük arasındaki mesafeyi hesaplamak için bir mesafe düzenleme algoritması kullanır. Böylece, her kenar ağırlığının bu mesafe olduğu bir grafik oluşturur. Son olarak, en düşük ağırlık toplamına sahip bir yol seçme emri alır. Belki gzip'i geliştirebilir.


bu izlenebilir gibi görünmüyor, ancak birisi denerse, lütfen sonuçlarınızla yorum yapın
Jayen

Test etmeye çalışacağım. Bu sorunu merak ediyorum. Bunun yanı sıra neden izlenebilir olmadığını düşünüyorsunuz?
Rafael Ribeiro

bildiğim kadarıyla, düzenleme mesafesi O (nm) 'dir, burada n ve m, dize çiftindeki harf sayısıdır ve bunu her çift O (s ^ 2) dizisi için yapmanız gerekir, bu yüzden n = m, bu 1,5 milyon tel için bana inatçı gelen O (s ^ 2 * n ^ 2).
Jayen

Oh, karmaşıklık konusunda o kadar endişe etmedim çünkü probleminizin sadece ikili boyutu azaltmak olduğunu düşündüm. Bu işlem daha sık gerçekleşecek, değil mi?
Rafael Ribeiro

Burada arama yapıyordum ve belki de levenshtein automata kullanılarak editdistance maliyeti azaltılabilir
Rafael Ribeiro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.