"जप" के अनुक्रम के लिए bzip2 का उपयोग कर संपीड़न अनुपात इतना उछल क्यों रहा है?


15
library(ggplot2)

compress <- function(str) {
  length(memCompress(paste(rep("a", str), collapse=""), type="bzip2"))
  / nchar(paste(rep("a", str), collapse=""))
}

cr <- data.frame(i = 1:10000, r = sapply(1:10000, compress))

ggplot(cr[cr$i>=5000 & cr$i<=10000,], aes(x=i, y=r)) + geom_line()

यहाँ छवि विवरण दर्ज करें

संपीड़न अनुपात 37 पर "ए" के लिए शुरू होता है और ब्रेक-यहां तक ​​कि 39 "ए" (संपीड़न अनुपात = 1) पर हिट होता है। चार्ट बहुत सुचारू रूप से शुरू होता है और अचानक 98 "ए" के लिए नुकीला हो जाता है और वहाँ से तेजी से छोटे अंतराल पर।

स्थानीय चढ़ाव और चिकनी खंड भी काफी अनियमित और यादृच्छिक लगते हैं। क्या कोई मुझे समझा सकता है कि bzip2 इस उदाहरण में इस व्यवहार को क्यों दिखाता है?

जवाबों:


14

a(हैडर,"ए",n)an+एलजीn+एलजी(n)nΘ(एलजी(n)पी/n)पी1

एलजीnnn+1+2n+1n+2n

चूंकि दृश्यता अवलोकन के लिए संपीड़न अनुपात लंबाई के व्युत्क्रम अनुपात के करीब है, यहां मेरे कार्यान्वयन में छोटी लंबाई के लिए डेटा है (यह bzip2 लाइब्रेरी के संस्करण पर निर्भर हो सकता है, क्योंकि कुछ इनपुट को संपीड़ित करने के कई तरीके हैं। )। पहला कॉलम a's की संख्या को दर्शाता है , दूसरा कॉलम संपीड़ित आउटपुट की लंबाई है।

1–3       37
4–99      39
100–115   37
116–258   39
259–354   45
355       43
356       40
357–370   41
371–498   43
499–513   41
514–609   45
610       43
611       41
613–625   42
626–753   44
754–764   42
765       40
766–767   41
768       42
769–864   45
…

Bzip2 कहीं अधिक जटिल है जो एक साधारण रन-लंबाई एन्कोडिंग है। यह चरणों की एक श्रृंखला में काम करता है, और पहला चरण एक रन-लंबाई एन्कोडिंग चरण है , लेकिन एक निश्चित आकार सीमा के साथ। पहला चरण निम्नानुसार काम करता है: यदि एक बाइट को कम से कम 4 बार दोहराया जाता है, तो 4 बाइट के बाद बाइट्स को मिटाए गए बाइट्स की पुनरावृत्ति गिनती का संकेत देता है। उदाहरण के लिए, ( बाइट मान 3 के साथ वर्ण कहाँ है) में aaaaaaaतब्दील हो जाता है; में तब्दील हो जाता है , और इसी तरह। चूंकि केवल 256 अलग-अलग बाइट मान हैं, केवल अनुक्रम जहां बाइट को 259 बार दोहराया जाता है, इस तरह से एन्कोड किया जा सकता है; अधिक होने पर, एक नया क्रम शुरू होता है। इसके अलावा, संदर्भ कार्यान्वयन 252 की पुनरावृत्ति गणना पर रुकता है, जो 256 बाइट्स की एक स्ट्रिंग को एन्कोड करता है।aaaa\d{3}\d{003}aaaaaaaa\d{0}

n1n34n258aaaa\d{252}\d{252} दोहराने की गिनती है, मैंने जाँच नहीं की है) खुद को दोहराया है और इसलिए बाद के चरणों द्वारा संकुचित किया गया है।

aaaa\374aan=258a

n=100101aaaa\d{97}aaaaaan=101aA68n83

इस उदाहरण का मेरा विश्लेषण संपूर्ण है। अन्य प्रभावों को समझने के लिए, आपको परिवर्तन के अन्य चरणों का अध्ययन करना होगा: मैं ज्यादातर 9. चरण 1 के बाद बंद हो गया। मुझे आशा है कि इससे आपको पता चल जाएगा कि संपीड़न अनुपात थोड़ा तड़का हुआ है और नीरस रूप से भिन्न नहीं है। यदि आप वास्तव में हर विवरण का पता लगाना चाहते हैं, तो मैं मौजूदा कार्यान्वयन को लागू करने और इसे डिबगर के साथ देखने की सलाह देता हूं।

अधिकांश भाग के लिए, संपीड़न एल्गोरिथ्म को डिज़ाइन करते समय ऐसे मिनट भिन्नता मुख्य ध्यान केंद्रित नहीं करते हैं: कई सामान्य परिदृश्यों में, जैसे कि सामान्य-उद्देश्य या मीडिया संपीड़न एल्गोरिदम, कुछ बाइट्स का अंतर अप्रासंगिक है। संपीड़न स्थानीय स्तर पर हर बिट को निचोड़ने की कोशिश करता है, और इस तरह से श्रृंखला परिवर्तन की कोशिश करता है जैसे कि अक्सर लाभ कम होता है और शायद ही कभी हारता है। कम-बैंडविड्थ संचार के लिए डिज़ाइन किए गए विशेष प्रयोजन संचार प्रोटोकॉल जैसी गैर-परिस्थितियां हैं, जहां हर बिट मायने रखती है। एक अन्य स्थिति जहां सटीक आउटपुट लंबाई मायने रखती है जब संपीड़ित पाठ एन्क्रिप्ट किया गया है: जब एक विरोधी पाठ के भाग को संपीड़ित और एन्क्रिप्ट किया जा सकता है, तो सिफरटेक्स्ट की लंबाई पर भिन्नता संकुचित-और-एन्क्रिप्ट किए गए पाठ के भाग को प्रकट कर सकती है। विरोधी; HTTPS पर CRIME शोषण

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.