假設有以下兩個數據集列表
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