算法学习 | 从无到有,我为什么要学算法

举报
叶一一 发表于 2023/02/19 18:09:06 2023/02/19
【摘要】 开启算法学习之旅,对我来说,这是从无到有的过程,让我改变了原本对算法爱恨交织的态度,真是一个好的开始。

前言

开始文章输出之前,我没有着急下笔,而是认真的问了自己几个问题。

  • 我为什么要学算法?
  • 如何保持学习的热情和积极性?
  • 学到的算法是否可以应用到工作中?
  • 学到的算法怎么应用到工作中?
  • 如何实现从掌握到精通?

我想每个学习周期,总要收获自己想要得到的东西,到底什么才是自己想要的或者需求要的。

于是我面对比较新的技术,养成了提问自己->探索过程->找出答案的习惯。

我理解的算法之美

化繁为简

日常无论是工作还是生活,有些场景可以借助算法,将复杂问题简单化。

比如买东西时怎么挑性价比高的商品、怎么用优惠组合可以让价格更低、出行时哪条路线更便捷等。

复杂一些的比如估算某件事的成本、某个规律性事件的数量、还有一些事件发生的概率以及什么概率下做决定比较多。

这些事,单纯靠想象,是比较难处理的,如果代入一些公式进行计算得到结果,怎么做选择就一目了然了。

降本提效

我在探索算法的使用场景的时候,发现了很多有趣的例子。

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)。

自问自答

我为什么要学算法?

前面的算法之美就这个问题的答案。

如何保持学习的热情和积极性?

我一般会保持下面这张图中的良性循环

image

学习中分阶段取得收获,每个阶段的收获可以鼓舞自己继续学习下去。

未完待续

上面问题列表中,后面三个问题,我会完成一系列的算法学习之后,将经验进行总结,再发出来。

这个从无到有的过程,让改变了原本对算法爱恨交织的态度,这就是一个好的开始。

作者:非职业「传道授业解惑」的开发者叶一一
简介:「趣学前端」、「CSS畅想」系列作者,华夏美食、国漫、古风重度爱好者,刑侦、无限流小说初级玩家。
如果看完文章有所收获,欢迎点赞👍 | 收藏⭐️ | 留言📝。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。