Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Time complexity 哈希表时间复杂度混乱_Time Complexity_Hashtable - Fatal编程技术网

Time complexity 哈希表时间复杂度混乱

Time complexity 哈希表时间复杂度混乱,time-complexity,hashtable,Time Complexity,Hashtable,我刚开始学习散列字典。目前,我们正在使用由链(链表)组成的单独存储桶实现一个哈希字典。这本书提出了这个问题,我很难弄明白。想象一下,我们的初始表大小为10个桶。如果我们想知道n次插入和一次查找的时间复杂度,我们该如何计算?(假设指针访问是一个时间单位) 它提出了三种情况: 一个不调整大小的哈希字典,n次插入和1次查找的时间复杂度是多少 当加载因子超过0.8时,哈希字典的大小将调整为1,n次插入和1次查找的时间复杂度是多少 当加载因子超过0.8时,通过将表大小加倍来调整大小的哈希字典,n次插入和1

我刚开始学习散列字典。目前,我们正在使用由链(链表)组成的单独存储桶实现一个哈希字典。这本书提出了这个问题,我很难弄明白。想象一下,我们的初始表大小为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  |
    |--------|
    
    • 现在来看一般情况
  • 场景一将固定负载系数(假设m个插槽):
    n/m
    。因此,一个插入函数将是
    O(1+n/m)
    。1用于哈希函数计算,n/m用于查找
  • 对于第二种和第三种情况,应分别为
    O(1+n/m+1)
    O(1+n/2m)
  • 对于您的困惑,您可以问自己一个问题,任何随机密钥集的预期链长度是多少。解决办法是我们根本无法确定。 在这里,负载因子的概念开始用于定义平均情况场景,如果我们的密钥数量大于插槽数量,我们给每个插槽以相等的概率来形成一个链

    想象一下,我们的初始表大小为10个桶。如果我们想知道n次插入和一次查找的时间复杂度,我们该如何计算

    当我们谈论时间复杂度时,我们看到的是当n接近无穷大时,n-vs-time-for-operation曲线的陡度。在上面的例子中,您的意思是只有十个bucket,因此-假设哈希函数以近乎均匀的分布(应该是这样)将插入分散到各个bucket中,n个插入将产生大约n/10个元素的10个列表

    在每次插入过程中,可以在O(1)时间内哈希到正确的存储桶。现在-这里的一个关键因素是您是否希望哈希表实现保护您不受重复插入的影响

    • 如果您只是相信不会有重复项,或者允许哈希表有重复项(例如,C++的
      无序_multiset
      ),那么插入本身也可以在O(1)时间内完成,而无需检查存储桶列表的可访问端的现有存储桶内容(即使用头或尾指针)。这意味着每次插入的总时间是O(1),n次插入的总时间是O(n)

    • 如果实现非常容易识别和避免重复,那么对于每次插入,它必须沿着现有链表进行搜索,链表的大小与n有关,系数为常数(1/10),并且在插入过程中从最终元素数的1到1/10呈线性变化,所以平均是n/2/10,除去常数因子,它简化为n。换句话说,每个插入都是O(n)

    大概这个问题是想问在插入所有元素后进行单个查找的时间:在这种情况下,您有10个长度为~n/10的链表,因此查找将散列到其中一个链表,然后平均必须在查找所需值之前查看列表的一半:即大约搜索了n/20个元素,但是因为/20是一个常数,所以它可以被丢弃,我们可以说平均复杂度是O(n)

    一个不调整大小的哈希字典,n次插入和1次查找的时间复杂度是多少

    我们在上面讨论过,哈希表的大小固定在10

    当加载因子超过0.8时,哈希字典的大小将调整为1,n次插入和1次查找的时间复杂度是多少

    假设该表有100个bucket和80个元素,插入第81个元素,它的大小调整为101,负载系数大约为.802-它应该立即重新调整大小,还是等到进行另一次插入?无论如何,忽略这一点-每个调整大小操作都涉及访问、重新设置(除非元素或节点缓存哈希值)和“重新布线”所有现有元素的链接列表:这是O(s),其中s是该时间点的表大小。对于从1到n的s值,您会这样做一次或两次(取决于您对上面“立即再次调整大小”行为的回答),因此s的平均值为n/2,这就简化为n。插入