สมมติว่าอัลกอริทึมการบีบอัดง่ายๆที่แสดงให้เห็นถึงการทำงานของa
โดยการจัดเก็บคือบางส่วนหัวคงที่สตริงและจำนวนของการเกิดซ้ำn นี่คือการเข้ารหัสระยะยาว แล้วความยาวของข้อความที่บีบอัดจะใกล้กับ+ LG nบิตสำหรับบางคนคง อัตราส่วนการบีบอัดที่สอดคล้องกันจะเป็น+ lg ( n )( ส่วนหัว, "a" , n )a
na + lgna . นี่เป็นรูปโค้งโดยประมาณจากระยะไกลหากมองข้ามส่วนบนและล่าง Asymptotically อัตราส่วนการบีบอัดคือΘ(lg(n)p/n)กับp≥1(ฉันไม่ได้ทำงานออกมา แต่ฉันสงสัยว่ามีปัจจัยอื่น ๆ ที่เล่นซึ่งทำให้ขนาดของ superlinear เอาท์พุทในความยาวของ สตริงอินพุต)a + lg( n )nΘ ( lg( n )พี/ n)p ≥ 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 ไบต์
an1 ≤ n ≤ 34 ≤ n ≤ 258aaaa\d{252}
\d{252}
คือจำนวนการทำซ้ำฉันไม่ได้ตรวจสอบ) ทำซ้ำตัวเองดังนั้นจึงถูกบีบอัดตามขั้นตอนต่อไป
aaaa\374aa
n = 258a
n = 100a101aaaa\d{97}
a
aaaaa
n = 101a
A
68 ≤ n ≤ 83
การวิเคราะห์ตัวอย่างนี้ของฉันไม่ได้ครอบคลุม เพื่อให้เข้าใจถึงผลกระทบอื่น ๆ คุณจะต้องศึกษาขั้นตอนอื่น ๆ ของการเปลี่ยนแปลง: ฉันมักจะหยุดหลังจากขั้นตอนที่ 1 ใน 9 ฉันหวังว่านี่จะช่วยให้คุณเข้าใจว่าทำไมอัตราส่วนการบีบอัดจึงลดลงเล็กน้อยและไม่ซ้ำซาก หากคุณต้องการทราบทุกรายละเอียดฉันขอแนะนำให้ใช้งานการดำเนินการที่มีอยู่แล้วและสังเกตด้วยตัวดีบัก
ส่วนใหญ่แล้วความแปรปรวนแบบนาทีนั้นไม่ใช่จุดสนใจหลักเมื่อออกแบบอัลกอริทึมการบีบอัด: ในสถานการณ์จำลองทั่วไปเช่นอัลกอริธึมทั่วไปหรืออัลกอริธึมการบีบอัดสื่อความแตกต่างของสองสามไบต์นั้นไม่เกี่ยวข้องกัน การบีบอัดพยายามบีบออกทุก ๆ ระดับในระดับท้องถิ่นและพยายามที่จะเปลี่ยนรูปแบบลูกโซ่ในลักษณะที่จะได้รับบ่อยครั้งในขณะที่ไม่ค่อยสูญเสียและไม่มากนัก มีสถานการณ์ที่ไม่แน่นอนเช่นโปรโตคอลการสื่อสารแบบพิเศษที่ออกแบบมาสำหรับการสื่อสารที่มีแบนด์วิธต่ำซึ่งทุกเรื่องสำคัญ อีกสถานการณ์หนึ่งที่ความยาวเอาต์พุตที่แน่นอนคือเมื่อข้อความที่ถูกบีบอัดถูกเข้ารหัส: เมื่อฝ่ายตรงข้ามสามารถส่งส่วนหนึ่งของข้อความที่จะถูกบีบอัดและเข้ารหัสรูปแบบที่ความยาวของข้อความเข้ารหัสสามารถเปิดเผยส่วนของข้อความที่ถูกบีบอัดและเข้ารหัส ปฏิปักษ์;อาชญากรรม ใช้ประโยชน์ในHTTPS