2021年1月
1、首先要清楚算法究竟能为程序作出什么样的贡献:
请查阅:《【算法之美】改变世界的十位算法大师》
url:https://blog.csdn.net/kexuanxiu1163/article/details/99912481
普通学生最合适的比赛:
个人赛:
蓝桥杯:https://www.lanqiao.cn/
团体赛:
ACM:https://www.acm.cat/
天梯赛:https://gplt.patest.cn/regulation
国内当前比较靠谱的比赛有:
DC竞赛:http://www.dcjingsai.com/ 阿里天池 京东JDATA:https://jdata.jd.com/ DataFountain:https://www.datafountain.cn/ Kesci:https://www.kesci.com/home/competition 百度大脑:https://aistudio.baidu.com/aistudio/competition 腾讯广告:https://algo.qq.com/application/home/home/index.htm AI争霸赛:http://www.justallinai.com
其中,阿里天池和腾讯、京东、百度比赛的大神太多,AI争霸赛是新起来的小平台,最近在搞AI翻译比赛,一等奖60w人民币奖金,很多大神不知道,新手来说拿奖比较容易
2、了解一下算法与非算法的区别:
一般来说,可以把编程工作分为两种,一种是面向实现的,一种是面向优化的。前者如实现一个功能、搭建一个服务、实现一种展现交互方式等。更关注的是如何实现功能,如何对于各种复杂甚至小众的场景都不出错。互联网中典型的后端、前端、平台、网络工程师的主要工作是这一类。
如果一些功能已经实现了,你主要需要优化它,那这类工作一般比较偏向算法。其中一个关键是你的优化目标要是客观可量化的。比如一些代码优化的工作是提升代码的可维护性、可读性和可扩展性。这个优化目标具备比较强的主观性,难以形成量化的指标,属于设计模式主要关注的问题,一般不纳入算法范畴。
另一个区分算法与非算法工作的重要特征是一般涉及数学知识较多的编程工作更偏向算法。比如对于面向优化的编程工作,为了很好地衡量可量化的目标,其数学定义往往比较明确,相应引入的数学知识会比较多。
那么如果面向实现的编程工作也依赖大量数学知识时是否算作算法呢?其中一个例子是可计算性理论,它涉及到可判定性问题、数理逻辑等问题都需要大量复杂的数学知识。这种情况下,它其实更关心何种问题原则上是否可用算法解决,在实际工程领域中并没有大量的岗位与之相匹配,所以本文暂不将其作为算法工程师所考虑的范围。
3、不同种类算法之间的区别
如果你的优化目标是要降低程序的时间复杂度与空间复杂度,它们都是能够比较严格地量化定义的,就属于经典的“数据结构与算法”中关注的“算法”的问题。LeetCode中大部分Algorithm的题目都属于此类,也是互联网面试中的高频考点,如常见的分治、递归、动态规划等。在实际工作中,特别是一些架构师相关的角色,会着重关注这类问题,比如提升增删改查的速度、降低其内存消耗等等。相应的数学理论是计算复杂性理论,依赖的数学知识包括离散数学、组合数学、图论等。
如果你的优化目标是要降低在未见过的case上的预测误差,这是典型的机器学习中的算法问题。这里面涉及到一些核心的概念,包括:泛化误差、训练误差、过拟合、欠拟合、偏差等。相应的算法岗位非常多,图像算法、语音算法、自然语言处理算法、搜索推荐算法等。
这里推荐几适合大专及普通本科学习的书,个人认为内容很不错(渐进式):《唤醒思维的数学书》·张鹤、《对思想和方法的基本研究》、《计算机离散数学基础》。
机器学习算法还可以根据优化目的的不同进行进一步的细分。如果训练数据带有标签,优化目标是降低预测标签的误差则是最常见的有监督学习。如果训练数据不带标签,则是无监督学习。而如果此时又非要预测对应的标签,则有降维和聚类两种算法。如果仅仅是为了拟合训练数据的分布,生成式算法。
它的数学理论是计算学习理论,依赖的数学知识包括概率与统计、最优化理论、线性代数与矩阵论等。
当然,最优化本身就是一种算法。稍微严格一点的表述是在一定的约束条件下控制自变量达到目标函数最优的问题。最优化问题也叫作运筹学,在工程界应用非常广泛。典型的如外卖骑手调度、网约车调度、航班调度、物流路径调度、广告/补贴金额投放等。
最优化算法的种类也比较多,以自变量是否连续可分为连续最优化和组合优化。很多计算复杂度优化算法可以看做一种广义的组合优化问题。机器学习算法一般是连续最优化问题。
4、搞算法的也就是面向优化:
所以,你大概知道你未来的发展之路了吧。
恭喜你,拿个国一也只是万里长征的开始。
加油,高级匠人。