จัดเรียงข้อมูลใหม่ (ชุดสตริง) เพื่อปรับให้เหมาะสมสำหรับการบีบอัด?


12

มีอัลกอริทึมใด ๆ ในการจัดเรียงข้อมูลใหม่เพื่อปรับการบีบอัดให้เหมาะสมหรือไม่? ฉันเข้าใจว่านี่เป็นข้อมูลเฉพาะและอัลกอริทึมการบีบอัด แต่มีคำสำหรับหัวข้อนี้หรือไม่ ฉันจะหางานวิจัยในพื้นที่นี้ได้ที่ไหน

โดยเฉพาะฉันมีรายชื่อ json 1.5 ล้านสตริงและฉันต้องการเรียงลำดับสตริงใหม่เพื่อให้การบีบอัด gzip (สำหรับ HTTP) ได้รับการปรับปรุง การเรียงลำดับสตริงทำได้ค่อนข้างดี แต่ฉันไม่รู้จริงๆว่าเหมาะสมหรือไม่


1
การเรียงลำดับสตริงที่เหมาะสมที่สุดสำหรับการบีบอัด gzip (LZ77 พร้อมหน้าต่างบานเลื่อนขนาดเล็ก) ให้เสียงเหมือนปัญหา NP-hard คุณอาจจะเกิดปัญหาการลดทอนความเชื่อมั่นทั่วไปที่สั้นที่สุด
Jouni Sirén

@ JouniSirénฉันคิดว่าสตริงย่อยทั่วไปที่ยาวที่สุดเป็นวิธีที่ดีกว่าเนื่องจากซุปเปอร์สโตร์สามัญที่สั้นที่สุด จำกัด ให้ฉันมีส่วนร่วมจากหลังไปขวาใช่ไหม ฉันไม่สนใจ NP-hard ตราบใดที่มันสามารถจัดการได้ (เช่นใช้เวลาหนึ่งวันในการทำงานกับเครื่องที่ทันสมัย)
Jayen

คำตอบ:


6

นี่คือส่วนเพิ่มเติมของคำตอบของ Navin Goyal

เนื่องจากไฟล์ JSON ถือได้ว่าเป็นโครงสร้างข้อมูลแบบต้นไม้คุณสามารถใช้การแปลง XBWสำหรับต้นไม้ซึ่งเป็นส่วนขยายของการแปลง Burrows-Wheeler สำหรับสตริง


1
ขอบคุณสำหรับสิ่งนั้น ฉันมีรายการ / อาร์เรย์ JSON เท่านั้นไม่มีวัตถุ JSON ใด ๆ ดังนั้นฉันจึงไม่เห็นว่ามันจะถือเป็นต้นไม้ได้อย่างไร ฉันสามารถแปลงสตริงให้เป็นคู่ชีวิตได้ แต่จากนั้นฉันไม่เห็นความเกี่ยวข้องกับการแปลง XBW
Jayen

4

Burrows - การแปลงวีลเลอร์เป็นอัลกอริทึมการบีบอัดที่รู้จักกันดีซึ่งทำงานโดยจัดเรียงอักขระในสตริงที่จะบีบอัดใหม่


1
ขอบคุณสำหรับสิ่งนั้น แต่ฉันไม่แน่ใจว่าฉันจะใช้ข้อมูลนี้ได้อย่างไร ฉันต้องการเรียงลำดับสตริงในรายการที่จะบีบอัด แต่ฉันไม่สนใจว่าฉันจะได้รับกลับคำสั่งเดิม
Jayen

1

เพื่อปรับปรุงการบีบอัด gzip คุณต้องการให้สตริง "คล้ายกัน" ปิดในรายการ มีหลายวิธีในการกำหนดความคล้ายคลึงกัน; ให้ฉันอธิบายสิ่งที่สมเหตุสมผลที่ใช้ได้ดีในทางปฏิบัติ จำได้ว่าขนาดบล็อกของ gzip คือ 64K ดังนั้นข้อมูลของคุณจะถูกแบ่งออกเป็นบล็อกขนาด 64K ไบต์และทุกบล็อกจะถูกบีบอัดอย่างอิสระ การเพิ่มประสิทธิภาพการบีบอัดจะต้องลดจำนวน k-mers ที่แตกต่างกัน (สตริงย่อยของขนาด k) ในทุกบล็อค แรงจูงใจคือสารตั้งต้นดังกล่าวทั้งหมดจะถูกแทนที่ด้วยตัวระบุ

ในขณะที่ปัญหาข้างต้นนั้นยากในทางทฤษฎี (มันเป็นตัวแปรของการแบ่งไฮเปอร์กราฟ) แต่ก็มีอัลกอริทึมการปฏิบัติที่รวดเร็ว ฉันอยากจะแนะนำการจัดกลุ่มคล้าย LSHที่สามารถใช้งานได้ด้วยการส่งผ่านข้อมูลของคุณเพียงครั้งเดียว ขอให้สังเกตว่าการเรียงลำดับ (ตัวอักษร) เป็นอีกวิธีหนึ่งในการ "รวมกลุ่ม" สตริงที่คล้ายกันเข้าด้วยกัน อย่างไรก็ตามอัลกอริทึมการจัดกลุ่มพิเศษสามารถทำงานได้ดีขึ้น

อีกทางเลือกหนึ่งคือการใช้zstdซึ่งเป็น (i) เร็วขึ้น (ii) ได้รับอัตราส่วนการบีบอัดที่สูงขึ้นและ (iii) ไม่มีข้อ จำกัด เกี่ยวกับขนาดบล็อก (และทำให้บีบอัดสตริงอย่างเท่าเทียมกัน


0

ฉันเคยเห็นอัลกอริทึมมาแล้วซึ่งอาจมีประโยชน์ มันใช้อัลกอริทึมแก้ไขระยะทางในการคำนวณระยะห่างระหว่างแต่ละคำ ดังนั้นมันจึงสร้างกราฟซึ่งน้ำหนักขอบแต่ละอันคือระยะนี้ ในที่สุดมันก็ได้รับคำสั่งให้เลือกเส้นทางที่มีน้ำหนักรวมต่ำสุด อาจปรับปรุง gzip ได้


ที่ไม่ได้ฟังได้ง่าย แต่ถ้ามีคนลองมันโปรดโพสต์ความคิดเห็นกับผลลัพธ์ของคุณ
4259

ฉันจะลองทดสอบดู ฉันอยากรู้เกี่ยวกับปัญหานี้ นอกจากนั้นทำไมคุณถึงคิดว่ามันไม่ง่ายนัก?
Rafael Ribeiro

เท่าที่ฉันรู้ระยะการแก้ไขคือ O (nm) โดยที่ n และ m เป็นจำนวนตัวอักษรในคู่ของสตริงและคุณต้องทำเช่นนี้สำหรับทุกคู่ของสตริง O (s ^ 2) ดังนั้นถ้า n = m นั่นคือ O (s ^ 2 * n ^ 2) ซึ่งฟังดูยากสำหรับฉันที่มี 1.5 ล้านสาย
Jayen

โอ้ฉันไม่ได้กังวลเกี่ยวกับความซับซ้อนมากนักเพราะฉันคิดว่าปัญหาของคุณคือการลดขนาดไบนารี่เท่านั้น ดังนั้นการดำเนินการนี้จะเกิดขึ้นบ่อยครั้งใช่มั้ย
Rafael Ribeiro

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