อินพุต: จำนวนเต็มบวก K และข้อความขนาดใหญ่ ข้อความสามารถดูเป็นลำดับคำได้ เราจึงไม่ต้องกังวลว่าจะแยกย่อยออกเป็นลำดับคำอย่างไร
ผลลัพธ์: คำ K ที่ใช้บ่อยที่สุดในข้อความ
ความคิดของฉันเป็นแบบนี้
ใช้ตารางแฮชเพื่อบันทึกความถี่ของคำทั้งหมดในขณะที่สำรวจลำดับคำทั้งหมด ในขั้นตอนนี้คีย์คือ "word" และค่าคือ "word-frequency" ใช้เวลา O (n)
เรียงคู่ (word, word-frequency); และที่สำคัญคือ "ความถี่ของคำ" สิ่งนี้ใช้เวลา O (n * lg (n)) ด้วยอัลกอริทึมการเรียงลำดับปกติ
หลังจากจัดเรียงแล้วเราก็ใช้คำ K แรก ใช้เวลา O (K)
สรุปได้ว่าเวลาทั้งหมดคือ O (n + n lg (n) + K), เนื่องจาก K มีขนาดเล็กกว่า N อย่างแน่นอนดังนั้นจึงเป็น O (n lg (n))
เราสามารถปรับปรุงสิ่งนี้ได้ จริงๆแล้วเราต้องการแค่คำ K อันดับต้น ๆ ความถี่ของคำอื่นไม่น่ากังวลสำหรับเรา ดังนั้นเราจึงสามารถใช้ "การเรียงลำดับฮีปบางส่วน" สำหรับขั้นตอนที่ 2) และ 3) เราไม่เพียงทำการเรียงลำดับ แต่เราเปลี่ยนเป็น
2 ') สร้างกองของ (word, word-frequency) โดยมี "word-frequency" เป็นคีย์ ต้องใช้เวลา O (n) ในการสร้างกอง
3 ') แยกคำ K ยอดนิยมออกจากกอง การสกัดแต่ละครั้งคือ O (lg (n)) ดังนั้นเวลาทั้งหมดคือ O (k * lg (n))
สรุปได้ว่าโซลูชันนี้ใช้เวลา O (n + k * lg (n))
นี่เป็นเพียงความคิดของฉัน ฉันยังไม่พบวิธีปรับปรุงขั้นตอนที่ 1)
ฉันหวังว่าผู้เชี่ยวชาญด้านการดึงข้อมูลบางคนสามารถให้ความกระจ่างเกี่ยวกับคำถามนี้ได้มากขึ้น