【问题标题】:How does the look up time of nested dictionaries increase?嵌套字典的查找时间如何增加?
【发布时间】:2015-11-25 04:52:35
【问题描述】:

有人可以评论一下随着我们进一步“嵌套”字典的复杂性如何增加?

例如,我添加一个元素如下:

dict_name[a][b][c][d] = 0

我认为任何字典的查找时间都应该相同(恒定时间 O(1)),但是如果我添加这样的元素,它会显着改变吗?

dict_name[a][b][c]....[z]

【问题讨论】:

  • 您是否意识到维度 26 的数组将至少包含 2^26=67108864 个不同的字典(假设每个维度允许 2 个不同的值;并且 2541865828329 个字典对于每个维度的 3 个值,这远远超出PC 能处理什么)?
  • 你似乎没有理解O(1)的概念。如果您执行O(1) 操作固定次数,您仍然会得到O(1)
  • This SO answer解释了为什么常量元素无关紧要(除了它)。
  • @YvesDaoust 感谢您澄清这一点。我很好奇嵌套字典会对时间和内存产生什么影响 :)

标签: python dictionary time time-complexity lookup


【解决方案1】:

Python 的字典实现不会随着嵌套而改变,不会,因此查找的算法复杂度不会改变。就 Python 而言,每个[key] 订阅都独立于您订阅的对象的来源。

每次查找仍然是 O(1)。查找嵌套元素是 depth 次 O(1) 查找。由于您对深度进行了硬编码(通过使用文字符号),因此您所拥有的仍然是 O(1) 作为常数乘数,不会影响 Big-O 复杂度。

【讨论】:

    【解决方案2】:
    dict_name[a][b][c][d] = 0
    

    这个和下面的基本一样

    temp_a = dict_name[a]
    temp_b = temp_a[b]
    temp_c = temp_b[c]
    temp_c[d] = 0
    

    因此,您只需进行三个查找,其中您从恰好是另一个字典的字典中获取一个对象。然后,在最后一步中,您进行一个字典分配。

    作为we know,字典查找平均花费所有恒定时间,因此所有这四个操作本身都是 O(1)。结合起来,你得到 4 × O(1),它仍然是 O(1)(因为常数因子对于大 O 来说并不重要)。

    如果你现在增加嵌套的深度,你得到的只是更多的temp_y = temp_x[k] 行,这也是恒定的时间。因此,您只需在 k × O(1) 中增加因子 k。并且如前所述,只要k 是常数,该因子对于大O 并不重要,因此无论嵌套深度如何,您都保持恒定时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 2022-10-12
      相关资源
      最近更新 更多