前言
开始文章输出之前,我没有着急下笔,而是认真的问了自己几个问题。
- 我为什么要学算法?
- 如何保持学习的热情和积极性?
- 学到的算法是否可以应用到工作中?
- 学到的算法怎么应用到工作中?
- 如何实现从掌握到精通?
我想每个学习周期,总要收获自己想要得到的东西,到底什么才是自己想要的或者需求要的。
于是我面对比较新的技术,养成了提问自己->探索过程->找出答案的习惯。
我理解的算法之美
化繁为简
日常无论是工作还是生活,有些场景可以借助算法,将复杂问题简单化。
比如买东西时怎么挑性价比高的商品、怎么用优惠组合可以让价格更低、出行时哪条路线更便捷等。
复杂一些的比如估算某件事的成本、某个规律性事件的数量、还有一些事件发生的概率以及什么概率下做决定比较多。
这些事,单纯靠想象,是比较难处理的,如果代入一些公式进行计算得到结果,怎么做选择就一目了然了。
降本提效
我在探索算法的使用场景的时候,发现了很多有趣的例子。
37%法则
经过数学家欧拉的实验,以37%作为分界点,前面的时间用来观察,后面的时间用来作决策的一种方法。
卖房子的时机
只要你可以得到一系列报价,清楚报价金额的变化幅度,并且在这个变化范围内各种报价出现的可能性是相同的。只要报价不会中断(积蓄也不会花完),就可以单纯地考虑你对收获或损失的期望值,以决定是否继续等待更有利的交易。
最优停车位置
停车难题在于停车位占用率,即目前被占用的所有停车位占总停车位的比例。
如果占用率很低,很容易找到一个好的停车位;如果占用率很高,想为你的车找到一席之地就困难了。
上面这些被例子被涵盖进最优停止理论中,合理的选择停止观望的时机,可以帮助节省成本,提高效率。
有规划成方圆
- 在搜索省份和城市数据的时候,希望按照首字母进行分类展示。
- 打开外卖APP,查看美食商家,可以按照距离筛选,也可以按照好评筛选。
- 整理好装有100本书的书架和两个各有50本书的书架,哪个更费时?
这些问题,如果没有建立排序,想想数据量,就令人头皮发麻。
合理利用算法,可以为我们解决大数据量问题,也可以通过结果了解社会的本质。
所谓社会,就是我们维持的另外一种更重要、规模更大的秩序。
初探算法之门
算法是指对特定问题求解步骤的一种描述。
想要学好算法,一本专业的有趣的书籍,即可以帮助学习,又可以让人有读下去的欲望。
我选择的是《趣学算法》这本书。
下面通过阅读书籍,整理了算法的基础知识点。
算法描述方式
使用自然语言、程序设计语言描述算法,也可以使用流程图、框图等图形化的方式来描述算法。
伪代码
伪代码介于自然语言和程序设计语言之间,它更符合人们的表达方式,容易理解。但不是严格的程序设计语言,所以不能真实调试运行,想要调试运行伪代码,需要转换成标准的程序设计语言。
一般使用“伪代码”的方式来描述算法。
算法特性
书总结了算法有以下特性:
有穷性:算法是由若干条指令组成的有穷序列,总是在执行若干次后结束,不可能永不停止。
确定性:每条语句有明确的含义,无歧义。
可行性:算法在当前环境条件下可以通过有限次运算实现。
输入输出:有零个或多个输入,有一个或多个输出。
「好」算法的标准
书总结了算法有以下特性:
- 正确性:算法能够满足具体问题的需求,程序运行正常,无语法错误。
- 易读性:算法遵循标识符命名规则,注释语句恰当适量,简洁易懂,便于阅读。
- 健壮性:算法对非法数据及操作有较好的反应和处理。
- 高效性:算法运行消耗的时间短。(与时间复杂度有关)
- 低存储性:算法所需的存储空间低。(与空间复杂度有关)
时间复杂度
算法的时间复杂度是指运行需要的时间。一般会将算法运算的执行次数作为时间复杂度的衡量标准。
来看一个简单的求和的例子
let sum = 0; // 运行1次
let total = 0; // 运行1次
for (let i = 1; i < 10; i++) { // 运行10次
sum = sum + i; // 运行10次
for (let j = 1; j < 10; j++) { // 运行10*10次
total = sum + i + j; // 运行10*10次
}
}
这个例子中,所有的运行次数加起来是:1+1+10+10+10*10+10*10。
可以用一个函数表达:T(10) = 2*10²+2*10+2。
当运行次数是n的时候,表达为:T(n) = 2*n²+2*n+2。如果n足够大,那么算法运行时间主要取决于第一项,后面的可以忽略不计。
空间复杂度
空间复杂度是算法占用的空间大小。一般讲算法的辅助空间作为衡量空间复杂度的标准。
来看一个简单的数字交换的例子
function exchange(a, b) {
let temp;
temp = x;
x = y;
y = temp;
}
exchange(1, 2);
该算法使用了一个辅助控件temp,空间复杂度为O(1)。
自问自答
我为什么要学算法?
前面的算法之美就这个问题的答案。
如何保持学习的热情和积极性?
我一般会保持下面这张图中的良性循环
学习中分阶段取得收获,每个阶段的收获可以鼓舞自己继续学习下去。
未完待续
上面问题列表中,后面三个问题,我会完成一系列的算法学习之后,将经验进行总结,再发出来。
这个从无到有的过程,让改变了原本对算法爱恨交织的态度,这就是一个好的开始。