Разработка структуры данных для веб-сервера для хранения истории посещенных страниц - PullRequest
7 голосов
/ 13 июня 2011

Сервер должен хранить данные за последние n дней.Сначала должны отображаться самые посещаемые страницы текущего дня, а затем наиболее посещаемые страницы следующего дня и т. Д.

Я думаю о том, как хэш-карта хеш-карт.Есть предложения?

Ответы [ 4 ]

4 голосов
/ 13 июня 2011

Внешняя хеш-карта с ключом даты типа и значением хеш-карты типа.

Внутренняя карта хеша с ключом типа 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);
    }
}
2 голосов
/ 18 июня 2011

Вы можете хранить хэш для каждого дня, который имеет тип: -

И очередь длиной 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.

};
1 голос
/ 29 мая 2012

У нас может быть комбинация Stack & Hash Map.

Мы можем создать объект URL и метку времени, а затем поместить его в стек. Самый последний посещенный URL будет на вершине.

Мы можем использовать временную метку в сочетании с URL для создания ключа, который сопоставляется с количеством посещенных URL-адресов.

Для отображения наиболее посещаемых страниц в хронологическом порядке мы можем вытолкнуть стопку, создать ключ и получить счетчик, связанный с URL-адресом. Сортируйте их при отображении.

Сложность времени: O (n) + Время сортировки (зависит от количества посещенных страниц)

0 голосов
/ 13 июня 2011

Это зависит от того, что вы хотите. Например, вы хотите сохранить фактические данные для страниц в истории или только URL? Если кто-то дважды заходил на страницу, должна ли она дважды появляться в истории?

Хеш-карта подойдет, если вы хотите сохранить данные для страницы и хотите, чтобы каждая страница отображалась только один раз.

Если, как я считаю более вероятным, вы хотите хранить только URL-адреса, но хотите, чтобы каждый сохранялся несколько раз, если его посетили более одного раза, массив / вектор, вероятно, будет иметь больше смысла. Если вы ожидаете увидеть много дублирующихся (относительно) длинных URL-адресов, вы можете создать набор URL-адресов, и для каждого посещения сохраните своего рода указатель / индекс / ссылку на рассматриваемый URL-адрес. Обратите внимание, однако, что поддержание этого может стать несколько нетривиальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...