代码片段的大O" in"列表上的操作

时间:2016-05-18 01:26:01

标签: python time-complexity big-o

以下代码片段的大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)

2 个答案:

答案 0 :(得分:1)

x in alistO(n),但此代码未对list执行成员资格测试; words看起来是dictdict的密钥(或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)和更新。 (这是摊销时间。)