У меня есть список изменений в списке - Добавляет и удаляет. Список может быть огромным - скажем, 10 000 наименований.
Я хочу знать состояние списка после изменения 9'000.
Я мог бы пройтись по списку с самого начала, чтобы изменить 9'000. Это кажется мне немного скучным.
Я мог бы хранить список элементов и записывать, когда они добавляются и когда они удаляются, а затем обойти этот список, чтобы увидеть, что находится в списке при конкретном изменении. Если бы добавления и удаления были одинаково вероятны, я бы уменьшил вдвое количество элементов списка, через которые мне нужно пройти ...
Но нотация Big O говорит, что уменьшение размера задачи вдвое не повышает эффективность (если я правильно понял).
Я мог бы кэшировать состояние списка при каждом 100-м или 1000-м изменении ... но, опять же, большой O говорит, что деление количества элементов на 'n' не делает вещи более эффективными.
Так каков эффективный способ сделать это? Есть ли эффективный способ сделать это?
Подробнее:
В частности, я отслеживаю выделение / освобождение памяти в пользовательском распределителе. Каждое распределение / освобождение является событием в списке. Каждое распределение имеет уникальный идентификатор. Я хотел бы знать, что в настоящее время выделяется после (например, 9'000 событий).
Моя первая идея состояла в том, чтобы сохранить для каждого идентификатора событие, которое было ему выделено, и событие, которое было освобождено. Затем, чтобы перейти к этому списку до первого распределения, чье событие alloc больше 9000. Но, как я уже сказал, это только вдвое уменьшит количество элементов, через которые мне нужно пройти.
Мне нравится точка зрения Майка Ф. - ходить с ближайшего сотого пункта - это постоянное время ...