以下代码片段的大O是什么?
import itertools
from operator import itemgetter
points = [(1, 0), (1, 1), (4, -3), (5, 5), (-2, 0), (-4, 1), (-3, -2)]
points.sort(key=itemgetter(1, 0)) # Sorts by y then by x; caps theta to range(0, 180)
point_pairs = itertools.combinations(points, 2) # Generates unique pairs of points
# Sort using key function that unpacks point pairs as arguments to theta
point_pairs = sorted(point_pairs, key=lambda x: theta(*x))
print(point_pairs)
答案 0 :(得分:1)
x in alist
为O(n)
,但此代码未对list
执行成员资格测试; words
看起来是dict
,dict
的密钥(或set
)中的成员资格测试是O(1)
(技术上,最差)情况可能是O(n)
,但是它的平均情况为O(1)
,并且他们付出了一些努力来阻止甚至故意导致碰撞的尝试。)
但是,使用collections.defaultdict
可以简化此代码,因此在查找不存在的密钥时隐式地创建list
:
import collections
words = collections.defaultdict(list)
with open(file_name) as f:
for word in f:
w = word.rstrip()
words[''.join(sorted(w)).lower()].append(w)
如果您想要唯一性(虽然它会失去排序),您只需更改为defaultdict(set)
并将append
更改为add
即可。如果您需要唯一性和排序,collections.OrderedDict
可以(大部分)作为有序set
工作:
import collections
words = collections.defaultdict(collections.OrderedDict)
with open(file_name) as f:
for word in f:
w = word.rstrip()
# True is placeholder, any value will do if you're using in tests properly
words[''.join(sorted(w)).lower()][w] = True
答案 1 :(得分:0)
k in words
具有线性复杂性,即O(len(字)),如果 words
是列表。< / p>
看起来words
似乎是dict
,因为words[k]
显然是在字符串上对其进行索引,这是列表不会接受的内容。
对于dict
,访问时间可以看作常量,O(1),用于搜索(in
)和更新。 (这是摊销时间。)