Лучший алгоритм для задачи сравнения дат - PullRequest
0 голосов
/ 10 ноября 2011

Хотелось бы, чтобы это сравнение было быстрее (пример ниже). Образец принимает каждое значение в массиве, присоединяет час к переменной сравнения. Если нет подходящего значения, оно добавляет значение во второй массив (который объединяется позже).

 if (ticks.TypeOf  == Period.Hour)
   while (compareAt <= endAt)
   {
      if (range.Where(d => d.time.AddMinutes(-d.time.Minute) == compareAt).Count() < 1)
         gaps.Add(new SomeValue() {
             ...some dummy values..  });

      compareAt = compareAt.AddTicks(ticks.Ticks);
   }

Это выполнение слишком трудоемко, когда пришло то есть часы. В этом массиве максимум 100 * значений. В будущем будут также минуты / секунды в месяц 60*24*31=44640, что означает непригодно .

Если массив чаще всего был полным (что означает отсутствие пробелов / пустых слотов), его можно легко обойти с помощью if (range.Count() == (hours/day * days)). Однако сегодня этот день не будет.

Как бы я решил это более эффективно?

Один пример: если в массиве 7800 значений, мы пропускаем около 950, верно? Но могу ли я найти только пропуски-окончания и просто создать пропущенные значения? Это сделало бы о-нотацию зависимой от количества пробелов, а не от количества значений.

Еще один приветственный ответ - это просто более эффективный цикл.

[Изменить] Извините за плохой английский, я стараюсь изо всех сил описать.

1 Ответ

0 голосов
/ 14 августа 2012

Ваша производительность низка, потому что поиск диапазона не использует индексирование и каждый раз перепроверяет весь диапазон.

Один способ сделать это намного быстрее;

    if (ticks.TypeOf == Period.Hour)
    {
        // fill a hashset with the range's unique hourly values 
        var rangehs = new HashSet<DateTime>();
        foreach (var r in range)
        {
            rangehs.Add(r.time.AddMinutes(-r.time.Minute));
        }

        // walk all the hours
        while (compareAt <= endAt)
        {
            // quickly check if it's a gap
            if (!rangehs.Contains(compareAt))
                gaps.Add(new SomeValue() {     ...some dummy values..});

            compareAt = compareAt.AddTicks(ticks.Ticks);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...