В настоящее время я ищу соответствующие структуры данных 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. Пожалуйста, не ограничивайтесь моим предложением, вы можете предложить что-то совершенно другое .