小明之前一直没有系统学习算法,只是把函数和包拿来调用做数分,主要还是对于统计概念的一些学习,至于代码一向是需要什么包直接现场百度就好了,但最近发现我的公司的数分只是没有技术含量的工具人、只是做些相关验证或者数据趋势分析是很容易被取代的,垃圾老板还每天pua搞得小明有点抑郁,因为经常窝里横的冲亲人发火; 小明深刻反思自己,决定提高自己的知识储备(也可能只是一时兴起,学了两天觉得很累就放弃了,因为这件事情多次发生在小明身上,例如之前的减肥、健身、养生、学摄影等等,但是总之此刻痛下决心),也许从数分看看能不能转为大数据,为跳槽or装逼做准备,因此决定刷刷算法题,结果发现题目中有些名词是根本不知道,我哭死,于是这个合集出现了
百度上说:算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,亦即考察输入值大小趋近无穷时的情况。
这听起来有点绕,所以我们在例子中理解
例如
class Num:
def aaa(i):
i=1
if i<=10:
i+=1
else:
break
i从1增加到n之后程序停止,在这个题目里我们需要计算10-1次,那么最多计算t=9,我们就可以理解为时间负责度是O(9),常数在时间复杂度的计算中是被约掉的,因此我们记该程序段时间复杂度为O(1),也可被称为具有常数时间
class Num:
def aaa(i, n: int):
i=1
if i<=2n:
i+=1
else:
break
在这个题目里我们最多需要计算n-1次,那么t=n-1,我们就可以理解为时间负责度是O(2n-1),常数和频度在时间复杂度的计算中是被约掉的,因此我们记该程序段时间复杂度为O(n)
class Num:
def aaa(i, n: int):
i=1
if i<=n:
i=i^2
else:
break
第一次计算时 t=1 i=1 i<n, i=1*2
第二次计算时 t=2 i=2 i<n, i=1*2*2
第t次计算时 t=t i=1*2^t, i>n,运算停止,那么2^t>n, t>log_2(n);
i从1增加到log_2(n)之后程序停止,在这个题目里我们最多需要计算log_2(n)次,那么t=log_2(n)-1,我们就可以理解为时间负责度是O(log_2(n)),常数和常数因子在时间复杂度的计算中是被约掉的,因此我们记该程序段时间复杂度为O(log n)
class Num:
def factorial_def(n:int):
if n>1:
return n*Num.factorial_def(n-1)
elif n==1:
return 1
计算时从n乘到1之后程序停止,在这个题目里我们最多需要乘n次,那么t=n, 我们就可以理解为时间负责度是O(n)