本篇是学习了《趣学算法(第2版)》 第一章之后总结的。
对算法的理解:
计算机虽然可以高效的进行运算,但是有很多问题拼的不是算力,而是策略。如果没有策略的去计算,那再强的运算能力也只能称为“蛮力”。策略就是帮助我们如何用更少的计算步骤、更快的速度去运算出结果。换言之,策略就是你设计算法的思路,目的只有一个就是:快人一步。
计算机不同于人脑,人脑面对问题可以先去“观察”、“分析”,然后把复杂转化成简单问题(跟数学题一样,算法就是简便的解题思路)。目前在绝大多数领域计算机还不具备这个功能,离开了人脑,计算机还只是一个人的使用工具罢了。
算法有两个衡量标准:
- 时间长短(时间复杂度)
- 占用内存大小(空间复杂度)
先展望一下学习历程:
算法学习是一个循序渐进的过程,经常训练解题能力,逐步积累解题方法策略,最后内化成自己的知识,灵活运用去应对新的问题。
“初极狭,才通人。复行数十步,豁然开朗。”,挺喜欢这句话
算法知识点
- 高斯算法(倒序相加)
- 数列求和
算法题目
求: $S_n = 1 + 2 + 2^2 + 2^3 + ... + 2^{63}=$
该函数属于爆炸增量函数。
做题思路
方法一
公式法
如果还记得高中数学知识,不难发现,这是一个等比数列求和问题,$a_1 = 1,公比q = 2,n = 64$
等比数列求和公式:$$S_n = a_1 * \frac{1 - q^n}{1 - q} ,(q ≠ 1)$$
本文暂不讲解公式推导过程
代入公式,上面的式子 = $1 * \frac{1 - 2^{64}}{1 - 2} = 2^{64} - 1 = 18446744073709551615$ ,从而转化问题,解题
方法二
忘记方法叫什么名字了,主要原理就是销项,使问题转化成第一项和最后一项的差。
根据原式,等号两边同时乘以2,得式子②$2S_n = 2 + 2^2 + 2^3 + ... + 2^{63} + 2^{64}$
用式子② - 原式 = $S_n = 2^{64} - 1 =18446744073709551615$
据专家统计,每颗麦粒的平均重量约41.9毫克,这些麦粒的总重量为:
$18446744073709551615×41.9$
$=772918576688430212668.5(毫克)$
$≈7729000(亿千克)$
全世界人口按77亿计算,每人差不多可以分得100000千克(即100吨)!
总结
常见的算法时间复杂度有以下几类。
- 常数阶。
常数阶算法的运行次数是一个常数,如5、20、100。常数阶算法的时间复杂度通常用O(1)
表示。 - 多项式阶。
很多算法的时间复杂度是多项式,通常用 0(n)、$O(n^2)$、$0(n^3)$等表示。 - 指数阶。
指数阶算法的运行效率极差,程序员往往像躲“恶魔”一样避开这种算法。指数阶算法的时间复杂度通常用$O(2^n)$、$O(n!)$、$O(n^n)$等表示。 - 对数阶。
对数阶算法的运行效率较高,通常用$O(logn)$、$O(nlogn)$等表示。
指数阶增量随着的增加而急剧增加,而对数阶增长缓慢。它们之间的关系如下:
$$O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)O(n!)<O(n^n)$$
在设计算法时,我们要注意算法复杂度增量的问题,尽量避免爆炸级增量。
通过上面一个算法小例子,又勾起了我对数学的兴趣。算法跟数学是息息相关的,平常也要复习一下数学知识,相信也会有所帮助的。
我是 甜点cc
热爱前端,也喜欢专研各种跟本职工作关系不大的技术,技术、产品兴趣广泛且浓厚,等待着一个创业机会。本号主要致力于分享个人经验总结,希望可以给一小部分人一些微小帮助。
希望能和大家一起努力营造一个良好的学习氛围,为了个人和家庭、为了我国的互联网物联网技术、数字化转型、数字经济发展做一点点贡献。数风流人物还看中国、看今朝、看你我。