这个问题是:Is there a Collection that works like a Dictionary without the values?
的python版本我想要一个包含英文单词列表的数据结构,但不是它们的定义。
基本上:给定一系列字母,我希望能够进行恒定时间O(1)查找,以确定该序列是否在英语词典中。
set()
或frozenset()
是否是正确的选择?
我知道我可以使用字典,其中每个键的值为None
,但这似乎浪费了内存空间。
答案 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的说法:
集合的常见用途是快速成员资格测试,从序列中删除重复项,以及计算交集,并集,差异和对称差异等数学运算。