Time complexity 哈希表时间复杂度混乱
我刚开始学习散列字典。目前,我们正在使用由链(链表)组成的单独存储桶实现一个哈希字典。这本书提出了这个问题,我很难弄明白。想象一下,我们的初始表大小为10个桶。如果我们想知道n次插入和一次查找的时间复杂度,我们该如何计算?(假设指针访问是一个时间单位) 它提出了三种情况:Time complexity 哈希表时间复杂度混乱,time-complexity,hashtable,Time Complexity,Hashtable,我刚开始学习散列字典。目前,我们正在使用由链(链表)组成的单独存储桶实现一个哈希字典。这本书提出了这个问题,我很难弄明白。想象一下,我们的初始表大小为10个桶。如果我们想知道n次插入和一次查找的时间复杂度,我们该如何计算?(假设指针访问是一个时间单位) 它提出了三种情况: 一个不调整大小的哈希字典,n次插入和1次查找的时间复杂度是多少 当加载因子超过0.8时,哈希字典的大小将调整为1,n次插入和1次查找的时间复杂度是多少 当加载因子超过0.8时,通过将表大小加倍来调整大小的哈希字典,n次插入和1
我最初的想法让我很困惑。我不太明白如何知道某条给定的插入链的长度。假设k长度(我认为),for循环的指针访问贯穿整个链,所以k个时间单位。然后,在每次插入的迭代中,检查当前节点的数据是否与尝试插入的密钥等效(如果存在,则覆盖它),因此如果未找到,则为2k时间单位,如果找到,则为2k+1。然后,它进行5次指针访问,以前置某个元素。所以,2k+5或2k+1插入1次。因此,对于n个插入的第一个场景,O(kn)。要查找,它似乎是2k+1或2k。对于1查找,o(k)。我不知道如何处理另外两种情况。帮点忙就好了。再次澄清:问题中没有提到k。唯一给出的事实是初始大小为10以及场景中给出的信息,因此k不能用作n次插入或1次查找的时间复杂度的结果。如果您有一个哈希字典,那么在最坏的情况下,插入、删除和搜索操作将对1个键采用时间复杂度为
O(n)
。对于n次插入,它将是O(n^2)
。你桌子的大小无关紧要
|--------|
|element1| -> element2 -> element3 -> element4 -> element5
|--------|
| null |
|--------|
| null |
|--------|
| null |
|--------|
| null |
|--------|
- 现在来看一般情况
n/m
。因此,一个插入函数将是O(1+n/m)
。1用于哈希函数计算,n/m用于查找O(1+n/m+1)
和O(1+n/2m)
- 如果您只是相信不会有重复项,或者允许哈希表有重复项(例如,C++的
),那么插入本身也可以在O(1)时间内完成,而无需检查存储桶列表的可访问端的现有存储桶内容(即使用头或尾指针)。这意味着每次插入的总时间是O(1),n次插入的总时间是O(n)无序_multiset
- 如果实现非常容易识别和避免重复,那么对于每次插入,它必须沿着现有链表进行搜索,链表的大小与n有关,系数为常数(1/10),并且在插入过程中从最终元素数的1到1/10呈线性变化,所以平均是n/2/10,除去常数因子,它简化为n。换句话说,每个插入都是O(n)