ฉันกำลังค้นหาอัลกอริทึมเพื่อบีบอัดสตริงข้อความขนาดเล็ก: 50-1000 ไบต์ (เช่น URL) อัลกอริทึมใดทำงานได้ดีที่สุดสำหรับสิ่งนี้
tinyurls
หรือเกี่ยวข้องกับพื้นที่จัดเก็บข้อมูลหรือไม่?
ฉันกำลังค้นหาอัลกอริทึมเพื่อบีบอัดสตริงข้อความขนาดเล็ก: 50-1000 ไบต์ (เช่น URL) อัลกอริทึมใดทำงานได้ดีที่สุดสำหรับสิ่งนี้
tinyurls
หรือเกี่ยวข้องกับพื้นที่จัดเก็บข้อมูลหรือไม่?
คำตอบ:
ตรวจสอบSmaz :
Smaz เป็นไลบรารีการบีบอัดแบบง่ายที่เหมาะสำหรับการบีบอัดสตริงที่สั้นมาก
string:orig_size:compr_size:space_savings
) This is the very end of it.:27:13:52%
, Lorem ipsum dolor sit amet:26:19:27%
, Llanfairpwllgwyngyll:20:17:15%
, aaaaaaaaaaaaa:13:13:0%
, 2BTWm6WcK9AqTU:14:20:-43%
,XXX:3:5:-67%
Huffman มีต้นทุนคงที่คือตาราง Huffman ดังนั้นฉันไม่เห็นด้วยเป็นทางเลือกที่ดี
มีเวอร์ชันที่ปรับเปลี่ยนได้ซึ่งช่วยลดปัญหานี้ได้ แต่อัตราการบีบอัดอาจได้รับผลกระทบ จริงๆแล้วคำถามที่คุณควรถามคือ "อัลกอริทึมใดในการบีบอัดสตริงข้อความที่มีลักษณะเหล่านี้" ตัวอย่างเช่นหากคาดว่าจะมีการทำซ้ำเป็นเวลานานการเข้ารหัส Run-Lengh แบบธรรมดาอาจเพียงพอ หากคุณสามารถรับประกันได้ว่าจะมีเฉพาะคำภาษาอังกฤษช่องว่างเครื่องหมายวรรคตอนและตัวเลขเป็นครั้งคราว Huffman ที่มีตาราง Huffman ที่กำหนดไว้ล่วงหน้าอาจให้ผลลัพธ์ที่ดี
โดยทั่วไปอัลกอริทึมของตระกูล Lempel-Ziv มีการบีบอัดและประสิทธิภาพที่ดีมากและมีไลบรารีสำหรับพวกเขามากมาย ฉันจะไปด้วย
ด้วยข้อมูลที่ว่าสิ่งที่ถูกบีบอัดเป็น URL ฉันขอแนะนำว่าก่อนที่จะบีบอัด (ด้วยอัลกอริทึมใดก็ตามที่สามารถใช้ได้อย่างง่ายดาย) คุณ CODIFY พวกเขา URL เป็นไปตามรูปแบบที่กำหนดไว้อย่างดีและบางส่วนสามารถคาดเดาได้สูง การใช้ประโยชน์จากความรู้นี้คุณสามารถเข้ารหัส URL ให้เป็นสิ่งที่เล็กลงเพื่อเริ่มต้นและแนวคิดเบื้องหลังการเข้ารหัส Huffman สามารถช่วยคุณได้ที่นี่
ตัวอย่างเช่นการแปล URL เป็นบิตสตรีมคุณสามารถแทนที่ "http" ด้วยบิต 1 และอย่างอื่นด้วยบิต "0" ตามด้วยโปรโคทอลจริง (หรือใช้ตารางเพื่อรับโปรโตคอลทั่วไปอื่น ๆ เช่น https ftp, ไฟล์) ": //" สามารถทิ้งได้ทั้งหมดตราบเท่าที่คุณสามารถทำเครื่องหมายจุดสิ้นสุดของโปรโตคอลได้ เป็นต้นไปอ่านเกี่ยวกับรูปแบบ URL และคิดว่าจะสามารถเข้ารหัสได้อย่างไรเพื่อให้ใช้พื้นที่น้อยลง
ฉันไม่มีรหัสในมือ แต่ฉันชอบวิธีการสร้างตารางการค้นหา 2D ขนาด 256 * 256 ตัวอักษร ( RFC 1978 , PPP Predictor Compression Protocol ) ในการบีบอัดสตริงที่คุณวนซ้ำในแต่ละอักขระและใช้ตารางการค้นหาเพื่อรับ 'ทำนาย' อักขระถัดไปโดยใช้อักขระปัจจุบันและก่อนหน้าเป็นดัชนีในตาราง หากมีรายการที่ตรงกันให้คุณเขียน 1 บิตเดียวมิฉะนั้นให้เขียน 0 อักขระและอัปเดตตารางการค้นหาด้วยอักขระปัจจุบัน วิธีนี้โดยพื้นฐานแล้วจะรักษาตารางการค้นหาแบบไดนามิก (และหยาบ) ของอักขระถัดไปที่น่าจะเป็นไปได้มากที่สุดในสตรีมข้อมูล
คุณสามารถเริ่มต้นด้วยตารางการค้นหาที่เป็นศูนย์ แต่จะใช้งานได้ดีที่สุดในสตริงที่สั้นมากหากเริ่มต้นด้วยอักขระที่เป็นไปได้มากที่สุดสำหรับคู่อักขระแต่ละคู่ตัวอย่างเช่นสำหรับภาษาอังกฤษ ตราบใดที่ตารางการค้นหาเริ่มต้นเหมือนกันสำหรับการบีบอัดและการคลายการบีบอัดคุณไม่จำเป็นต้องปล่อยมันลงในข้อมูลที่บีบอัด
อัลกอริทึมนี้ไม่ได้ให้อัตราส่วนการบีบอัดที่ยอดเยี่ยม แต่ประหยัดอย่างไม่น่าเชื่อด้วยทรัพยากรหน่วยความจำและ CPU และยังสามารถทำงานกับสตรีมข้อมูลอย่างต่อเนื่อง - ตัวคลายการบีบอัดจะรักษาสำเนาของตารางการค้นหาของตัวเองในขณะที่คลายการบีบอัดดังนั้นตารางการค้นหา ปรับตามประเภทของข้อมูลที่กำลังบีบอัด
ขั้นตอนวิธีการใด ๆ / ห้องสมุดที่สนับสนุนที่ตั้งไว้ในพจนานุกรมเช่นzlib
ด้วยวิธีนี้คุณสามารถไพรม์คอมเพรสเซอร์ด้วยข้อความประเภทเดียวกับที่น่าจะปรากฏในอินพุต หากไฟล์มีความคล้ายคลึงกันในทางใดทางหนึ่ง (เช่น URL ทั้งหมดโปรแกรม C ทั้งหมดโพสต์ StackOverflow ทั้งหมดภาพวาด ASCII ทั้งหมด) สตริงย่อยบางอย่างจะปรากฏในไฟล์อินพุตส่วนใหญ่หรือทั้งหมด
ทุกอัลกอริธึมการบีบอัดจะช่วยประหยัดเนื้อที่หากสตริงย่อยเดียวกันซ้ำหลายครั้งในไฟล์อินพุตเดียว (เช่น "the" ในข้อความภาษาอังกฤษหรือ "int" ในรหัส C)
แต่ในกรณีของ URL บางสตริง (เช่น " http: // www .", ".com", ".html", ".aspx" จะปรากฏหนึ่งครั้งในไฟล์อินพุตแต่ละไฟล์ดังนั้นคุณต้องแชร์ระหว่างไฟล์ต่างๆ แทนที่จะมีหนึ่งเหตุการณ์ที่บีบอัดต่อไฟล์การวางไว้ในพจนานุกรมที่ตั้งไว้ล่วงหน้าจะทำให้ได้สิ่งนี้
โดยทั่วไปการเข้ารหัส Huffman ใช้งานได้ดีสำหรับสิ่งนี้
หากคุณกำลังพูดถึงการบีบอัดข้อความไม่ใช่แค่การย่อให้สั้นแล้ว Deflate / gzip (wrapper รอบ gzip) zip จะทำงานได้ดีสำหรับไฟล์และข้อความขนาดเล็ก อัลกอริทึมอื่น ๆ มีประสิทธิภาพสูงสำหรับไฟล์ขนาดใหญ่เช่น bzip2 เป็นต้น
วิกิพีเดียมีรายการเวลาบีบอัด (มองหาการเปรียบเทียบประสิทธิภาพ)
Name | Text | Binaries | Raw images
-----------+--------------+---------------+-------------
7-zip | 19% in 18.8s | 27% in 59.6s | 50% in 36.4s
bzip2 | 20% in 4.7s | 37% in 32.8s | 51% in 20.0s
rar (2.01) | 23% in 30.0s | 36% in 275.4s | 58% in 52.7s
advzip | 24% in 21.1s | 37% in 70.6s | 57& in 41.6s
gzip | 25% in 4.2s | 39% in 23.1s | 60% in 5.4s
zip | 25% in 4.3s | 39% in 23.3s | 60% in 5.7s
คุณอาจต้องการที่จะดูที่โครงการการบีบอัดมาตรฐาน Unicode
SQL Server 2008 R2 ใช้ภายในและสามารถบีบอัดได้ถึง 50%