โซลูชันที่ใช้ Hashtable
ไม่แน่ใจว่าทำไม hashtable สร้างความซับซ้อน Ω (n2) ถ้า nคือจำนวนอักขระ (ไม่ใช่คำ)
หากคุณวนซ้ำทุกตัวละครในเอกสารและในขณะที่คุณกำลังวนซ้ำคำนวณรหัสแฮชโค้ดของคำคุณจะต้องผ่าน nตัวละคร นั่นคือทันทีที่พบจดหมายคำนั้นจะเริ่มขึ้นดังนั้นให้เริ่มคำนวณแฮชจนกว่าคำจะจบลง (มีบางกรณีพิเศษสำหรับเครื่องหมายวรรคตอน แต่สิ่งเหล่านั้นไม่ส่งผลกระทบต่อความซับซ้อน) สำหรับทุกคำเมื่อคำนวณ hash แล้วให้เพิ่มลงใน hashtable นี่คือการหลีกเลี่ยงการไปทุกคำสองครั้งคือก่อนอื่นให้วนซ้ำผ่านเอกสารเพื่อค้นหาคำแล้วใส่คำเหล่านั้นลงใน hashtable แม้ว่าความซับซ้อนในกรณีนั้นก็อาจจะเป็นΩ ( n ).
การชนใน hashtable นั้นเป็นปัญหาแน่นอนและขึ้นอยู่กับว่า hashtable ดั้งเดิมนั้นใหญ่ขนาดไหนและอัลกอริธึมการแฮชดีแค่ไหน O ( 1 ) สำหรับการแทรกและรักษาจำนวนและทำให้ O ( n )สำหรับอัลกอริทึมแม้ว่าจะมีหน่วยความจำ อย่างไรก็ตามฉันยังคงไม่สามารถชื่นชมได้ว่ากรณีที่เลวร้ายที่สุดสามารถยืนยันได้อย่างไรโอ(n2) ถ้า n คือจำนวนตัวอักษร
สมมติฐานคืออัลกอริทึมการแปลงแป้นพิมพ์เป็นเส้นตรงเวลาตามจำนวนตัวอักษร
วิธีการจัดเรียงตาม Radix
อีกทางหนึ่งคือสมมติว่าภาษาอังกฤษเนื่องจากความยาวของคำศัพท์เป็นที่รู้จักกันดีฉันจึงควรสร้างกริดและใช้การเรียงลำดับแบบ Radix ซึ่งเป็น O ( k N) ที่ไหน k จะเป็นความยาวสูงสุดของคำในภาษาอังกฤษและ ยังไม่มีข้อความคือจำนวนคำทั้งหมด ป.ร. ให้ไว้n คือจำนวนอักขระในเอกสารและ k เป็นค่าคงที่, ไม่ต้องบอกจำนวนเงินนี้ O ( n ).
ตอนนี้นับความถี่ของแต่ละคำ เนื่องจากมีการเรียงคำเราจะเปรียบเทียบแต่ละคำกับคำก่อนหน้าเพื่อดูว่าเป็นคำเดียวกันหรือต่างกัน หากเป็นเช่นนั้นเราจะลบคำนั้นและเพิ่มจำนวนลงในคำก่อนหน้า หากแตกต่างกันให้นับ 1 และเดินหน้าต่อไป สิ่งนี้ต้องมี2 n เปรียบเทียบที่ไหน n คือจำนวนตัวอักษรและดังนั้น O ( n ) ในความซับซ้อนโดยรวม
คำที่ยาวที่สุดสองสามอันดับแรกในภาษาอังกฤษนั้นมีความยาวน่าขันแต่ก็สามารถเพิ่มความยาวของคำด้วยจำนวนที่เหมาะสม (เช่น 30 หรือน้อยกว่า) และตัดคำที่ยอมรับขอบเขตของข้อผิดพลาดที่อาจมาพร้อมกับมัน