Вопрос проверяет понимание алгоритмической сложности операций с коллекциями, что важно для написания эффективного кода при работе с большими объемами данных.
Операция очистки коллекции от nil-элементов (или null-значений) — это фильтрация, которая удаляет все элементы, равные nil. Её алгоритмическая сложность (временная сложность) определяется тем, как организована коллекция и какой алгоритм используется для удаления.
Рассмотрим две распространённые структуры:
Для массивов можно применить алгоритм с двумя указателями (или индексами), который работает за O(n) и на месте (in-place), если допустимо изменять исходный массив. Один указатель (write) отмечает позицию, куда будет записан следующий ненулевой элемент, другой (read) проходит по всем элементам. В конце длина массива усекается до позиции write.
// Псевдокод для массива arr
write = 0
for read = 0 to arr.length - 1:
if arr[read] != nil:
arr[write] = arr[read]
write++
arr.resize(write) // обрезаем массивЭтот подход использует O(1) дополнительной памяти (если не считать память под сам массив) и выполняется за O(n).
В Python списки (list) являются динамическими массивами. Простой способ — использовать list comprehension, который создаёт новый список:
original = [1, None, 2, None, 3]
filtered = [x for x in original if x is not None]
# filtered = [1, 2, 3]Этот метод имеет временную сложность O(n) и потребляет O(n) дополнительной памяти для нового списка. Для работы на месте можно использовать подход с двумя указателями, но в Python это менее идиоматично.
Очистка от nil часто нужна при обработке данных, полученных из внешних источников (например, из API, файлов), где некоторые поля могут отсутствовать или быть пустыми. Также это полезно при подготовке данных для дальнейших операций, которые не допускают nil (например, математические вычисления, построение графиков).
Вывод: Операция очистки коллекции от nil-элементов в общем случае может быть выполнена за линейное время O(n). Для массивов важно избегать наивного удаления в цикле, чтобы не получить O(n²). Используйте алгоритм с двумя указателями для работы на месте или создание нового отфильтрованного массива, если допустимо дополнительное потребление памяти.
Уровень
Рейтинг:
3
Сложность:
4
Навыки
JavaScript
Python
Ключевые слова
Подпишись на iOS Developer в телеграм