Структура данных для повторяющихся событий в календаре - PullRequest
0 голосов
/ 31 октября 2018

В настоящее время я ищу соответствующие структуры данных C для моделирования календаря, в котором у меня могут быть периодические события, как в календаре Google.

Я что-то смоделировал и хочу спросить, о чем вы думаете, и есть ли лучший (во времени? В пространстве?) Способ сделать это.

Это спецификация моей проблемы (проще, чем Google Calendar):

  • событие - это интервал [время1, время2]
  • событие может быть периодическим или нет. Периодическое событие повторяется в течение нескольких выбранных дней.
  • можно удалить вхождение периодического события без изменения других вхождений (например, для события, которое происходит в 2018-10-31, 2018-11-01 и 2018-11-02, я могу удалить только наступление 2018-11-01)

Моя первая идея - сохранить дни в дереве AVL, в котором каждый узел (т. Е. Каждый день) содержит список событий (интервалы времени).

# include<stdio.h>
# include<stdlib.h>

typedef struct STTime {
    int ssec;
    int mmin;
    int hhour;
} TTime;

typedef struct SDDate {
    int dday;
    int mmonth;
    int yyear;
} DDate;

typedef struct SEvent {
    TTime startTime;
    TTime endTime;
    struct SEvent *nextEvent;
} Event;

/* A node of my AVL tree. It contains a calendar day and the list of the event in that day */
typedef struct Node
{
 DDate ddate;
 Event *anEvent;
 struct  Node *left; /* left (contains days before the current node date) */
 struct  Node *right;  /* right (contains days after the current node date) */
} CalDay;

CalDay *calendar;

При этом я думаю, что сложность операций, которые меня интересуют, заключается в следующем:

  • Вставка непериодического события : Найдите правильный день в дереве и добавьте событие в начало списка событий. Если дней не существует, добавьте день и событие в этот день. Стоимость в худшем случае O (log (n)).
  • Вставка периодического события : Найдите каждый день вхождения и добавьте событие. Стоимость O (mlog (n)), м количество повторений
  • Удаление вхождения периодического события . Найдите соответствующий день, просмотрите список событий и удалите событие: O (log (n) + m), m - максимальное количество событий в день
  • Отображение события данного дня . Посмотрите на день, просмотрите события: O (log (n) + m), которое O (m), я думаю

Заранее благодарим за ценные комментарии.

Ps. Пожалуйста, не ограничивайтесь моим предложением, вы можете предложить что-то совершенно другое .

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