Python:列表vs字典vs集

时间:2018-08-26 06:30:10

标签: python-3.x data-structures

“在Python中,您将使用什么数据结构-集,列表或字典来存储1000万个整数?查询操作包括查找给定集中出现一个数字的次数。最坏的情况是,在所有情况下的空间复杂度?”

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

3 个答案:

答案 0 :(得分:2)

此问题的关键是以下行:

  

“确定数字在给定集合中出现的次数”

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

取消这些选项:

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

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

列表: 可以迭代一个列表以确定列表中给定数字的频率。但是,这将是O(n)运算,并且对于1000万个整数将无效。

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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