2011-06-13 25 views

回答

4

帶有鍵入日期和鍵入哈希映射值的鍵的外部哈希映射。

帶有鍵入字符串的鍵的內部哈希映射,其中包含包含訪問計數的int類型的url和值。

實例C#:

// Outer hash map  
var visitsByDay = 
    new Dictionary<DateTime, VisitsByUrl>(currentDate, new VisitsByUrl()); 

... 

// inner hash map 
public class VisitsByUrl 
{ 
    public Dictionary<string, int> Urls { get; set; } 

    public VisitsByUrl() 
    { 
     Urls = new Dictionary<string, int>(); 
    } 

    public void Add(string url) 
    { 
     if (Urls[url] != null) 
      Urls[url] += 1; 
     else 
      Urls.Add(url, 1); 
    } 
} 
+0

我也在同一個方向思考。這聽起來像一個有效的解決方案感謝您的幫助! – Karthik 2011-06-13 20:44:21

+0

非常歡迎! – 2011-06-13 20:50:14

+1

這反思了Karthik的期望,而沒有考慮他陳述的功能要求 - 只有一個,而且不太現實,但是:「它必須先顯示當天訪問量最大的頁面,然後顯示第二天訪問量最大的頁面,上」。散列圖不會被排序,並且您的URL被鎖定在URL上 - 您將如何找到訪問量最大的頁面?蠻力迭代,對於哈希映射通常比矢量迭代慢。哈希映射允許快速的日內更新,但是爲什麼當N的數組/矢量更好地壓縮並更快時使用外部哈希映射? – 2011-06-15 02:08:05

0

這取決於你想要什麼。例如,是否要將歷史頁面的實際數據存儲在歷史記錄中,還是隻保存網址?如果有人訪問過兩次頁面,是否應該在歷史記錄中顯示兩次?

如果您希望存儲頁面的數據並希望每個頁面只顯示一次,則散列映射圖將非常適合。

如果我認爲更可能的是,你只想存儲URL,但是如果每次存儲多次,如果它被多次訪問,數組/矢量可能會更有意義。如果您期望看到很多(相對)較長的URL重複,則可以創建一組URL,並且每次訪問都會存儲某種指向該URL的指針/索引/引用。但是請注意,保持這一點可能會變得有點不重要。

2

你可以保持一個散列具有類型會在每一天: -

和長度爲n的隊列中。每天都會有這些哈希值。你也將存儲單獨散列totalHits這將總結所有這些

Class Stats { 
     queue< hash<url,hits> > completeStats; 
     hash<url,hits> totalStats; 
    public:- 
     int getNoOfTodayHits(url) { 
      return completeStats[n-1][url]; 
     } 
     int getTotalStats(url) { 
      return totalStats[url]; 
     } 
     void addAnotherDay() { 
     // before popping check if the length is n or not :) 
     hash<url,hits> lastStats = completeStats.pop(); 
     hash<url,hits> todayStats; 
     completeStats.push_back(todayStats); 
      // traverse through lastStats and decrease the value from total stats; 
     } 
     // etc. 

}; 
+0

有趣的解決方案,非常好。謝謝。您選擇使用散列表隊列而不是散列散列表。你選擇這個的任何特定原因?我想當你搜索統計數據時,你將不得不掃描整個隊列。你的思維流程是什麼? – Karthik 2011-06-19 19:35:23

+0

我不需要處理哈希中的鍵的日期:) Pop Push工程:P – MarutiB 2011-06-21 08:06:28

1

我們可以堆棧&哈希表的組合。

我們可以創建一個URL和時間戳對象,然後將其推送到堆棧。 最近訪問的網址將位於頂部。

我們可以使用結合URL的時間戳創建一個關鍵字,該關鍵字映射到已訪問的Url的數量。

爲了按時間順序顯示訪問最多的頁面,我們可以彈出堆棧,創建一個鍵並獲取與Url關聯的計數。在顯示時對它們排序。

時間複雜度:O(n)+排序時間(取決於訪問頁數)

相關問題