Рассматриваемая реализация может быть найдена здесь . Алгоритм работает примерно так, учитывая, что мы хотим проверить, равны ли два sets
v
и w
:
- Проверьте, равны ли их размеры. Если это не так, верните
false
.
Это ссылка на атрибут size
PySetObject
, так что это операция с постоянным временем.
- Проверьте, являются ли оба
sets
frozensets
. Если это так, и их хэши разные, верните false
.
Опять же, это ссылается на атрибут hash
PySetObject
, который является операцией с постоянным временем. Это возможно, потому что frozensets
являются неизменяемыми объектами и, следовательно, их хэши вычисляются при их создании.
- Проверьте, является ли
w
подмножеством v
.
Это делается путем итерации каждого элемента v
и проверки его наличия в w
.
Итерация должна быть выполнена для всего v
, и, следовательно, имеет наихудший линейный размер (если в последней позиции обнаружен отличающийся элемент).
Тестирование членства для sets
в общем случае требует постоянного времени в среднем случае и линейного времени в худшем случае; объединение этих двух значений дает время, линейное в размере v
в среднем случае и время, пропорциональное len(v) * len(w)
в худшем случае.
В некотором смысле это средний случай наихудшего случая, поскольку предполагается, что первые две проверки всегда возвращают true
. Если ваши данные редко имеют равный размер sets
, которые также имеют одинаковые хэши, но содержат разные объекты, то в среднем случае сравнение все равно будет выполняться в постоянное время.