服務器必須維護最近n天的數據。它必須首先顯示當天訪問量最大的頁面,然後顯示次日訪問量最大的頁面等等。爲Web服務器設計一個數據結構來存儲訪問頁面的歷史記錄
我正在考慮哈希映射的哈希映射。有什麼建議麼 ?
服務器必須維護最近n天的數據。它必須首先顯示當天訪問量最大的頁面,然後顯示次日訪問量最大的頁面等等。爲Web服務器設計一個數據結構來存儲訪問頁面的歷史記錄
我正在考慮哈希映射的哈希映射。有什麼建議麼 ?
帶有鍵入日期和鍵入哈希映射值的鍵的外部哈希映射。
帶有鍵入字符串的鍵的內部哈希映射,其中包含包含訪問計數的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);
}
}
這取決於你想要什麼。例如,是否要將歷史頁面的實際數據存儲在歷史記錄中,還是隻保存網址?如果有人訪問過兩次頁面,是否應該在歷史記錄中顯示兩次?
如果您希望存儲頁面的數據並希望每個頁面只顯示一次,則散列映射圖將非常適合。
如果我認爲更可能的是,你只想存儲URL,但是如果每次存儲多次,如果它被多次訪問,數組/矢量可能會更有意義。如果您期望看到很多(相對)較長的URL重複,則可以創建一組URL,並且每次訪問都會存儲某種指向該URL的指針/索引/引用。但是請注意,保持這一點可能會變得有點不重要。
你可以保持一個散列具有類型會在每一天: -
和長度爲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.
};
我們可以堆棧&哈希表的組合。
我們可以創建一個URL和時間戳對象,然後將其推送到堆棧。 最近訪問的網址將位於頂部。
我們可以使用結合URL的時間戳創建一個關鍵字,該關鍵字映射到已訪問的Url的數量。
爲了按時間順序顯示訪問最多的頁面,我們可以彈出堆棧,創建一個鍵並獲取與Url關聯的計數。在顯示時對它們排序。
時間複雜度:O(n)+排序時間(取決於訪問頁數)
我也在同一個方向思考。這聽起來像一個有效的解決方案感謝您的幫助! – Karthik 2011-06-13 20:44:21
非常歡迎! – 2011-06-13 20:50:14
這反思了Karthik的期望,而沒有考慮他陳述的功能要求 - 只有一個,而且不太現實,但是:「它必須先顯示當天訪問量最大的頁面,然後顯示第二天訪問量最大的頁面,上」。散列圖不會被排序,並且您的URL被鎖定在URL上 - 您將如何找到訪問量最大的頁面?蠻力迭代,對於哈希映射通常比矢量迭代慢。哈希映射允許快速的日內更新,但是爲什麼當N的數組/矢量更好地壓縮並更快時使用外部哈希映射? – 2011-06-15 02:08:05