Я знаю, что «связанные списки» обычно ценятся с теоретической точки зрения, но на практике они, как правило, неэффективны.
Я бы предложил перейти к контейнерам произвольного доступа, чтобы получить некоторую скорость.Самым простым был бы массив, но двусторонняя очередь или индексированный список пропусков / дерево B * могли бы быть лучше, в зависимости от размера данных, о котором мы говорим.
Концептуально это не меняетсямного (пока), однако вы получаете возможность перехода к заданному индексу в операциях O (1) (массив, deque) / O (log N) (пропустить список / B * дерево), а не O (N) спростой связанный список.
А потом пришло время магии.
Кит уже раскрыл основную идею: вместо того, чтобы фактически удалить столбец, вам просто нужно пометить его как удаленный и затем 'прыгать над ним, когда вы ходите по своей структуре.Однако хеш-таблица требует линейного обхода, чтобы добраться до N-го столбца.Использование дерева Фенвика дало бы эффективный способ вычисления реального индекса, и вы могли бы сразу перейти туда.
Обратите внимание, что ключевым преимуществом пометки строки как удаленной является очевидная возможность операции undo
.
Также обратите внимание, что вы можете захотеть создать функцию сжатия, чтобы время от времени удалять удаленные столбцы и не давать им накапливаться.