这是最近一篇的关于多项式复杂度的笔记嘞~大家也在疫情期间加油学习!!!
#9.3.5 Multinomial fitness complexity(多项式复杂度)
#subset,子集;intersect,相交
def isSubset(L1, L2):
""" 假定L1和L2是列表
如果L1的每个元素都出现在L2中返回True,否则返回False"""
for e1 in L1:
matched = False
for e2 in L2:
if e1 == e2:
matched = True
break
if not matched:
return False
return True
#第一个循环会被执行O(len(L1))次,第二个O(len(L2))次
#因此函数复杂度是O(len(L1)*len(L2))
def intersect(L1, L2):
""" 假定L1和L2是列表
返回一个列表,包含共同元素"""
tmp = []
for e1 in L1:
for e2 in L2:
if e1 == e2:
tmp.append(e1)
#去掉重复的元素
result = []
for e in tmp:
if e not in result:
result.append(e)
return result
#后半部分有坑点,并不是单纯的线性复杂度O(len(tmp))
#因为if语句其实是对result跟e进行校对,所以应该是O(len(tmp)*len(result))
#而后半部分是根据L1和L2中较短的部分来决定的,所以增长速度没有前半部分快
#因此函数复杂度是O(len(L1)*len(L2))
(里面有英语生词的记录别介意哈hhh[手动狗头])
各位第二个函数不理解的可以对比一下前后两个函数,之所以后面多了个“*len(result)”正是因为它实质是在列表result中遍历e,对比result中是否有e,这就相当于是个循环了,而第一个函数则只是纯粹的运行一次的条件语句,高下立断了~
希望我的奇葩解析大家能看懂[笑cry]嘻