- ระหว่างอ่านงานวิจัยเพื่อปรับแต่งประสิทธิภาพ ได้รู้จักแนวคิดของ 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 ปรากฏกี่ครั้ง
- การดำเนินการ Select: คืนค่าตำแหน่งที่
1 ตัวที่กำหนดปรากฏ
- ทำงานได้ใน ความซับซ้อนเวลา O(1)
- มี memory overhead ต่ำ และมีประโยชน์เมื่อจัดการกับสตริงขนาดใหญ่
- กรณีการใช้งาน
- มีประโยชน์เมื่อเก็บสตริงขนาดใหญ่โดยแยกเป็นหน่วยสตริงย่อยขนาดเล็ก
- สามารถค้นหาได้อย่างมีประสิทธิภาพว่าดัชนีหนึ่ง ๆ อยู่ในสตริงย่อยส่วนใด
- ใช้ วิธีจัดเก็บแบบบีบอัด เพื่อลดการใช้หน่วยความจำ พร้อมทั้งยังค้นหาได้รวดเร็ว
- ไลบรารี Rust
vers: ให้ประสิทธิภาพสูงและมี overhead ต่ำมาก
sucds: รองรับ implementation แบบ sparse เช่น SArray
vers เด่นด้าน การสร้างโครงสร้างข้อมูลอย่างมีประสิทธิภาพ และมีแผนจะรองรับ implementation แบบ sparse ในอนาคต
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
- ใช้งานไลบรารี
fm-index ได้
- เดิมใช้
fid แต่หลังย้ายไป vers แล้วประสิทธิภาพดีขึ้น
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