Примечание: приведенный ниже код является С#, но на самом деле ответ на любом языке был бы полезен для меня.
Предположим, что вместо фактической коллекции (например, a List<T>
) у меня есть последовательность операций, каждая из которых выглядит примерно так:
struct ListOperation<T>
{
public enum OperationType { Insert, Remove }
public OperationType Type;
public T Element; // irrelevant for OperationType.Remove
public int Index;
}
Есть ли способ эффективно "восстановить" коллекцию на основе последовательности таких операций?
В частности, я стараюсь избежать очевидной (неэффективной) реализации, в основном, просто создавая операции List<T>
и вызывающие Insert
и RemoveAt
-both O (N) для каждого элемента.
Обновить. Скажем, "последовательность" операций на самом деле представляет собой конкретный набор, счет которого известен и который случайно доступен по индексу (так, например, a ListOperation<T>[]
). Пусть также говорят, что фактический подсчет результирующей коллекции уже известен (но на самом деле это было бы тривиально, чтобы выяснить в O (N) в любом случае, путем подсчета вставок и абзацев). Любые другие идеи?