ทำไมอัตราส่วนการบีบอัดโดยใช้ bzip2 สำหรับลำดับของ“ a” น่ากลัวมาก?


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 สำหรับ "a" และกระทบกับจุดคุ้มทุนที่ 39 "a" (อัตราส่วนการบีบอัด = 1) แผนภูมิเริ่มออกมาเรียบสวยและหงุดหงิดในเวลา 98 "a" และจากจุดนั้นไปเรื่อย ๆ

ระดับต่ำสุดในพื้นที่และส่วนที่ราบรื่นดูเหมือนค่อนข้างผิดปกติและสุ่ม ใครสามารถอธิบายให้ฉันฟังได้ว่าทำไม bzip2 แสดงพฤติกรรมนี้ในตัวอย่างนี้

คำตอบ:


14

สมมติว่าอัลกอริทึมการบีบอัดง่ายๆที่แสดงให้เห็นถึงการทำงานของaโดยการจัดเก็บคือบางส่วนหัวคงที่สตริงและจำนวนของการเกิดซ้ำn นี่คือการเข้ารหัสระยะยาว แล้วความยาวของข้อความที่บีบอัดจะใกล้กับ+ LG nบิตสำหรับบางคนคง อัตราส่วนการบีบอัดที่สอดคล้องกันจะเป็น+ lg ( n )(header,"a",n)ana+LGna . นี่เป็นรูปโค้งโดยประมาณจากระยะไกลหากมองข้ามส่วนบนและล่าง Asymptotically อัตราส่วนการบีบอัดคือΘ(lg(n)p/n)กับp1(ฉันไม่ได้ทำงานออกมา แต่ฉันสงสัยว่ามีปัจจัยอื่น ๆ ที่เล่นซึ่งทำให้ขนาดของ superlinear เอาท์พุทในความยาวของ สตริงอินพุต)a+LG(n)nΘ(LG(n)พี/n)พี1

bits ไม่ใช่จำนวนเต็มจำนวนบิตนับประสาไบต์: ขนาดของ nจะต้องมีอย่างน้อยปัดเศษขึ้นเป็นจำนวนเต็มไบต์ นี้จะอธิบายถึงผลกระทบเกณฑ์แรก: สำหรับวิธีการบีบอัดนี้ง่ายคุณจะสังเกตได้ว่าระยะเวลาของการส่งออกเป็นเมื่อ nมีขนาดเล็กเพียงพอแล้ว + 1แล้ว + 2เป็นต้นอัตราส่วนการอัดจึงไม่ได้เป็น เรียบโค้ง แต่กระโดดจากLGnnana+1a+2ถึงa+1anจากนั้นa+2a+1n , ฯลฯ เอฟเฟกต์นี้แทบจะมองไม่เห็นในการปรับเปลี่ยนหลังจากกระโดด (แต่มีเอฟเฟกต์อื่น ๆ ในการเล่นซึ่งทำให้การกระโดดแตกต่างกัน)a+2n

เนื่องจากอัตราส่วนการบีบอัดอยู่ใกล้กับอัตราส่วนผกผันของความยาวมากเกินไปสำหรับการสังเกตด้วยสายตานี่คือข้อมูลสำหรับความยาวเล็กน้อยในการใช้งานของฉัน (อาจขึ้นอยู่กับเวอร์ชันของไลบรารี bzip2 เนื่องจากมีหลายวิธีในการบีบอัดอินพุตบางส่วน ) คอลัมน์แรกระบุจำนวนของaคอลัมน์ที่สองคือความยาวของเอาต์พุตที่บีบอัด

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 โดยไบต์ที่ระบุจำนวนการทำซ้ำของไบต์ที่ถูกลบ ตัวอย่างเช่นaaaaaaaถูกแปลงเป็นaaaa\d{3}(โดยที่\d{003}ตัวละครที่มีค่าไบต์ 3); aaaaถูกแปลงเป็นaaaa\d{0}และอื่น ๆ เนื่องจากมีค่าไบต์ที่แตกต่างกันเพียง 256 ค่าเท่านั้นลำดับที่สามารถเข้ารหัสซ้ำได้ถึง 259 ครั้งด้วยวิธีนี้ หากมีมากขึ้นลำดับใหม่จะเริ่มขึ้น นอกจากนี้การใช้งานการอ้างอิงจะหยุดที่จำนวนการทำซ้ำ 252 ซึ่งเข้ารหัสสตริง 256 ไบต์

an1n34n258aaaa\d{252}\d{252} คือจำนวนการทำซ้ำฉันไม่ได้ตรวจสอบ) ทำซ้ำตัวเองดังนั้นจึงถูกบีบอัดตามขั้นตอนต่อไป

aaaa\374aan=258a

n=100a101aaaa\d{97}aaaaaan=101aA68n83

การวิเคราะห์ตัวอย่างนี้ของฉันไม่ได้ครอบคลุม เพื่อให้เข้าใจถึงผลกระทบอื่น ๆ คุณจะต้องศึกษาขั้นตอนอื่น ๆ ของการเปลี่ยนแปลง: ฉันมักจะหยุดหลังจากขั้นตอนที่ 1 ใน 9 ฉันหวังว่านี่จะช่วยให้คุณเข้าใจว่าทำไมอัตราส่วนการบีบอัดจึงลดลงเล็กน้อยและไม่ซ้ำซาก หากคุณต้องการทราบทุกรายละเอียดฉันขอแนะนำให้ใช้งานการดำเนินการที่มีอยู่แล้วและสังเกตด้วยตัวดีบัก

ส่วนใหญ่แล้วความแปรปรวนแบบนาทีนั้นไม่ใช่จุดสนใจหลักเมื่อออกแบบอัลกอริทึมการบีบอัด: ในสถานการณ์จำลองทั่วไปเช่นอัลกอริธึมทั่วไปหรืออัลกอริธึมการบีบอัดสื่อความแตกต่างของสองสามไบต์นั้นไม่เกี่ยวข้องกัน การบีบอัดพยายามบีบออกทุก ๆ ระดับในระดับท้องถิ่นและพยายามที่จะเปลี่ยนรูปแบบลูกโซ่ในลักษณะที่จะได้รับบ่อยครั้งในขณะที่ไม่ค่อยสูญเสียและไม่มากนัก มีสถานการณ์ที่ไม่แน่นอนเช่นโปรโตคอลการสื่อสารแบบพิเศษที่ออกแบบมาสำหรับการสื่อสารที่มีแบนด์วิธต่ำซึ่งทุกเรื่องสำคัญ อีกสถานการณ์หนึ่งที่ความยาวเอาต์พุตที่แน่นอนคือเมื่อข้อความที่ถูกบีบอัดถูกเข้ารหัส: เมื่อฝ่ายตรงข้ามสามารถส่งส่วนหนึ่งของข้อความที่จะถูกบีบอัดและเข้ารหัสรูปแบบที่ความยาวของข้อความเข้ารหัสสามารถเปิดเผยส่วนของข้อความที่ถูกบีบอัดและเข้ารหัส ปฏิปักษ์;อาชญากรรม ใช้ประโยชน์ในHTTPS

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.