趣学算法 —— 算法之美

14天阅读挑战赛

努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!欢迎记录下你的那些努力时刻(算法学习知识点/算法题解/遇到的算法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)

为什么解法三这么快呢,因为它的解析表达式已经求出来了,不需要程序再去把计算过程重复一遍。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值