Конкретные примеры помогают.Допустим, у вас есть три списка (массива):
[7, 11, 15]
[3, 12, 19]
[2, 4, 6]
Для удаления наименьшего элемента необходимо сначала его найти.Отдельные списки расположены по порядку, а список списков - нет.Чтобы найти наименьший элемент, потребуется O (K), потому что вы должны выполнить последовательное сканирование списка списков.
После того, как вы нашли наименьший элемент, потребуется O (m) времени(где m - размер списка, который содержит наименьший элемент), чтобы удалить его.Причина в том, что когда вы удаляете первый элемент из списка, все остальные элементы должны двигаться вверх.То есть:
[2, 4, 6]
становится [_, 4, 6]
, а затем вам нужно сдвинуть вещи, чтобы сделать [4, 6, _]
.(_
означает нулевое значение или любое другое значение, которое вы используете для обозначения «нет значения».)
Полагаю, вы могли бы сказать, что удаление - это O (1), а затем повторная сортировка массива равна O(m).
Вы можете удалить все элементы за O (N) времени, если вам все равно, в каком порядке вы их удалите.Если вы хотите удалить все элементы в отсортированном порядке, то сложность O (n * K), потому что каждый раз вам нужно найти самый маленький элемент.Вы можете улучшить это до O (n * log (K)), применив K-way merge, за счет O (K) дополнительной памяти.