Arhn - архитектура программирования

Разрывы в тренировках между несколькими датами записи

Я пытаюсь создать механизм, который требует, чтобы пользователь вводил то, что он делал последние пять лет.

  • Диапазон дат должен быть охвачен (дата начала 01.08.2009 - дата окончания 01.08.2014)
  • Допускается до десяти записей
  • Допускается перекрытие
  • Никаких пробелов не допускается

В настоящее время я упорядочиваю записи по дате начала, проверяю охват обоих диапазонов. Для промежутков между записями я сравниваю две даты одновременно, запись i и i + 1, и сравниваю дату начала более поздней даты начала с датой окончания более ранней даты начала. Мне трудно выразить это словами, но я думаю, что эта небольшая диаграмма помогает описать проблему.

START
A   x---------------------------------------y
B   x----------y
C             x--------y
D           x-----y
E                         x----------y
F                                    x----------y
                                                End

Здесь вариант E потерпит неудачу, потому что его дата начала после даты окончания D, я использую цикл while, чтобы добавить день к промежутку каждый день, когда дата начала позже даты окончания, это вызовет проверку, даже если эти даты были охватывается входом AI, я использую Java для этого, но даже помощь в тексте и псевдокоде была бы замечательной, поскольку это больше логика, с которой я потерял,

Если бы кто-нибудь мог помочь с перерывами между свиданиями, я был бы очень признателен.

09.06.2014

  • Просто сверните все записи на единую временную шкалу и используйте двоичный поиск, чтобы найти пробелы. Какое разрешение? Всего несколько дней? 1825 бит? 10.06.2014

Ответы:


1

Логика этого проста, но вы смотрите на это задом наперед.

Для каждого дня в запрошенном периоде времени, покрывается ли этот день одной из записей даты? Если вы обнаружите, что день не покрыт, то есть пробел, и вы можете прекратить проверку и отправить ошибку обратно пользователю - не продолжайте проверять дни, если вы не хотите уведомить пользователя о деталях всех выявленных вами пробелов. , просто «проваливайте раньше», как только обнаружите, что день не покрыт.

Итак, в псевдокоде ...

foreach (Day d in DateRange) {
    foreach (UserDateRange u in UserDateRanges) {
        //check if the date range (u) covers the day in question (d)
        if (d > u.Start && d < u.End) {
              //we're done checking this day because it's covered by at least one range
              covered = true;
        }
    }

    if (!covered) return false;
}

return true; //because if we got this far, every day is "covered"

Итак ... он перебирает дни и для каждого дня проверяет все диапазоны дат. Если найдется тот, который охватывает этот день, вы можете перейти к следующему дню.

Здесь есть много возможностей для оптимизации. Например, если вы найдете диапазон дат, охватывающий один день, вы можете пропустить его до конца, вам не нужно проверять остальные дни в этом диапазоне. Здесь будут работать циклы FOR со сложными условиями. Вы знаете, что можете поставить туда любое состояние, не так ли?

 for (int x = 0; covered == false; x++ ) //perfectly valid
09.06.2014
  • Жасмин, это было большим подспорьем, спасибо за подробный ответ. Я использовал не точное решение, а похожую идею, вы были правы в том, что я думал об этом задом наперед. Спасибо Марти 12.06.2014

  • 2

    Вот как я бы это сделал ... создать массив, который может содержать слияние всех временных диапазонов. Просмотрите все даты и внесите их в список. Проверьте список на предмет пробелов. Я уверен, что есть способы получше ... но для того, что вы делаете, это подойдет. Конечно, в коде удара есть ошибки ... но это отличное начало. Это все на C #, кстати.

    int startYear = 2000;
    int endYear = 2005;
    
    void Main()
    {
        int totalDays = Convert.ToInt32((new DateTime(endYear, 12, 31) - (new DateTime(startYear, 01, 01))).TotalDays);
        bool[] days = new bool[totalDays];
    
        List<Tuple<DateTime, DateTime>> times = new List<Tuple<DateTime, DateTime>>() {
            new Tuple<DateTime, DateTime>(new DateTime(2000, 01, 01), new DateTime(2000, 01, 05)),
            new Tuple<DateTime, DateTime>(new DateTime(2000, 01, 08), new DateTime(2002, 06, 15)),
            new Tuple<DateTime, DateTime>(new DateTime(2002, 06, 19), new DateTime(2005, 12, 26))
        };
    
        // Go over all blocks and add them to the days array.  This could be bit logic if you really want to save memory
        foreach(Tuple<DateTime, DateTime> block in times) {
            int startBlock = GetBlockFromDate(block.Item1);
            int endBlock = GetBlockFromDate(block.Item2);
    
            for(int blockIndex = startBlock; blockIndex < endBlock; blockIndex++) {
                days[blockIndex] = true;
            }
        }
    
        // this is the actual checking for gaps...  I chose to use a linear approach.
        for (int dayIndex = 0; dayIndex < days.Length; dayIndex++) {
            if (!days[dayIndex]) {
                DateTime missingDate = new DateTime(startYear, 1, 1).AddDays(dayIndex);
                Console.WriteLine("Missing Day: {0}", missingDate);
            }
        }
    }
    
    int GetBlockFromDate(DateTime blockDate) {
        DateTime startDate = new DateTime(startYear, 1, 1);
        int blockIndex = Convert.ToInt32((blockDate - startDate).TotalDays);
        return blockIndex;
    }
    

    Вывод:

    Missing Day: 1/5/2000 12:00:00 AM
    Missing Day: 1/6/2000 12:00:00 AM
    Missing Day: 1/7/2000 12:00:00 AM
    Missing Day: 6/15/2002 12:00:00 AM
    Missing Day: 6/16/2002 12:00:00 AM
    Missing Day: 6/17/2002 12:00:00 AM
    Missing Day: 6/18/2002 12:00:00 AM
    Missing Day: 12/26/2005 12:00:00 AM
    Missing Day: 12/27/2005 12:00:00 AM
    Missing Day: 12/28/2005 12:00:00 AM
    Missing Day: 12/29/2005 12:00:00 AM
    Missing Day: 12/30/2005 12:00:00 AM
    
    09.06.2014

    3

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

    end  = 31/12/2008
    foreach(DateRange d in ranges)
    {
       if d.end >= end
       {
         if d.start <= end + 1
           end = d.end
         else
           // Gap found (end + 1 to d.start - 1)
           //break , return error?
           // or if you wanted to identify the all the gaps, perhaps
           // gaps.add(new DateRange(end +1, d.start - 1))
           // end = d.end
       }
    }
    

    Конечно, нет необходимости добавлять по 1 дню за раз.

    09.06.2014
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..