มันเป็นที่รู้จักกันดีว่ามีขั้นตอนวิธีการที่ดีที่สุดกรณีที่เลวร้ายที่สุดในการคำนวณรหัส Huffman ในเวลา ) นี่คือการปรับปรุงในสองวิธีมุมฉาก:
รหัสฟรีที่ดีที่สุดสามารถคำนวณได้เร็วขึ้นหากชุดของความถี่ที่แตกต่างกันมีขนาดเล็ก (เช่นขนาด ): จัดเรียงความถี่โดยใช้ [Munro and Spira, 1976] เพื่อใช้ประโยชน์จากค่าเล็ก ๆ ของและคำนวณ Huffman ต้นไม้ในเวลาเชิงเส้นจากความถี่เรียง นี่เป็นวิธีแก้ปัญหาใน
มีอัลกอริทึมในการคำนวณรหัสที่เทียบเท่าโดยที่คือจำนวนความยาว codewords ที่แตกต่างกัน [Belal และ Elmasry]
เป็นผลมาจาก STACS 2006 ดูเหมือนจะผิด , Elmasry เผยแพร่บน arXiv ในปี 2010 (http://arxiv.org/abs/cs/0509015) รุ่นประกาศ -การดำเนินงานกับการป้อนข้อมูลและไม่ได้เรียงลำดับ - การดำเนินการบนอินพุตที่เรียงลำดับแล้ว
ฉันเห็นการเปรียบเทียบกับความซับซ้อนของการคำนวณลำเรือนูนซึ่งอัลกอริธึมใน (เรียงลำดับตามขณะที่อัลกอริทึมสำหรับรหัส Huffman) และใน (ของขวัญ) การห่อ) ถูกแทนที่โดยเคิร์กแพททริกและอัลกอริทึมของ Seidel ใน (ต่อมาพิสูจน์แล้วว่าเป็นอินสแตนซ์ที่ดีที่สุดกับความซับซ้อนของรูปแบบ ) ในกรณีของรหัสฟรีรหัสนำหน้าเมื่อเทียบกับแสดงถึงความเป็นไปได้ของอัลกอริทึมที่มีความซับซ้อนหรือแม้แต่โดยที่คือจำนวน codewords ยาวใช้การเปรียบเทียบขอบของตัวเรือนูนที่ครอบคลุมชี้ไปที่ความยาวของรหัสที่ครอบคลุมสัญลักษณ์
ตัวอย่างง่ายๆแสดงให้เห็นว่าการเรียงลำดับ (ปัดเศษ) ค่าลอการิทึมของความถี่ (ในเวลาเชิงเส้นในแบบจำลองคำคำแรม) ไม่ได้ให้รหัสที่ดีที่สุดฟรีในเวลาเชิงเส้น:
- สำหรับ ,และ
- ดังนั้นการเรียงลำดับไฟล์บันทึกจึงไม่เปลี่ยนลำดับ
- แต่สองโค้ดจากสามต้นทุนบิตมากกว่าดีที่สุด
อีกคำถามที่น่าสนใจคือการลดความซับซ้อนเมื่อมีขนาดใหญ่เช่นรหัสทั้งหมดมีความยาวแตกต่างกัน:
- เช่นเมื่อความถี่เป็นค่าบันทึกที่แตกต่างกันทั้งหมด ในกรณีนี้เราสามารถเรียงลำดับความถี่ในเวลาเชิงเส้นใน word RAM และคำนวณรหัส Huffman ในเวลาเชิงเส้น (เพราะการเรียงลำดับค่าบันทึกของพวกเขาเพียงพอที่จะเรียงลำดับค่า) ส่งผลให้เวลาเชิงเส้นโดยรวม ดีกว่าจากอัลกอริทึมจาก Belal และ Elmasry