当我们在哈希表中插入/查找一个键时,教科书说它是O(1)时间。但是,如何有一个O(1)查找时间?如果哈希表将密钥存储在向量中,则它将花费O(N),如果在二叉树中,它将是O(logN)。我只是无法使用O(1)访问时间对某些数据结构进行映像。
谢谢!
答案 0 :(得分:12)
哈希表至少包含一个数组和哈希函数。将对象添加到表中时,将在对象上计算散列函数,并将其存储在数组中的计算对应值的索引处。例如,如果hash(obj) = 2
然后arr[2] = obj
。
哈希表上的平均插入/查找是O(1)
。
但是,当对象计算相同的哈希值时,可能会发生冲突。
在一般情况下,阵列的每个索引都有“桶”来处理这些冲突。意思是,所有三个对象都存储在哈希表索引处的某些其他数据结构(可能是链表或另一个数组)中。
因此,在哈希表上查找的最坏情况是O(n)
,因为存储在哈希表中的所有对象都可能发生冲突并存储在同一个存储桶中。
答案 1 :(得分:8)
散列表散列您的密钥并将其放入数组中。
例如,hash(x)= 3,其中x是你的密钥。然后表格将其放入数组[3]。从数组访问是O(1)。
答案 2 :(得分:1)
从技术上讲,如果没有冲突,则哈希表查找为O(logn)。这是因为哈希时间相对于标识符的大小(以字节为单位)是线性的,并且对于唯一的标识符,添加到哈希表中的新标识符可以是的最小标识符为O(logn)。>
但是,世界上所有计算机内存的日志都很少,这意味着我们在哈希表标识符大小上有非常好的上限。举例来说,可观测宇宙中粒子数量的log10估计略高于80;反之,在log2中,它大约是3.3倍。对数增长非常缓慢。
因此,大多数对数项可以视为常量项。只是传统上我们只是将此事实应用于哈希表,而不应用于搜索树,以向学生传授递归关系。