为Web服务器设计数据结构以存储访问页面的历史记录

时间:2011-06-13 19:40:09

标签: algorithm data-structures

服务器必须维护最近n天的数据。它必须首先显示当前访问量最多的页面,然后显示第二天访问量最大的页面,依此类推。

我正在思考哈希映射的哈希映射。有什么建议吗?

4 个答案:

答案 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的指针/索引/引用。但请注意,保持这一点可能会变得有些不重要。