今天面试让写100以内所有质数,我用2~i-1的数对i取余判断i是否为质数。
面试官让优化时间复杂度,我就改成了2~(i//2),复杂度还是二次方。再让改进,就打算用集合来优化,但是一时紧张脑子罢工,没想到可行的方式。后来在网上找到2~int(i**0.5)的设定,恍然大悟,复杂度减小到O()。但是我觉得我用集合肯定更快,可以达到O(n)的复杂度。于是比较了一下两种方法寻找一百万以内所有质数的时间。
import time
def judge1(num): #方法一
if num < 2:
return
for i in range(2,num+1):
flag = True
for j in range(2,int(i**0.5)+1):
if i%j == 0:
flag = False
break
if flag:
print(i)
def judge2(num): #方法二
memory = set()
if num < 2:
return
for i in range(2,num+1):
if i not in memory:
tem = 2
while i*tem <= num:
memory.add(i*tem)
tem += 1
print(i)
n = 1000000
start = time.time()
judge1(n)
end = time.time()
print(end-start)
方法一用时8.917541027069092s,方法二用时6.0958967208862305s,看起来还是有明显的提升的。
P.S.现在获取了两种方法的时间,但是是否符合的时间复杂度应该怎么比较呢?需要设置多个n多次计算画图求曲线作拟合/回归分析吗?求路过的大佬指明方法!