fixNpatch / test_task_gamedev

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Задача:

Большое количество однотипных записей загружается в некоторый контейнер. После чего выполняется небольшая серия удалений и вставок записей по ссылке на следующий\предыдущий элемент, а так же запросы к порядковым индексам данных по прямой ссылке. После чего данные выгружаются обратно. Создайте класс контейнера, оптимизированного для работы в описанном режиме.

Мое решение:

Создать связный список Array, так как неизвестно какое количество элементов будет использовано. Следовательно, чтобы не допустить ситуации когда не хватит выделенного места, будем добавлять его "налету". Однако, есть момент с операциями по индексам. В случае большого индекса, придется пробегать весь список до требуемого элемента. Сложность O(n). С целью оптимизации, можно завернуть весь список в еще один связный список, обозначенный Chunk. Грубо говоря, мы режем порционно Array и складываем в Chunk.

Было: 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9

Стало: {1 - 2 - 3} {4 - 5 - 6} {7 - 8 - 9}

Таким образом, можно добавлять и удалять записи, практически бесконечно. Кроме того, это будет довольно быстро, если подобрать оптимальный размер одного Chunk. Сложность будет O(n/k), где k - размер Chunk.

Более того, можно сделать универсальный механизм оптимизации, и в случае необходимости оборачивать некоторый список еще одним слоем Chunk. Таким образом сложность может сократиться до O(n/k1/k2/...)

About


Languages

Language:C++ 100.0%