Girdi: Pozitif bir tam sayı K ve büyük bir metin. Metin aslında kelime dizisi olarak görülebilir. Dolayısıyla, onu kelime dizisine nasıl ayıracağımız konusunda endişelenmemize gerek yok.
Çıktı: Metinde en sık kullanılan K kelime.
Benim düşüncem böyledir.
Tüm kelime dizisini dolaşırken tüm kelimelerin sıklığını kaydetmek için bir Karma tablosu kullanın. Bu aşamada anahtar "kelime" ve değer "kelime frekansı" dır. Bu O (n) süresi alır.
(kelime, kelime frekansı) çiftini sıralayın; ve anahtar "kelime frekansı" dır. Bu, normal sıralama algoritması ile O (n * lg (n)) süresi alır.
Sıraladıktan sonra ilk K kelimeyi alıyoruz. Bu O (K) süresi alır.
Özetlemek gerekirse, toplam süre O (n + n lg (n) + K) , K kesinlikle N'den daha küçük olduğu için aslında O (n lg (n)) dir.
Bunu geliştirebiliriz. Aslında, sadece en iyi K kelimeleri istiyoruz. Diğer kelimelerin frekansı bizi ilgilendirmez. Bu nedenle, "kısmi Yığın sıralama" kullanabiliriz. Adım 2) ve 3) için, sadece sıralama yapmıyoruz. Bunun yerine, onu
2 ') anahtar olarak "kelime frekansı" ile bir yığın (kelime, kelime frekansı) çifti oluşturun. Bir yığın oluşturmak O (n) zaman alır;
3 ') yığından en iyi K kelimeyi çıkarın. Her bir ekstraksiyon O (lg (n)) 'dir. Yani, toplam süre O (k * lg (n)).
Özetlemek gerekirse, bu çözümün maliyeti O (n + k * lg (n)).
Bu sadece benim düşüncem. 1. adımı iyileştirmenin bir yolunu bulamadım).
Umarım bazı Bilgi Erişim uzmanları bu soruya daha fazla ışık tutabilirler.