服务器必须维护最近n天的数据。它必须首先显示当前访问量最多的页面,然后显示第二天访问量最大的页面,依此类推。
我正在思考哈希映射的哈希映射。有什么建议吗?
答案 0 :(得分:4)
外部哈希映射,键入类型为日期,类型为哈希映射。
内部哈希映射,其键为string类型,包含url,int类型包含访问次数。
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);
}
}
答案 1 :(得分: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.
};
答案 2 :(得分:1)
我们可以将Stack&amp;哈希地图。
我们可以创建一个URL和时间戳对象,然后将其推送到堆栈。 最近访问过的Url将位于顶部。
我们可以使用时间戳和URL结合来创建一个键,该键映射到访问过的URL的数量。
为了按时间顺序显示访问量最大的页面,我们可以弹出堆栈,创建密钥并获取与Url关联的计数。在显示时对它们进行排序。
时间复杂度:O(n)+排序时间(取决于访问的页数)
答案 3 :(得分:0)
这取决于你想要什么。例如,您是要存储历史记录中页面的实际数据,还是只存储URL?如果有人访问了两次页面,它应该在历史记录中出现两次吗?
如果您想存储页面的数据,并希望每个页面只显示一次,那么哈希映射将是合适的。
如果我考虑更有可能,你想要只存储URL,但是如果多次访问它们需要多次存储,那么数组/向量可能会更有意义。如果您希望看到大量(相对)长URL的重复,您可以创建一组URL,并且对于每个访问存储某种指向所讨论的URL的指针/索引/引用。但请注意,保持这一点可能会变得有些不重要。