努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法bug/等等),在分享的同时加深对于算法的理解,同时吸收他人的奇思妙想,一起见证技术er的成长~
瑞士著名科学家尼可老师曾提出:程序 = 数据结构 + 算法
没有算法的程序是没有灵魂的
算法具有以下特性。
- 有穷性:算法是由若干条指令组成的有穷序列,总是在执行若干次后结束,不可能永不停止。
- 确定性:每条语句都有确定的含义,无歧义。
- 可行性:算法在当前环境条件下可以通过有限次运算来实现。
- 输入/输出:有零个或多个输入以及一个或多个输出。
如何优化算法
先看一题:
求一下数列的前n项之和:
−
1
,
1
,
−
1
,
.
.
.
,
(
−
1
)
n
-1, 1, -1, ..., (-1)^n
−1,1,−1,...,(−1)n
不会真的有人这样写for循环求和吧?
def sum1(n):
sum = 0
for i in range(n):
sum += (-1)**(i+1)
return sum
不会吧,不会吧,作为一个合格的 pythoner, 你至少也得一行写完吧
def sum2(n):
return sum([(-1)**((i+1)%2) for i in range(n)])
但是你稍微认真地想一想,你就会发现这根本就不用求和呀
如果n为偶数,救过等于0,否则等于 -1
def sum3(n):
return 0 if n%2==0 else -1
在jupyter notebook里,可以用 %timeit在测试函数的运行时间
%timeit sum1(10000) # 3.25 ms ± 421 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit sum2(10000) # 1.88 ms ± 70 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit sum3(10000) # 103 ns ± 9.65 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
为什么解法三这么快呢,因为它的解析表达式已经求出来了,不需要程序再去把计算过程重复一遍。