如何解决设计用于Web服务器的数据结构,以存储访问过的页面的历史
|| 服务器必须将数据保留最近的n天。它必须首先显示当天的访问量最大的页面,然后显示第二天的访问量最大的页面,依此类推。 我在考虑哈希图的哈希图。有什么建议么 ?解决方法
具有日期类型的键和值的哈希表的外部哈希图。
内部哈希图,其键类型为包含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);
}
}
, 您可以为具有以下类型的意愿的每一天保留一个哈希:
和长度为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.
};
, 我们可以结合使用Stack&Hash Map。
我们可以创建一个URL和时间戳的对象,然后将其压入堆栈。
最近访问的网址将位于顶部。
我们可以将时间戳记与URL结合使用以创建密钥,该密钥映射到已访问Urls的计数。
为了按时间顺序显示访问量最大的页面,我们可以弹出堆栈,创建键并获取与网址相关的计数。在显示时对它们进行排序。
时间复杂度:O(n)+排序时间(取决于访问的页面数)
, 这取决于您想要什么。例如,您要存储历史记录中页面的实际数据还是仅存储URL?如果有人访问过两次页面,该页面是否应在历史记录中显示两次?
如果您要存储页面的数据并且希望每个页面仅显示一次,则哈希映射将是合适的。
如果,如我认为更可能的那样,如果您只想存储URL,但是如果每次访问都多次,则希望将它们存储多次,那么数组/向量可能更有意义。如果您希望看到很多(相对)长URL重复,则可以创建一组URL,并为每次访问存储某种指向该URL的指针/索引/引用。但是请注意,保持这一点可能变得不平凡。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。