算法学习 | 与大师对话,翻阅大师手稿中的数学题

简介: 今天分享大师们遇到的有趣的数学题,探索解题的过程,寻找解决方案,以及怎样更加全面的思考问题。

前言

“如果我看得更远,那是因为我站在巨人的肩膀上。”牛顿这句话,时不时就浮现在我的脑海。

我想看得远一些,我的高度不够,所以我会找寻大师的智慧,学习大师思考问题的角度和方式,先依样画葫芦,然后再想办法创新。

今天分享大师们遇到的有趣的数学题,探索解题的过程,寻找解决方案,以及怎样更加全面的思考问题。

马克思的手稿

与大师对话

问:马克思先生,您觉得您遇到的哪个数学题很有趣。

答:稍等,我翻一下我的手稿。哦,我找到了,在这里。这是一道关于吃饭的问题......

手稿中的数学题

有30个人,其中有男人、女人和孩童。这些人在一家饭馆吃饭花了50先令,每个男人花3先令,每个女人花2先令,每个孩童花1先令。

请问男人、女人和孩童各有几人?

题目分析

假设x、y、z分别代表男人、女人和孩童。根据题目中的描述,可以列出以下两个等式:

           ①

      ②

两个等式相减得到一个新的等式:

                 ③

我们来分析一下等式③,由于人的特殊性,所以x,y为正整数,那么x的取值范围是1~9。将1~9这中间所有的数依次放入等式 ①和 ②中,计算y和z的值,答案可能不止一个。

算法设计

functioncountFunc() {
letx, y, z;
letcount=0; // 记录答案的个数console.log('------------------------');
for (x=1; x<=9; x++) {
y=20-2*x; // 根据等式③得到y的值z=30-y-x; // 根据等式①得到z的值if (3*x+2*y+z==50) { // 得到的x,y,z的值要符合等式②++count;
console.log('x:', x);
console.log('y:', y);
console.log('z:', z);
console.log('count:', count);
console.log('------------------------');
    }
  }
}
countFunc();

打印结果

算法复杂度

for循环语句执行次数是9,循环中3条语句的执行次数也是9,一共是36次,其他语句执行次数是1。

所以时间复杂度为O(1),因为没有使用辅助空间,所以空间复杂度是O(1)。

思考问题的角度

如果这就结束了,最多是解对了题,找到了答案,走了一条笔直的没有任何惊喜的路。

我们换个角度再想想这个问题,前面的解题思路是通过确定x的取值范围,然后确定y和z的值。

如果通过确定y的取值范围,然后确定x和z的值,或者先确定z的取值范围,行不行?

有没有更好的降低时间复杂度的算法?

自问自答

如何实现从掌握到精通?

这个问题目前我还不能回答的非常完整,但是我想先做个思路记录。

首先想要精通一门技术,肯定需要一段时间的研究,这个时间可以不是连续的,但是时间周期会比较长。这当中,会因为各种各样的原因,对技术失去热情。

所以目前看精通之路的「拦路石」有这么几个:

  • 学习周期太长,因时间成本过高,产生了动摇;
  • 技术太难,无论学习了多久,看了几遍,都感觉与技术「对面相看不相识」;
  • 学习了一段时间,感觉工作上用不上,弃坑了。

......

找到问题,就有方向找解决方案了。

之所以前面说,这些是我的思路记录,是因为我能总结有哪些挡在面前的难题,但是我还没有找到解决方案。不过,问题清单有了,还是可以帮助提供头绪的。

算法的难点

通过这段时间的学习和思考,我简单总结了对于自己来说,算法的难点:

  • 如何设计算法,使用什么算法策略比较好;
  • 如何确定算法的复杂性;
  • 复杂的算法,怎么学会它,理解它,掌握它;
  • 学习一段时间后,遇到新问题,仍然无从下手;
  • 怎么优化算法。

未完待续

其实将算法的难点罗列出来的时候,我心里已经有大致的努力方向了。

回避是以不面对的方式来面对问题,它是一种消极的解决问题的方式。

直面问题,找到困难点,想办法解决它。

这样想着,学习的兴趣浓烈了些。

目录
相关文章
|
12天前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
4月前
|
存储 算法 Go
算法学习:数组 vs 链表
算法学习:数组 vs 链表
50 0
|
16天前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
16 2
|
2月前
|
机器学习/深度学习 人工智能 资源调度
【博士每天一篇文献-算法】连续学习算法之HAT: Overcoming catastrophic forgetting with hard attention to the task
本文介绍了一种名为Hard Attention to the Task (HAT)的连续学习算法,通过学习几乎二值的注意力向量来克服灾难性遗忘问题,同时不影响当前任务的学习,并通过实验验证了其在减少遗忘方面的有效性。
54 12
|
2月前
|
算法 Java
掌握算法学习之字符串经典用法
文章总结了字符串在算法领域的经典用法,特别是通过双指针法来实现字符串的反转操作,并提供了LeetCode上相关题目的Java代码实现,强调了掌握这些技巧对于提升算法思维的重要性。
|
2月前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
2月前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-算法】连续学习算法之HNet:Continual learning with hypernetworks
本文提出了一种基于任务条件超网络(Hypernetworks)的持续学习模型,通过超网络生成目标网络权重并结合正则化技术减少灾难性遗忘,实现有效的任务顺序学习与长期记忆保持。
35 4
|
2月前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-算法】连续学习算法之RWalk:Riemannian Walk for Incremental Learning Understanding
RWalk算法是一种增量学习框架,通过结合EWC++和修改版的Path Integral算法,并采用不同的采样策略存储先前任务的代表性子集,以量化和平衡遗忘和固执,实现在学习新任务的同时保留旧任务的知识。
76 3
|
2月前
|
存储 机器学习/深度学习 算法
【博士每天一篇文献-综述】基于脑启发的连续学习算法有哪些?附思维导图
这篇博客文章总结了连续学习的分类,包括经典方法(重放、正则化和稀疏化方法)和脑启发方法(突触启发、双系统启发、睡眠启发和模块化启发方法),并讨论了它们在解决灾难性遗忘问题上的优势和局限性。
31 2
|
3月前
|
机器学习/深度学习 数据采集 算法
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
Python实现ISSA融合反向学习与Levy飞行策略的改进麻雀优化算法优化支持向量机回归模型(SVR算法)项目实战
113 9