【问题标题】:Big-O of loop over dictionary字典循环的大 O
【发布时间】:2019-05-15 12:53:32
【问题描述】:

我对在同一个字典上循环两次然后在字典中特定键的长度上循环的大 O 复杂性感兴趣,如伪代码所示。每个循环的 Big-O 是什么,最终的 Big-O 是什么?

我曾尝试查看此处的其他 big-O 线程,但由于我对 big-O 的了解有限,它们要么让我感到困惑,要么不像我正在寻找的那样具体。

谢谢

dictionary = A dictionary with 100 keys and corresponding values of 10-20 characters each

for Akey in dictionary:
    do something
    for Bkey in dictionary:
        do something
        for i in range(len(dictionary[Bkey]))
            do something

【问题讨论】:

  • 为了得到好的答案,你需要问一个问题。
  • 抱歉,我添加了一些问题。
  • 其实你的伪代码不是很清楚。为什么要嵌套 Akey 和 BKey 循环。 范围”应该是什么意思?
  • 我想嵌套它们以将所有键与第一个键进行比较,然后与下一个键进行比较,依此类推。我正在做一些简单的计算。 range(len()) 将遍历键值的长度范围。所以如果键的值有 20 个字符,我会像 0..1...2 一样循环。等

标签: python dictionary big-o


【解决方案1】:

对于基于哈希表的 python 字典,找到元素的最坏情况是 O(n)。但是,摊销平均情况为 O(1)。因此,如果你对所有元素进行循环,它是 O(1) x n -> O(n),除非你有坏哈希码的退化情况,然后你有 O(n^2)。如果你做了几个类似的操作,但是这些操作的数量是固定的并且不依赖于 n 它不会改变 O。

如果您将一个循环嵌套在另一个循环中,您将不得不增加成本。

O(n*const)->O(n)。现在您正在谈论使用键做某事,但没有提及值。

从伪代码看来,您想要获取一个键列表。遍历所有键是 O(n)。

【讨论】:

  • 谢谢!所以如果我做对了。最后一个循环(循环一个键的长度)不会添加到最终的 Big-O 符号中,因为它是恒定的?在那种情况下,由于在同一个字典上循环两次,最终的 Big-O 将是 O(n^2) 是否公平?
  • 嗯,取决于键。如果您的密钥非常长并且大小与元素数量相当,那么它将影响 O
  • 说它只有大约 10-20 个字符长,但字典会有超过 100 个键。
  • 大 O 表示法和算法复杂度旨在分析大 N 上的算法。对于少量 N,所有类型的次要因素都会产生更大的影响(除非你有一些指数复杂度,即使 100 个元素也会渲染大量时间)。像选择的语言、编译器等。对于哈希键,例如计算哈希码涉及扫描整个键。虽然使用哈希码可能比计算它“便宜”。
  • 我明白了,我想我的例子太模糊了。
猜你喜欢
  • 2016-01-22
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-17
相关资源
最近更新 更多