课程名称: 算法与数据结构
课程章节:第1章 欢迎大家来到算法与数据结构的世界
课程讲师: lewis
课程内容:了解算法
课程介绍:
第1章 欢迎大家来到算法与数据结构的世界
1-1 欢迎大家来到算法与数据结构的世界
1-2 学习算法和数据结构到底有没有用?
1-3 更多课程学习注意事项
1-4 课程编程环境的搭建
1-5 JDK 的国内下载链接
tip:现在的产品体系,尤其是TOB端的总项目监理,对数据结构及算法以及算法复杂度的理解必须达到一定高度,才能够在协调厂商的项目会上,有理有据有节的指出核心问题,快速梳理专业形象。
数据结构+算法=程序
算法是对特定问题求解步骤的一种描述。
以下是整理的章节的思维导图:
算法的五个基本特性分别是:输入、输出、有穷性、确定性和可行性。
(1)输入/输出:算法具有零个或多个输入,算法至少具有一个或多个输出。
(2)有穷性:是指算法在执行有限的步骤后,自动结束而不会出现无限循环,并且每个步骤在可接受的时间内完成。
(3)确定性:算法的每个步骤都有明确的含义,不会出现二义性。
(4)可行性:算法的每一步都必须是可行的,也就是说,每一步都通过执行有限次数完成。
举个栗子:
把这个流水线视同于一个算法:
确定性:目标是生产小黄人,整个算法也就是为这个服务的。如果生产出来的是史莱姆就有问题,需要去排查纠错。
输入: 香蕉
输出:小黄人
可执行性: 算法的每一个步骤,也就是产线的每一个环节,必须运行正常,输入后才能有正确的输出。
有穷性:有多少香蕉就会产生对应比例的小黄人,没有香蕉就停止,不生产了。
作为一名产品深入骨子里的ROI分析,投入产出比和效率问题就是算法的体现。
一张图表示好的算法应该具备的特性:`
正确性是指算法能够满足具体问题的需求,程序运行正常,无语法错误,能够通过典型的软件测试,达到预期。
算法遵循标识符命名规则,简洁易懂,注释语句恰当适量,方便自己和他人阅读,便于后期调试和修改。
一段好的算法代码:
步骤清晰,缩进合适。备注简明扼要,让人一目了然,降低了阅读障碍,符合人的视觉认知习惯
下面再来看一段屎山代码:
public static void main(String[] args) { int a = args.length; int b = 42 / a; if (a == 1) { a = a / (a - a); } if (a == 2) { int c[] = {1}; c[42] = 99; } } 上边的代码很直率,既不考虑 a 可能为 0 的情况,也不考虑数组越界。直来直去,兄弟,你这样我很难搞啊。
接手和研读一堆屎山代码是很痛苦的事情,己所不欲勿施于人,相信都有遇到这种抓狂的情况。个人认为技术的核心技能是解决问题的能力和思维,而不是堆码量,活做细点后面可以减少很多麻烦,有了良好的习惯和思路,到哪里都能快速体现自己的价值。
指一个系统或者算法在受到外部扰动或内部参数摄动等不确定性因素干扰时,系统扔保持其结构和功能稳定。
我们来参考两个个机器人系统,我们希望机器人从A点像B点行进,如果中途机器人倒下,一号机器人只能停下,但二号机器人可以自行的爬起继续像B点前进,我们就认为一号机器人不具有鲁棒性,而二号有较好的鲁棒性。
图形识别算法中,对抗性扰动的算法和训练,就是算法的鲁棒性应用。
还有在实际应用的过程中, 比如运行实例的重启,加最大计算数量限制强行停止,超过等待时间中断等算法就是为此而诞生的。
高效性是指算法运行效率高,即算法运行所消耗的时间短。也就是通常意义的时间复杂度。
低存储性是指算法所需的存储空间小。对于像手机、平板电脑这样的嵌入式设备,算法如果占用空间过大,则无法运行。算法占用的空间大小被称为空间复杂度。
算法对非法数据及操作有较好的反应和处理。例如,在学生信息管理系统中登记学生年龄时,若将21岁误输入为210岁,则系统应该有错误提示。
还有类似 邮箱、身份证、电话号码、密码强度等验证算法都是如此。
除了(1)~(3)中的基本标准之外,好算法的评判标准是高效率、低存储。
通过本章的学习,我个人发现数学相关的一些概念已经还给老师了,需要后续加强学习。