Поскольку словарь является хеш-таблицей, а поиск ключа в хеш-таблице требует вычисления га sh, то временная сложность поиска ключа в словаре не может быть меньше временной сложности га *. 1026 * function.
В текущих версиях CPython строка длины L занимает O (L) время, чтобы вычислить га sh, если это первый раз, когда вы хэшировали это конкретный строковый объект и время O (1), если ха sh для этого строкового объекта уже вычислено (поскольку хранится га sh):
>>> from timeit import timeit
>>> s = 'b' * (10**9) # string of length 1 billion
>>> timeit(lambda: hash(s), number=1)
0.48574538500002973 # half a second
>>> timeit(lambda: hash(s), number=1)
5.301000044255488e-06 # 5 microseconds
Так что это также, как долго принимает при поиске ключа в словаре:
>>> s = 'c' * (10**9) # string of length 1 billion
>>> d = dict()
>>> timeit(lambda: s in d, number=1)
0.48521506899999167 # half a second
>>> timeit(lambda: s in d, number=1)
4.491000026973779e-06 # 5 microseconds
Вам также нужно знать, что ключ в словаре не ищется только по его га sh: когда хэши совпадают, необходимо проверить, что ключ, который вы искали, равен ключу, используемому в словаре, в случае, если совпадение ha sh является ложноположительным. Проверка на равенство строк занимает в худшем случае время O (L):
>>> s1 = 'a'*(10**9)
>>> s2 = 'a'*(10**9)
>>> timeit(lambda: s1 == s2, number=1)
0.2006020820001595
То есть для ключа длины L и словаря длины n:
- Если ключ отсутствует в словаре, и его ha sh уже был кэширован, тогда требуется O (1) среднее время, чтобы подтвердить его отсутствие.
- Если ключ отсутствует, а его ha sh не был кэширован, то требуется среднее время O (L) из-за вычисления га sh.
- Если ключ присутствует, для подтверждения его наличия требуется среднее время O (L) или нет, необходимо вычислить га sh из-за теста на равенство.
- Наихудшим случаем всегда является O (nL), потому что если каждый ха sh сталкивается и все строки равны, кроме последние места, то медленный тест на равенство должен быть выполнен n раз.