Вопрос задает «самый быстрый (по памяти)».Вы ищете самый быстрый или самый сознательный след памяти?При использовании алгоритмов часто существует компромисс между временем и пространством, поэтому, когда вы делаете это быстрее, вы обычно делаете это путем добавления индексов и других структур данных поиска, которые увеличивают объем памяти.
Для этой проблемы прямая реализация будетперебирать каждый канал и каждый элемент, сравнивая каждый из них с 3 верхними, хранящимися в памяти.Но это может быть медленным.
С дополнительным хранилищем у вас может быть дополнительный массив, который индексирует во временные интервалы (достаточно ли хорош один раз в 15 минут?), А затем в последовательных цепочках отображаются эти временные интервалы.Учитывая текущее время, вы можете индексировать прямо в текущий временной интервал, а затем искать следующий набор шоу.Массив будет иметь указатели на те же объекты, на которые указывают словари.Это дополнительная структура данных для оптимизации одного конкретного шаблона доступа, но она делает это по цене - больше памяти.
Это увеличило бы ваш отпечаток, но было бы очень быстрым, поскольку это всего лишь смещение индекса массива.
Наконец, вы можете сохранить все свои шоу в базе данных sqlite или CoreData и решить вашу проблему одним запросом.Пусть движок SQL делает тяжелую работу.этот мир также сохранит ваш отпечаток памяти разумным.
Надежда, которая вызывает некоторые идеи.
РЕДАКТИРОВАТЬ:
Грубый пример, показывающий, как вы можете построитьтаблица просмотра - массив со слотами на каждые 15 минут.Это мгновенный переход к текущему временному интервалу, так как это просто смещение массива.Затем вы идете по абсолютному количеству прогулок - следующие три и вы выходите.Таким образом, это смещение массива с 3 итерациями.
Большая часть кода является датой построения - таблица поиска, находящая временной интервал и цикл, является тривиальной.
NSInteger slotFromTime(NSDate *date)
{
NSLog(@"date: %@", date);
NSDateComponents *dateComponents = [[NSCalendar currentCalendar] components:(NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:date];
NSInteger hour = [dateComponents hour];
NSInteger minute = [dateComponents minute];
NSInteger slot = (hour * 60 + minute)/15;
NSLog(@"slot: %d", (int)slot);
return slot;
}
int main (int argc, const char * argv[])
{
// An array of arrays - the outer array is an index of 15 min time slots.
NSArray *slots[96];
NSDate *currentTime = [NSDate date];
NSInteger currentSlot = slotFromTime(currentTime);
// populate with shows into the next few slots for demo purpose
NSInteger index = currentSlot;
NSArray *shows1 = [NSArray arrayWithObjects:@"Seinfeld", @"Tonight Show", nil];
slots[++index] = shows1;
NSArray *shows2 = [NSArray arrayWithObjects:@"Friends", @"Jurassic Park", nil];
slots[++index] = shows2;
// find next three -jump directly to the current slot and only iterate till we find three.
// we don't have to iterate over the full data set of shows
NSMutableArray *nextShow = [[NSMutableArray alloc] init];
for (NSInteger currIndex = currentSlot; currIndex < 96; currIndex++)
{
NSArray *shows = slots[currIndex];
if (shows)
{
for (NSString *show in shows)
{
NSLog(@"found show: %@", show);
[nextShow addObject:show];
if ([nextShow count] == 3)
break;
}
}
if ([nextShow count] == 3)
break;
}
return 0;
}
Это приводит к:
2011-10-01 17:48:10.526 Craplet[946:707] date: 2011-10-01 21:48:10 +0000
2011-10-01 17:48:10.527 Craplet[946:707] slot: 71
2011-10-01 17:48:14.335 Craplet[946:707] found show: Seinfeld
2011-10-01 17:48:14.336 Craplet[946:707] found show: Tonight Show
2011-10-01 17:48:21.335 Craplet[946:707] found show: Friends