Özlü (Succinct) veri yapıları
(blog.startifact.com)- Performans optimizasyonu için makaleler okurken Succinct Data Structures (özlü veri yapıları) kavramıyla ilk kez karşılaşıldı
- İlgili makaleleri ararken tanınmış araştırmacı Prof. Gonzalo Navarro ile doğrudan iletişim kuruldu
- Mevcut diziler, hash map'ler, ağaçlar vb. ile karşılaştırıldığında bu tür veri yapılarının neden yaygın kullanılmadığı sorgulandı
- Buna dair kısa bir açıklama yapılmak isteniyor
Succinct Data Structures'a genel bakış
- Genel veri sıkıştırmaya benzer şekilde veriyi sıkıştırarak saklar, ancak sıkıştırılmış haldeyken de doğrudan kullanılabilir
- Mevcut sıkıştırma yöntemlerinden farkı: veriye sıkıştırmayı açmadan erişilebilir ve veri üzerinde işlem yapılabilir
- Son 25 yılda yoğun biçimde araştırılan bir alan
Rust'ta kullanım
- Sistem programlama tarafında performans ve bellek kullanımı önemli olduğundan, bu veri yapıları büyük fayda sağlayabilir
- Mevcut araştırmalar ağırlıklı olarak C++ üzerinde yapılmış olsa da, Rust tarafında da uygulamalar ortaya çıkmaya başladı
- Rust geliştiricileri için faydalı olabilecek bazı kütüphaneler tanıtılıyor
Bit Vectors (bit vektörleri)
- Bit dizisi örneği:
[0, 1, 0, 1, 1, 0, 1, 0] - 64 bitlik bir sistemde 64 bit tek bir tamsayı içinde saklanabildiği için alan tasarrufu sağlar
- Bit vektörünün kendisi özlü bir yapı değildir, ancak onu verimli kullanmanın yolları vardır
Rank/Select Bit Vector
- Rank işlemi: belirli bir indisten önce
1değerinin kaç kez göründüğünü hesaplar- Örnek:
rank(3)→2
- Örnek:
- Select işlemi: belirli sıradaki
1değerinin bulunduğu konumu döndürür- Örnek:
select(2)→3
- Örnek:
- O(1) zaman karmaşıklığı ile çalıştırılabilir
- Bellek ek yükü düşüktür ve büyük string'lerle çalışırken kullanışlıdır
- Kullanım örnekleri
- Büyük bir string'i küçük string parçalarına bölerek saklarken faydalıdır
- Belirli bir indisin hangi alt string'e ait olduğunu verimli şekilde bulabilir
- Sıkıştırılmış depolama yöntemi sayesinde bellek kullanımını azaltırken hızlı arama sunar
- Rust kütüphaneleri
Wavelet Matrix (wavelet matrisi)
- Rank/Select kavramını daha büyük alfabeler içeren veri kümelerine genişletir
- Örneğin: DNA dizi analizi (A, C, G, T) veya metin arama (UTF-8 karakterleri, 256 sembol)
- Rank/Select bit vektörü temelinde çalışır
- Rust kütüphaneleri
versiçinde wavelet matrisi uygulaması bulunur
FM-Index (sıkıştırılmış string indeksi)
- Büyük miktarda metin verisini sıkıştırarak saklarken aynı zamanda arama işlevi sunar
- Temel işlevler:
count(pattern): belirli bir desenin (string) kaç kez geçtiğini hesaplarlocate(pattern): bu desenin geçtiği tüm indisleri döndürür
- DNA dizi araması ve büyük ölçekli metin araması için kullanışlıdır
- Rust kütüphaneleri
Balanced Parentheses (dengeli parantez gösterimi)
- Ağaç yapısını düğüm başına 2 bit düzeyinde sıkıştırarak saklar
- Örnek ağaç:
a
/ \
b c
(()())biçiminde gösterilebilir1(açık parantez) ve0(kapalı parantez) olarak dönüştürülebilir:110100- Rank/Select işlemleri kullanılarak ağaç içi gezinme işlemleri optimize edilir
- Rust kütüphaneleri
verspaketinindev-bpdalında uygulanıyor
Uygulama: XML saklama ve işleme
- XML, dengeli parantez gösterimi kullanılarak saklanabilir
- XML etiketlerini (
p,divvb.) verimli işlemek için Rank/Select bit vektörü kullanılır FM-Indexile metin arama performansı artırılır
Sonuç
- Özlü veri yapıları, düşük bellek kullanımı ile hızlı işlemleri aynı anda sunar
- Araştırmalar C++ tarafında yoğunlaşmış olsa da Rust'ta da aktif biçimde uygulanıyorlar
- Araştırmacılar ve açık kaynak geliştiricileriyle iş birliği yapılırken pek çok olasılık keşfedildi
- Gelecekte bilgisayar biliminin çeşitli alanlarında daha yaygın kullanılma potansiyeline sahipler
2 yorum
Wavelet kullanan sıkıştırma yapıları, Djvu'da standart olarak yaygın biçimde kullanılıyor. Görüntü sıkıştırması gerçekten çok başarılı.
Hacker News görüşleri
Gonzalo Navarro'ya e-posta gönderip soru sordum ve bunun sonucunda birlikte bir makale yazdık
Bu alanda 30 yıldan uzun süredir bulunuyorum ama "özlü veri yapıları" diye bir şeyi ilk kez duydum
Özlü veri yapıları, veri kümesi belleğe sığıyorsa geleneksel yapılardan daha hızlı olmayabilir
Özlü veri yapıları kavramını ilk kez Edward Kmett'ten duydum
Özlü veri yapıları çok eğlenceli
Navarro'nun kitabı mükemmel bir derleme çalışması
Bu sabahı özlü veri yapıları üzerine okuyarak geçirdim ve bellek verimliliği şaşırtıcı
Büyük struct'ların bellek içi düğüm gösterimini verimli hale getirmenin bir yolu var
Marisa trie çok havalı ve kullanışlı bir özlü veri yapısı
Özlü veri yapıları için benim temel kütüphanem SDSL-Lite