2010-11-10 40 views
2

假設我有一個TreeMap<String, Treeset<Song>>,其中對象Song有三個字符串字段和一個內部CompareTo方法。地圖的鍵是歌詞中的獨特單詞,不是常用單詞,如「她」,「the」,「if」或「on」。在地圖上有多個歌曲副本,因爲平均有60個單詞映射到單個歌曲。查找地圖中的前十個值

對於額外的學分,教授要求我們提出一個算法來找到地圖中的前10個值。我沒有及時解決問題,這就是我在這裏問的原因。

我難以忍受的部分是,與有序數組或列表不同,您不能只依次獲取最高值。於是,我想到了:

Create a PriorityQueue<Node> with the Comparator sorting the Nodes based 
on the Set size 

iterate over the map 
    for each map node 
    create a Node object with the key-value pair 
    insert Node into the queue 

即使時Queue將結束所有的鍵值對,頂的大小將在上面,我可以檢索前十。

這似乎是一個非常迂迴的方式,因爲這個特定的地圖有31,000多個節點映射到超過637,000個值。有沒有更好的辦法?

+0

原來這個算法在O(N)時間內效果很好,這是由於數據集上的順序循環造成的。此部分的總執行時間爲45毫秒。 – Jason 2010-11-10 02:15:34

回答

0

我不確定你想要按鍵的前10位,在這種情況下,Soldier.moth是正確的,你可以專門獲取調用descendingMap的遞減視圖,然後迭代前10個元素。但是如果你想通過其他關係獲得前10名,只需遍歷elementSet並將當前前10名存儲在排序後的數據結構中,如TreeSet根據大小指定比較器 - 不確定你的意思是什麼大小,但你可能知道 - - 如果每個元素小於當前值,則替換10中最小的元素。你獲得的最小與firstKey

1

你的算法的簡單修改:

Create a PriorityQueue<Node> with the Comparator sorting the Nodes based 
on the Set size 

iterate over the map 
    for each map node 
    if value for node is larger than last entry in priority queue 
     create a Node object with the key-value pair 
     insert Node into the queue 
     trim the queue to ten entries 

在完成時,優先級隊列將只包含前10項。

+0

我沒有做額外的測試,因爲節點內已經有一個比較方法用於在PriorityQueue中進行排序。此外,該算法對於運行時並不算太壞,因爲我設法將其計算到O(N)時間,並且總執行時間低於45毫秒。 – Jason 2010-11-10 02:14:08

+0

比較測試是將優先級隊列中的項目數保持爲10或更少,並停止構建不會進入前十名的節點對象。但是,在嘗試進行任何優化之前,您是正確的衡量性能 - 否則您不會知道優化的有效性。 – Jason 2010-11-11 00:31:40