2015-03-03 48 views
0

我最近在接受採訪時被問到。應用程序正在讀取來自現場饋送的報價和交易量, E.g. AAPL 1000,TWTR 500,MSFT 500,AAPL 500 ... 所以,AAPL總量= 1500等等。 我必須將它們讀入一個集合中,並返回數量最多的5個。閱讀收集和檢索前5 5

我曾建議在存儲時使用哈希映射,然後對Treemap進行排序或使用。 任何其他更有效的方式?

回答

0

假設股票代碼和交易量一起存儲在某個類TickerAndTradeVolume的實例中,則可以引用包含在多個數據結構中的對象。

所以一個哈希映射可能有ticker symbol作爲key和tickerAndTradeVolume作爲value。然後,對TickerAndTradeVolume實例的引用也可以存儲在優先級隊列中。每次卷更新時,實例都會重新插入到PQ中。

按卷數量排名前n總是以log(n)攤銷時間複雜度的形式提供,以保持貿易量的優先級,這比通過Treemap一次次排序的速度更快。

像這樣的事情

Map<String, TickerAndTradeVolume> feed; 
    PriorityQueue<TickerAndTradeVolume> pq; 

    class TickerAndTradeVolume implements Comparable<TickerAndTradeVolume> { 
     private String ticker; 
     private double volume; 

     TickerAndTradeVolume(String ticker, double volume) { 
      this.ticker = ticker; 
      this.volume = volume; 
     } 

     void increaseVolumeBy(double volume) { 
      this.volume += volume; 
     } 

     @Override 
     public int compareTo(TickerAndTradeVolume that) { 
      return (int) (that.volume - this.volume); 
     } 

     @Override 
     public boolean equals(Object obj) { 
      if (this == obj) { 
       return true; 
      } 
      if(obj instanceof String) { 
       TickerAndTradeVolume that = (TickerAndTradeVolume) obj; 
       return this.ticker.equals(that.ticker); 
      } 
      return false; 
     } 
    } 

    void addOrUpdateStockVolume(TickerAndTradeVolume tt) { 
     if(!feed.containsKey(tt.ticker)) { 
      feed.put(tt.ticker, tt); 
      pq.add(tt); 
     } 
     else { 
      feed.get(tt.ticker).increaseVolumeBy(tt.volume); 
      // take out and put back in to trigger heap operations 
      pq.remove(feed.get(tt.ticker)); 
      pq.add(feed.get(tt.ticker)); 
     } 
    } 

    List<TickerAndTradeVolume> getTopMaxFive() { 
     List<TickerAndTradeVolume> topFive = new ArrayList<TickerAndTradeVolume>(5); 
     int pqSize = pq.size(); 
     for(int i = 0; i < 5 && i < pqSize; i++) { 
      // poll() takes from the top of the heap 
      topFive.add(pq.poll()); 
     } 
     for(TickerAndTradeVolume tt : topFive) { 
      // put back what we took out 
      pq.add(tt); 
     } 
     return topFive; 
    } 
+0

謝謝,我想實現這一點。所以,要開始我將有一個hashmap 來存儲股票和股票。我如何將這些引用存儲在優先級隊列中?一個簡短的僞代碼會有所幫助。 – 2015-03-12 02:19:27

+0

存儲在優先級隊列中的類型必須具有可比性。在這種情況下,僅將音量存儲爲雙倍是不夠的。股票信息也必須存儲。我們可以使用一個類來封裝代號和交易量的概念。 – chiaboy 2015-03-15 05:01:17

+0

我編輯了我的答案來添加一些示例代碼。顯然,隨着存儲代碼數量的增長,性能差異越來越顯着。這也與必須對所有n個條目進行排序相比,總是從堆中拉出前五名。 – chiaboy 2015-03-15 05:13:00