Как вы получаете доступ к матрице?Вы просматриваете определенные строки / столбцы и делаете что-то с ними таким образом, или вы используете всю матрицу за раз для таких операций, как умножение матрицы на вектор или процедуры факторизации?Если вы обычно не индексируете по строке / столбцу, тогда может быть более эффективно хранить ваши данные в std::vector
контейнерах.
В этом случае ваша операция удаления - это итерация по всему контейнеру, скольжение внизпоследующие элементы вместо записей, которые вы хотите удалить.Очевидно, что здесь есть компромиссы.Ваш подход карты / мультикарты займет около 1004 * времени для удаления k
записей, но операции с целыми матрицами в этом представлении будут очень неэффективными (хотя, надеюсь, все же O(n)
, а не O(n log n)
).
Используя представление массива, удаление одной строки или столбца может занять O(n)
времени, но вы можете удалить произвольное количество строк или столбцов за один и тот же проход, сохранив их индексы в паре хеш-таблиц или деревьев отображения.и делает поиск для каждой записи.После сканирования удаления вы можете либо изменить размеры векторов до количества элементов, которые вы оставили, что экономит память, но может повлечь за собой копирование, либо просто сохранить явное количество действительных записей, торгуя мертвой памятью для экономии времени.