Есть list из 100 000 заблокированных идентификаторов пользователя в переменной banned. Для каждого из миллиона событий нужно проверить, заблокирован ли пользователь. Как ускорить проверку?
AПреобразовать
banned в tuple: проверка через in у кортежа выполняется быстрее, чем у спискаBПреобразовать
banned в set: проверка через in в среднем за O(1) через хеш-таблицуCОставить
list и применять модуль bisect: бинарный поиск даёт ускорение по сравнению с переборомDОтсортировать
list функцией sorted: оператор in после сортировки переключится на бинарный поискПравильный ответ. Проверка принадлежности у
set работает за O(1) в среднем, а у list — за O(n). Для массовых проверок set значительно быстрее.Разбор
list проверяет принадлежность последовательным перебором элементов — O(n). set использует хеш-таблицу, поэтому проверка принадлежности занимает O(1) в среднем. При 100 000 элементах и миллионе проверок разница огромна. Сортировка list не помогает: оператор in у list не использует бинарный поиск, а всегда делает линейный перебор. У tuple логика та же, что и у list.
Проверь себя · 1/3разбор после ответа
Дан список
nums = [10, 20, 1, 30]. Чем отличаются nums.remove(1) и del nums[1]?Ещё вопросы по теме «Коллекции и структуры данных»
- Есть список событий `events = ["click"]`. Объект `events` используется в нескольких местах по ссылке, поэтому важно изменить именно тот же объект (не создавать новый). Нужно добавить элементы из `new_events = ["view", "purchase"]`, чтобы итог был плоским. Какой вариант корректен?
- Дан словарь `d = {"country": "RU"}`. Нужно прочитать значение по ключу `"city"`, а если ключа нет — вернуть строку `"unknown"` без исключения. Что подходит?
- В логах есть список `user_ids` с повторениями. Как получить количество уникальных пользователей?
- Что произойдёт при выполнении кода `t = (1, 2); t[0] = 9`?
- Дан список `nums = [10, 20, 30, 40]`. Чему равен результат выражения `nums[1:3]`?
- Все вопросы по «Коллекции и структуры данных» →