【问题标题】:Does a set work like a dictionary without values?集合是否像没有值的字典一样工作?
【发布时间】:2012-03-07 23:20:53
【问题描述】:

本题python版:Is there a Collection that works like a Dictionary without the values?

我想要一个包含英语单词列表但没有定义的数据结构。

基本上:给定一个字母序列,我希望能够进行恒定时间 O(1) 查找以确定该序列是否在英文词典中。

set()frozenset() 是正确的选择吗?

我知道我可以使用字典,其中每个键的值都是None,但这似乎浪费了内存空间。

【问题讨论】:

  • 给定一个字母序列是什么意思?假设您的字典中有一个单词apocalypse,您是否希望通过查找apoca得到正确的答案?或lypse?

标签: python dictionary runtime


【解决方案1】:

是的,set 是完成这项工作的合适工具。您可以使用in 找出一个单词是否在集合中,它的运算时间为 O(1)。添加单词是使用 add 成员完成的,这需要平均 O(1) 时间。它还具有所有常见的有限集运算:并集、交集、差集等:

>>> A = set(["foo", "bar", "baz"])
>>> B = set(["foo", "ham", "spam"])
>>> "foo" in A
True
>>> "bar" in B
False
>>> A | B
set(['bar', 'ham', 'spam', 'foo', 'baz'])
>>> A & B
set(['foo'])
>>> A - B
set(['bar', 'baz'])
>>> B - A
set(['ham', 'spam'])

【讨论】:

  • 我很困惑:使用re而不是in有什么好处?
  • @bluepnume:它占用的内存更少。删除它是因为它显然会分散注意力。
【解决方案2】:

是的。在平均情况中,集合查找是 O(1),老实说,这让我很惊讶。 implementation 应该接近您所描述的内容(带有虚拟值的字典)。另见this related question

有关时间复杂度的更多信息,请参阅:

http://wiki.python.org/moin/TimeComplexity

它没有内置或包含在我所知道的任何模块中,但也许你应该看看 Trie 数据结构,以防你将来需要它的一些属性。

【讨论】:

  • 这是一个错字。该链接确实显示了正确的信息。很抱歉,应该校对一下。
  • 啊,现在更有意义了:)
【解决方案3】:

我不知道 Big-O,但 Python 语言参考中关于 set types 的内容如下:

集合的常见用途是快速成员资格测试、从序列中删除重复项以及计算数学运算,例如交集、并集、差分和对称差分。

【讨论】:

    【解决方案4】:

    套装有 O(1) membership tests 平均和漂亮的界面。

    【讨论】:

      猜你喜欢
      • 2010-09-25
      • 2010-12-18
      • 1970-01-01
      • 2013-10-27
      • 2010-12-29
      • 1970-01-01
      • 2011-07-21
      • 2023-04-06
      • 2011-04-03
      相关资源
      最近更新 更多