โครงสร้างข้อมูลแบบย่อส่วน (Succinct)
(blog.startifact.com)- ระหว่างอ่านงานวิจัยเพื่อปรับแต่งประสิทธิภาพ ได้รู้จักแนวคิดของ Succinct Data Structures (โครงสร้างข้อมูลแบบย่อส่วน) เป็นครั้งแรก
- ระหว่างค้นหางานวิจัยที่เกี่ยวข้อง ก็ได้ติดต่อพูดคุยโดยตรงกับศาสตราจารย์ Gonzalo Navarro นักวิจัยผู้มีชื่อเสียง
- จึงเริ่มสงสัยว่าทำไมโครงสร้างข้อมูลลักษณะนี้จึงยังไม่ถูกใช้อย่างแพร่หลาย ต่างจากอาร์เรย์ แฮชแมป หรือต้นไม้แบบเดิม
- บทความนี้จึงต้องการอธิบายเรื่องนี้แบบสั้น ๆ
ภาพรวมของ Succinct Data Structures
- คล้ายกับการบีบอัดข้อมูลทั่วไป คือ เก็บข้อมูลในรูปแบบบีบอัด แต่ยังสามารถนำไปใช้งานได้โดยตรงแม้อยู่ในสภาพที่บีบอัด
- ความต่างจากวิธีบีบอัดแบบเดิม: สามารถเข้าถึงและจัดการข้อมูลได้ โดยไม่ต้องคลายการบีบอัด
- เป็นสาขาที่มีการวิจัยอย่างคึกคักมาตลอด 25 ปีที่ผ่านมา
การใช้งานใน Rust
- ใน การเขียนโปรแกรมระบบ ประสิทธิภาพและการใช้หน่วยความจำมีความสำคัญมาก จึงมีโอกาสสูงที่โครงสร้างข้อมูลลักษณะนี้จะมีประโยชน์
- งานวิจัยเดิมส่วนใหญ่ทำใน C++ แต่ก็เริ่มมีการค้นหาและพัฒนา implementation ใน Rust มากขึ้น
- ขอแนะนำไลบรารีที่น่าจะเป็นประโยชน์สำหรับนักพัฒนา Rust
Bit Vectors (บิตเวกเตอร์)
- ตัวอย่างอาร์เรย์บิต:
[0, 1, 0, 1, 1, 0, 1, 0] - ในระบบ 64 บิต สามารถเก็บบิต 64 ตัวไว้ในจำนวนเต็มตัวเดียวได้ จึงช่วยประหยัดพื้นที่
- ตัวบิตเวกเตอร์เองยังไม่ใช่โครงสร้างแบบ succinct แต่มี วิธีนำไปใช้ให้เกิดประสิทธิภาพสูง
Rank/Select Bit Vector
- การดำเนินการ Rank: คำนวณว่าก่อนถึงดัชนีที่กำหนด มีค่า 1 ปรากฏกี่ครั้ง
- ตัวอย่าง:
rank(3)→2
- ตัวอย่าง:
- การดำเนินการ Select: คืนค่าตำแหน่งที่
1ตัวที่กำหนดปรากฏ- ตัวอย่าง:
select(2)→3
- ตัวอย่าง:
- ทำงานได้ใน ความซับซ้อนเวลา O(1)
- มี memory overhead ต่ำ และมีประโยชน์เมื่อจัดการกับสตริงขนาดใหญ่
- กรณีการใช้งาน
- มีประโยชน์เมื่อเก็บสตริงขนาดใหญ่โดยแยกเป็นหน่วยสตริงย่อยขนาดเล็ก
- สามารถค้นหาได้อย่างมีประสิทธิภาพว่าดัชนีหนึ่ง ๆ อยู่ในสตริงย่อยส่วนใด
- ใช้ วิธีจัดเก็บแบบบีบอัด เพื่อลดการใช้หน่วยความจำ พร้อมทั้งยังค้นหาได้รวดเร็ว
- ไลบรารี Rust
Wavelet Matrix (เวฟเล็ตเมทริกซ์)
- ขยายแนวคิด Rank/Select ไปสู่ ข้อมูลที่มี alphabet ขนาดใหญ่กว่า
- ตัวอย่าง: การวิเคราะห์ลำดับ DNA (A, C, G, T) หรือ การค้นหาข้อความ (อักขระ UTF-8, สัญลักษณ์ 256 แบบ)
- ทำงานโดยอาศัย Rank/Select bit vector เป็นพื้นฐาน
- ไลบรารี Rust
versมี implementation ของเวฟเล็ตเมทริกซ์รวมอยู่ด้วย
FM-Index (ดัชนีสตริงแบบบีบอัด)
- รองรับ การค้นหา ไปพร้อมกับการจัดเก็บข้อมูลข้อความจำนวนมากในรูปแบบบีบอัด
- ฟังก์ชันหลัก:
count(pattern): คำนวณว่ามีแพตเทิร์น (สตริง) ที่กำหนดปรากฏกี่ครั้งlocate(pattern): คืนค่า ดัชนีทั้งหมด ที่แพตเทิร์นนั้นปรากฏ
- มีประโยชน์กับ การค้นหาลำดับ DNA และ การค้นหาข้อความขนาดใหญ่
- ไลบรารี Rust
Balanced Parentheses (การแทนวงเล็บแบบสมดุล)
- บีบอัดการเก็บโครงสร้างต้นไม้ให้เหลือระดับ 2 บิตต่อโหนด
- ตัวอย่างต้นไม้:
a
/ \\
b c
- สามารถแทนได้ในรูป
(()()) - และแปลงเป็น
1(วงเล็บเปิด) กับ0(วงเล็บปิด) ได้เป็น110100 - ใช้การดำเนินการ Rank/Select เพื่อ ปรับปรุงประสิทธิภาพของการนำทางภายในต้นไม้
- ไลบรารี Rust
- กำลังพัฒนาอยู่ในสาขา
dev-bpของvers
- กำลังพัฒนาอยู่ในสาขา
การประยุกต์ใช้: การจัดเก็บและประมวลผล XML
- สามารถเก็บ XML โดยใช้ การแทนวงเล็บแบบสมดุล
- ใช้ Rank/Select bit vector เพื่อจัดการ XML tag (
p,divเป็นต้น) ได้อย่างมีประสิทธิภาพ - ใช้
FM-Indexเพื่อ เพิ่มประสิทธิภาพการค้นหาข้อความ
บทสรุป
- โครงสร้างข้อมูลแบบ succinct มอบทั้ง การใช้หน่วยความจำต่ำ และ การประมวลผลที่รวดเร็ว ไปพร้อมกัน
- แม้จะมีงานวิจัยใน C++ มาก แต่ใน Rust ก็มีการนำมาพัฒนาอย่างจริงจังเช่นกัน
- การร่วมงานกับนักวิจัยและนักพัฒนาโอเพนซอร์สทำให้ค้นพบความเป็นไปได้อีกมาก
- มีแนวโน้มสูงว่าจะถูกใช้งานอย่างแพร่หลายมากขึ้นในสาขาวิทยาการคอมพิวเตอร์หลากหลายด้านในอนาคต
2 ความคิดเห็น
โครงสร้างแบบบีบอัดที่ใช้ Wavelet ถูกนำมาใช้เป็นมาตรฐานใน Djvu ได้อย่างดี การบีบอัดภาพยอดเยี่ยมจริง ๆ
ความคิดเห็นใน Hacker News
ฉันส่งอีเมลไปถาม Gonzalo Navarro และผลลัพธ์คือได้ร่วมเขียนบทความวิจัยกับเขา
ฉันอยู่ในสายนี้มานานกว่า 30 ปีแล้ว แต่เพิ่งเคยได้ยินคำว่า "โครงสร้างข้อมูลแบบย่อ"
โครงสร้างข้อมูลแบบย่ออาจไม่ได้เร็วกว่าวิธีดั้งเดิม หากชุดข้อมูลยังพอดีกับหน่วยความจำ
ฉันได้ยินแนวคิดเรื่องโครงสร้างข้อมูลแบบย่อครั้งแรกจาก Edward Kmett
โครงสร้างข้อมูลแบบย่อนั้นสนุกมาก
หนังสือของ Navarro เป็นงานสำรวจที่ยอดเยี่ยม
ฉันใช้เวลาช่วงเช้าไปกับการศึกษาโครงสร้างข้อมูลแบบย่อ และประสิทธิภาพด้านหน่วยความจำนั้นน่าทึ่งมาก
มีวิธีทำให้การแทนโหนดของโครงสร้างขนาดใหญ่ในหน่วยความจำมีประสิทธิภาพ
Marisa trie เป็นโครงสร้างข้อมูลแบบย่อที่ทั้งเจ๋งและมีประโยชน์มาก
ไลบรารีพื้นฐานของฉันสำหรับโครงสร้างข้อมูลแบบย่อคือ SDSL-Lite