假设有以下两个数据集列表
a = list(range(1, 100000))
b = list(range(150000, 50000, -1))
要从a中找到不在b中的数据,常常会想直接遍历两个列表即可
a_alone = []
start = time.time()
for i in a:
if i not in b:
a_alone.append(i)
end = time.time()
print(end - start) # 117s
可以看到效率是非常低下的,相当于O(n2)的时间复杂度
利用集合则能大幅提高效率
a_set = set(a)
b_set = set(b)
start = time.time()
# 求差集得到的是在a里但不在b里的数据集合,a独有
# 如果a,b不是空集合,a-b为空集合,说明a中的数据全部在b中
a_alone = a_set - b_set
end = time.time()
print(end - start) # 0.003s
效率大幅提升,相当于O(n)的时间复杂度(不清楚python的set实现机制,该处根据java中hashSet实现机制进行的推测)
集合的一些其他操作
# 求并集
c_set = a_set | b_set
# 求交集,结果集如果为空,说明两个集合没有任何数据是相同的
d_set = a_set & b_set