У меня есть люди, и я размещаю данные как:
Человек
объект имеет
IList
, каждый из которых имеет
IList
возможных мест Расписание
дневной образец как т.е. 10 дней доступно 4 недоступно В пределах определенного диапазона дат DateRangePlaces
необходимо подчиняться шаблону Расписание
, независимо от того, может ли человек пойти в определенное место или нет.
Объект
места имеет
IList
, каждый из которых определяет время открытия / закрытия в каждом диапазоне дат Перекрывающиеся диапазоны дат работают как LIFO. Таким образом, для каждого дня, который уже был определен ранее, предпочтение отдается новому определению времени.
Теперь мне нужно сделать что-то вроде этого (в псевдокоде):
for each Place
{
for each Day between minimum and maximum date in IList<DateRangeTiming>
{
get a set of People applicable for Place and on Day
}
}
Это означает, что количество шагов для выполнения моей задачи приблизительно:
∑ (мест) (∑ (дней) × ∑ (люди) )
Насколько я понимаю, это
O (x × y x × z )
и, вероятно, приблизительно соответствует сложности этого алгоритма:
O (n 3 )
Я не специалист в теории, поэтому вы можете свободно исправлять мои предположения. Верно то, что такая сложность определенно неприемлема, особенно с учетом того факта, что я буду работать в течение длительного периода времени со многими местами и людьми.
Из аппроксимации формулы мы видим, что набор людей будет повторяться много раз. Поэтому я хотел бы оптимизировать хотя бы эту часть. Чтобы немного упростить ситуацию, я изменил
Person.IList<DateRangePlaces>.IList<Place>
на
Person.IList<DateRangePlaces>.IDictionary<int, Place>
, что дало бы мне более быстрый результат, сможет ли человек пойти в какое-то место в определенный день, потому что я бы только проверял, присутствует ли Place.Id
в словаре по сравнению с предложением IList.Where ()
LINQ, которое каждый раз будет сканировать весь список.
Не могли бы вы предложить какие-либо дополнительные оптимизации, которые я мог бы внедрить в свой алгоритм, чтобы сделать его быстрее или даже сделать его менее сложным с точки зрения большой нотации O?
Какие типы структур памяти вы бы использовали, где и почему (списки, словари, стеки, очереди ...) для повышения производительности?
Есть также дополнительные сложности, о которых я не упомянул, так как хотел упростить свой вопрос чтобы было понятнее. Так. Также есть:
Place.IList<Permission>
Person.IList<DateRangePermission>
Таким образом, места требуют определенных разрешений, а у людей есть ограниченные по времени разрешения, срок действия которых истекает.
В дополнение к этому, есть также
Person.IList<DateRangeTimingRestriction>
, который сообщает только конкретное время, когда человек может куда-то пойти в течение определенного диапазона дат. И
Person.IList<DateRangePlacePriorities>
, который определяет приоритизацию мест для определенного диапазона дат.
И во время этого процесса поиска подходящих людей я также должен рассчитать определенный коэффициент на каждого человека для каждого места, который связан с:
Все это причины, по которым я решил больше манипулировать этими данными в памяти, чем использовать очень сложную хранимую процедуру, которая также будет выполнять несколько сканирований таблиц, чтобы получить факторы для каждого человека, места и дня.
Я думаю, что такую хранимую процедуру будет сложно обрабатывать и поддерживать. Поэтому я предпочитаю сначала получить все данные (поместить их в соответствующие структуры памяти для повышения производительности), а затем обработать их в памяти.