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

简介: 开启算法学习之旅,对我来说,这是从无到有的过程,让我改变了原本对算法爱恨交织的态度,真是一个好的开始。

前言

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

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

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

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

我理解的算法之美

化繁为简

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

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

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

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

降本提效

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

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

自问自答

我为什么要学算法?

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

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

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

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

未完待续

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

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

目录
相关文章
|
6天前
|
机器学习/深度学习 数据采集 搜索推荐
Paper Digest | 突破个性化推荐数据稀疏性:长尾增强的图对比学习算法研究
本文提出了一种新的长尾增强的图对比学习方法(LAGCL),该方法促使模型同时兼顾头部节点与尾部节点之间的知识,并通过长尾增强技术来使模型产出更均匀更准确的节点表征,从而改进基于 GNN 的推荐任务。
|
5天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
6天前
|
机器学习/深度学习 算法 网络架构
什么是神经网络学习中的反向传播算法?
什么是神经网络学习中的反向传播算法?
11 2
|
6天前
|
机器学习/深度学习 算法
算法人生(5):从“元学习”看“战胜拖延”(没兴趣版)
元学习是让机器学会学习策略,适应新任务的机器学习范式。通过定义任务分布、采样任务、内在和外在学习循环来优化模型,增强其跨任务适应性和泛化能力。面对不感兴趣的任务导致的拖延,我们可以借鉴元学习的思路:重新评估任务价值,寻找通用兴趣点;设定奖励激发行动;改变环境以提高执行力。通过调整视角、自我激励和优化环境,可以克服因无兴趣而产生的拖延。
|
6天前
|
机器学习/深度学习 存储 算法
算法人生(4):从“选项学习”看“战胜拖延”(担心失败版)
选项学习是强化学习的一种策略,通过定义、学习和切换选项来解决复杂任务,将大任务分解为可重复使用的子任务,以提高学习效率和适应性。面对因担心失败而拖延的问题,我们可以借鉴选项学习的思想:将大任务拆分为小目标,正视失败作为成长的一部分,回顾成功经验并寻求支持。通过这种方式,逐步增强自信,降低拖延现象。
|
6天前
|
算法 网络协议
【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法
【计网·湖科大·思科】实验三 总线型以太网的特性、集线器和交换机的区别、交换机的自学习算法
8 1
|
6天前
|
机器学习/深度学习 算法
应用规则学习算法识别有毒的蘑菇
应用规则学习算法识别有毒的蘑菇
|
6天前
|
机器学习/深度学习 算法 数据挖掘
【Python机器学习专栏】关联规则学习:Apriori算法详解
【4月更文挑战第30天】Apriori算法是一种用于关联规则学习的经典算法,尤其适用于购物篮分析,以发现商品间的购买关联。该算法基于支持度和置信度指标,通过迭代生成频繁项集并提取满足阈值的规则。Python中可借助mlxtend库实现Apriori,例如处理购物篮数据,设置支持度和置信度阈值,找出相关规则。
|
6天前
|
机器学习/深度学习 算法 前端开发
【Python机器学习专栏】集成学习算法的原理与应用
【4月更文挑战第30天】集成学习通过组合多个基学习器提升预测准确性,广泛应用于分类、回归等问题。主要步骤包括生成基学习器、训练和结合预测结果。算法类型有Bagging(如随机森林)、Boosting(如AdaBoost)和Stacking。Python中可使用scikit-learn实现,如示例代码展示的随机森林分类。集成学习能降低模型方差,缓解过拟合,提高预测性能。
|
6天前
|
机器学习/深度学习 算法 前端开发
Scikit-learn进阶:探索集成学习算法
【4月更文挑战第17天】本文介绍了Scikit-learn中的集成学习算法,包括Bagging(如RandomForest)、Boosting(AdaBoost、GradientBoosting)和Stacking。通过结合多个学习器,集成学习能提高模型性能,减少偏差和方差。文中展示了如何使用Scikit-learn实现这些算法,并提供示例代码,帮助读者理解和应用集成学习提升模型预测准确性。