【问题标题】:List vs Dictionary vs Set for finding the number of times a number appearsList vs Dictionary vs Set 用于查找数字出现的次数
【发布时间】:2019-02-01 01:46:14
【问题描述】:

您将使用 Python 中的哪种数据结构(集合、列表或字典)来存储 1000 万个整数?查询操作包括查找数字在给定集合中出现的次数。在所有情况下,最坏情况下的时间和空间复杂度是多少?

这是一个示例面试问题。什么是最合适的答案?

【问题讨论】:

  • 您不能使用set,因为值必须是唯一的。您将需要提出更多问题,例如你需要做这个查询很多还是只做一次。有非常高的数字吗?那么其他数据结构呢? collections.Counter(多组)。如果您使用dictCounter 进行预计算,则发现计数为O(1),但预计算的设置时间为O(n)list 的空间复杂度为 O(n)dict 的空间复杂度取决于分布,但也可能为 O(n),等等。
  • 整数的范围是多少?

标签: python python-3.x data-structures


【解决方案1】:

这个问题的关键是以下语句:

“找出一个数字在给定集合中出现的次数”

set 数据结构将无法计算一个数字在整个数据集中出现的次数,并且 List 的迭代成本非常高。这使得字典成为唯一可行的选择。

分解选项:

设置: 一个集合会自动对添加到该集合中的已存在的值进行重复数据删除。所以不可能使用集合来查询一个数字在存储的数据集中出现的频率,因为所有存储的数字的答案都是 1。

  • 查询的时间复杂度: O(1)
  • 存储空间复杂度: O(n)

列表: 可以迭代列表以确定列表中给定数字的频率。然而,这将是 O(n) 操作,并且对于 1000 万个整数来说效率不高。

  • 查询的时间复杂度: O(n)
  • 存储空间复杂度: O(n)

字典: 字典允许您存储键值对。在这种情况下,您会将要搜索的数字存储为键,并将其存储次数的计数存储为关联的值。由于字典将键散列到不同的桶中的方式(可能存在冲突,但我们现在假设一个非冲突的理论字典),给定键的查找时间接近 O(1)。然而,计算计数会减慢字典的速度;计算所有键的计数需要 O(n) 时间复杂度(因为每个键必须至少被击中一次才能将其计数附加到存储在值中的运行计数)。

  • 查询的时间复杂度: O(1)
  • 存储时间复杂度: O(n)
  • 存储空间复杂度: O(2n) = O(n)

【讨论】:

    【解决方案2】:

    补充@John Stark 的答案 从the python wiki 开始,在集合中查询的时间复杂度为 O(n)。这是因为它使用散列来获取值,但是运气不好(很多),您可能会遇到每个键的散列冲突。但是,在绝大多数情况下,您不会发生碰撞。 此外,因为这里的键是整数,所以如果整数范围有限,可以减少哈希冲突。在 int 类型的 python 2 中,你不能有冲突。

    【讨论】:

      【解决方案3】:

      如果数字不在字典中,则将每个数字添加为数字:1,否则将 1 添加到该键的 Val。 然后搜索特定的数字作为Key,Val就是出现的次数。

      【讨论】:

        猜你喜欢
        • 2017-06-04
        • 2012-08-07
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 2011-09-27
        • 1970-01-01
        • 2023-03-06
        • 2020-12-16
        相关资源
        最近更新 更多