集合是否像没有值的字典一样工作?

时间:2012-03-07 23:20:53

标签: python dictionary runtime

这个问题是:Is there a Collection that works like a Dictionary without the values?

的python版本

我想要一个包含英文单词列表的数据结构,但不是它们的定义。

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

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

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

4 个答案:

答案 0 :(得分:4)

是的,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'])

答案 1 :(得分:1)

是。在平均情况中设置查找是O(1),这让我很惊讶。 implementation应该接近您描述的内容(具有虚拟值的字典)。另请参阅this related question

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

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

它不是内置或包含在我所知道的任何模块中,但是如果您将来需要某些属性,也许应该查看Trie数据结构。

答案 2 :(得分:0)

集合平均 O(1) membership tests 和一个漂亮的界面。

答案 3 :(得分:0)

我不知道Big-O,但这是Python语言参考文献中关于set types的说法:

  

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