Вопрос объясняет это, но какова временная сложность операции установки разности в Python?

EX :

A = set([...])
B = set([...])

print(A.difference(B)) # What is the time complexity of the difference function? 

Моя интуиция подсказывает мне O(n), потому что мы можем перебирать набор A и для каждого элемента видеть, содержится ли он в наборе B за постоянное время (с хеш-функцией).

Я прав?

(Вот ответ, с которым я столкнулся: https://wiki.python.org/moin/TimeComplexity )

3
Q.H. 31 Дек 2017 в 20:03

2 ответа

Лучший ответ

Похоже, что вы правы, разница выполняется с O(n) сложностью в лучших случаях

Но имейте в виду, что в худшем случае (максимальное количество коллизий с хешами) он может возрасти до O(n**2) (поскольку наихудший случай поиска - O(n): Как реализован set ()?, но кажется, что в целом вы можете положиться на O(1))

Кстати, скорость зависит от типа объекта в set. Целые числа хорошо хешируются (примерно так же, как они сами, возможно, с некоторым модулем), тогда как строки требуют больше процессора.

3
Jean-François Fabre 31 Дек 2017 в 17:17

https://wiki.python.org/moin/TimeComplexity предполагает, что его O (мощность установите A) в описанном вами примере.

Насколько я понимаю, это O(len(A)), а не O(len(B)), потому что вам нужно только проверить, присутствует ли каждый элемент в setA в setB. Каждый поиск в setB - это O(1), поэтому вы будете выполнять len(A) * O(1) поиски на setB. Поскольку O (1) константа, то его O(len(A))

Например:

A = {1,2,3,4,5}
B = {3,5,7,8,9,10,11,12,13}
A-B = {1,2,4}

Когда вызывается A-B, переберите каждый элемент в A (только 5 элементов) и проверьте принадлежность к B. Если не найден в B, то он будет присутствовать в результате.

Примечание: конечно все это амортизированная сложность. На практике каждый поиск в setB может быть больше, чем O(1).

0
Matthew Tan 22 Дек 2018 в 21:51