python dict has_key()
方法的时间复杂度是多少?
它是 O(1),就像dict中的键一样。
答案 0 :(得分:5)
Short answer: worst case it is O(n). But the average case time complexity is O(1). The worst case is however very rare.
When you do a lookup, the key is first double hashed (once by the type of the key and once by the dictionary). Based on that result, we know in which bucket we have to search, and we start searching.
It is however possible that hash collissions occur: in that case multiple keys are in the same bucket, so we have to search among multiple keys. Worst case all the keys are in the same bucket, and thus we fallback on linear search.
Hash collisions (with a large amount of keys) are however very rare. Usually it is safe to assume that - regardless of the size of the dictionary - the number of keys in the same bucket will be fixed.
The fact that it is O(n) had some interesting consequences on security. Say you have a server that stores and retrieves data in a dictionary. Then of course the response time will scale with such a lookup. Now a hacker can design input in such a way that all keys are placed in the same bucket(s). As a result lookup will slow down, and eventually the server will not respond in a reasonable time anymore. That's why Python has a flag -R
for hash randomization的值/名称。这将改变每次运行的哈希函数,从而使黑客更难设计这样的输入。