Есть 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.

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

Ещё вопросы по теме «Коллекции и структуры данных»