นี่คือข้อความยาว กรุณาทนกับฉัน ต้มคำถามก็คือ: มีอัลกอริทึมการเรียงลำดับ Radix แบบทำงานได้หรือไม่?
เบื้องต้น
ฉันมีสตริงความยาวคงที่ขนาดเล็กจำนวนมากที่ใช้เฉพาะตัวอักษร“ A”,“ C”,“ G” และ“ T” (ใช่คุณเดาได้แล้วว่า: DNA ) ที่ฉันต้องการเรียงลำดับ
ในขณะที่ผมใช้std::sort
ซึ่งใช้introsortในการใช้งานร่วมกันทั้งหมดของSTL ใช้งานได้ค่อนข้างดี อย่างไรก็ตามฉันเชื่อมั่นว่าการเรียงตัวของ Radix ตรงกับปัญหาที่ฉันตั้งไว้อย่างสมบูรณ์แบบและควรทำงานได้ดีขึ้นมากในทางปฏิบัติ
รายละเอียด
ฉันได้ทดสอบสมมติฐานนี้ด้วยการใช้งานที่ไร้เดียงสามากและสำหรับอินพุตที่ค่อนข้างเล็ก (ตามลำดับ 10,000) นี่เป็นจริง (ดีอย่างน้อยก็เร็วกว่าสองเท่า) อย่างไรก็ตามรันไทม์จะลดลงอย่างมากเมื่อขนาดของปัญหาใหญ่ขึ้น ( N > 5,000,000)
เหตุผลชัดเจน: การเรียง radix ต้องคัดลอกข้อมูลทั้งหมด (มากกว่าหนึ่งครั้งในการใช้งานไร้เดียงสาของฉันจริง) ซึ่งหมายความว่าฉันได้ใส่ ~ 4 GiB ลงในหน่วยความจำหลักซึ่งฆ่าได้อย่างชัดเจน แม้ว่ามันจะไม่เป็นเช่นนั้นก็ตามฉันก็ไม่สามารถใช้หน่วยความจำนี้ได้มากขนาดของปัญหาจะใหญ่ขึ้น
ใช้เคส
อัลกอริทึมนี้ควรทำงานกับความยาวสตริงใด ๆ ระหว่าง 2 ถึง 100 สำหรับ DNA และ DNA5 (ซึ่งอนุญาตให้ใช้อักขระตัวแทนเพิ่มเติม“ N”) หรือแม้แต่ DNA ที่มีรหัสความคลุมเครือIUPAC (ทำให้มีค่า 16 ค่าที่แตกต่างกัน) อย่างไรก็ตามฉันตระหนักว่ากรณีเหล่านี้ไม่สามารถครอบคลุมได้ดังนั้นฉันจึงมีความสุขกับการปรับปรุงความเร็วที่ฉันได้รับ รหัสสามารถตัดสินใจแบบไดนามิกอัลกอริทึมที่จะส่งไป
วิจัย
น่าเสียดายที่บทความ Wikipedia เกี่ยวกับการเรียงตัวของ Radixไม่มีประโยชน์ ส่วนเกี่ยวกับตัวแปรในสถานที่เป็นขยะสมบูรณ์ ส่วนNIST-DADS ในการจัดเรียงแบบ Radixอยู่ถัดจากไม่มีอยู่ มีกระดาษที่มีแนวโน้มที่เรียกว่าการเรียงลำดับ Radix แบบปรับตัวได้อย่างมีประสิทธิภาพซึ่งอธิบายอัลกอริทึม“ MSL” น่าเสียดายที่กระดาษนี้ก็น่าผิดหวังเช่นกัน
โดยเฉพาะอย่างยิ่งมีสิ่งต่าง ๆ ดังต่อไปนี้
ขั้นแรกอัลกอริทึมมีข้อผิดพลาดหลายประการ โดยเฉพาะอย่างยิ่งมันไม่ได้รายละเอียดการเรียกซ้ำ (ฉันเพียงแค่คิดว่ามันจะเพิ่มหรือลดตัวชี้บางอย่างเพื่อคำนวณค่ากะและหน้ากากในปัจจุบัน) นอกจากนี้ยังใช้ฟังก์ชั่นdest_group
และdest_address
ไม่ได้ให้คำจำกัดความ ฉันล้มเหลวในการดูวิธีการใช้สิ่งเหล่านี้อย่างมีประสิทธิภาพ (นั่นคือใน O (1); อย่างน้อยdest_address
ก็ไม่สำคัญเลย)
ขั้นตอนสุดท้าย แต่ไม่ท้ายสุดอัลกอริทึมจะได้รับการตอบสนองแบบ in-place-ness โดยการสลับดัชนีอาเรย์กับองค์ประกอบภายในอาเรย์อินพุต เห็นได้ชัดว่าใช้งานได้กับอาร์เรย์ตัวเลขเท่านั้น ฉันต้องใช้มันกับสตริง แน่นอนฉันสามารถสกรูการพิมพ์ที่แข็งแกร่งและไปข้างหน้าสมมติว่าหน่วยความจำจะทนต่อการจัดเก็บดัชนีที่มันไม่ได้เป็นของฉัน แต่วิธีนี้จะใช้ได้ตราบใดที่ฉันสามารถบีบสตริงของฉันลงในหน่วยความจำ 32 บิต (สมมติว่าเป็นจำนวนเต็ม 32 บิต) นั่นเป็นเพียง 16 ตัวอักษร (อย่าเพิกเฉยกับช่วงเวลานั้น> 16 บันทึก (5,000,000))
กระดาษอื่นโดยผู้เขียนคนหนึ่งไม่ได้ให้คำอธิบายที่ถูกต้องเลย แต่มันก็ให้ MSL ของ runtime เป็น sub-linear ซึ่งเรียบผิด
ในการสรุป : มีความหวังในการค้นหาการนำการอ้างอิงไปใช้งานหรืออย่างน้อยรหัสเทียม / คำอธิบายที่ดีของการเรียงลำดับแบบฝังในที่ทำงานที่ทำงานบนสาย DNA หรือไม่?