凌小宁:算法的表述可以有多种形式:自然语言 (英文,中文…)各种计算机程序语言,甚至硬件,这是因为算法的本质是问题解决过程中的概念,而相应的程序只是它的一种表述。故而”算法为魂,程序为衣”,且一个程序还只是其一个衣服而已.

1. 算法是什么

1.1. 通用问题思考能力

解决算法问题是一个典型的“学以致用”的过程。对于计算机专业的同学来说,近乎大一大二两年,就已经将基本的算法和数据结构学习完了。数据结构大体就那么多;经典算法大体就那么多;算法设计思想也就那么几类。但是,面试者能否综合这些知识,解决一个一个算法问题?相信大家都明白,这并没有那么简单。 而实际上,在计算机的世界中,我们经常面对类似的情况。各类语言就摆在这里;各种 API 文档上写得一清二楚;各种工具也都唾手可得,从数据库,到数据平台;从正则表达式,到云计算服务;github 上各类开源项目应有尽有。我们能否合理组合这一切,完成我们想要的功能? 解决算法问题,近乎就是这个解决问题模型的缩影。—刘宇波

因此尽管在日常开发中可能不直接使用算法,也不考虑了解算法对使用产品和API的帮助,其带来的思维训练和技能锻炼依然无价的。

1.2. 如果企业不选择算法面试

典型的情况是:企业不需要考察“通用问题思考能力”。这就是很多小公司面试不考算法的原因。小公司并不会接触到那么多“全新的,创造性的问题”,因而更注重打工人的专业能力,一句话要能干活。 对于大厂,还有一种情况是:找能解决专门领域/特定问题的人才。比如企业想招聘一个数据库专家,面试问题就不应该是一堆动态规划。

2. 没有解法只能找最优解

TSP(Travelling Salesman Problem)问题是经典的十分重要又难以完全解决的问题.1

想要找到肯定的最优解,“最短路径”与”最小生成树”都是方法。但是在现实有限的资源下依然难以在有限的时间内解决,而即使给了充足的时间,相比于要完全解出来所花的时间也等于无解。那么在有限的时间与资源情况下,如何尽可能的找到接近最优解的解就变成了一个新的研究方向。 求解近似解,最普遍的方法是贪心算法,因为大多数问题不具备贪心性质,所以局部最优解的结果往往不是最优解,不过也或许够用了。 继而科学家在受到某些自然规律的启发后,模拟自然体算法,提出了若干启发式算法(Heuristic Algorithm),用于处理传统数学理论不易解决的优化问题2。科学家

  • 模拟蚁群寻找、搬运食物的规律,提出蚁群算法(Ant Colony Algorithm):用函数模拟“信息素”计算出一个值并决定调整方式
  • 模拟大雁在空中觅食的规律,提出粒子群优化算法(Particle Swarm Optimization Algorithm)
  • 模拟生物遗传与进化规律,提出遗传算法(Genetic Algorithm):结合两个解的优点,形成另一个更优解。

启发式算法有时较早地找到一组更优的解,从而使得在后续搜索中,可以直接把另外一些搜索的选择扔掉。这叫剪枝,比如A* 算法,爬山法模拟退火法等。 除了上述相对比较通用的算法。专门针对 TSP 问题,人们还发明了很多独特的,寻找近似最优解的算法,如最远插入法LKH算法等。

3. 机器学习算法

AI目前只能通过数据给出统计学上的答案,没有常识,没有逻辑推理能力,就好像一个古董业务爱好者拿着资料图册对比股东,相符的多便认为是正品;但是专家则在资料基础上更需要结合历史文化演变、材料工艺发展和社会经济制度来综合判断。

3.1. 监督学习

看大量题,对照答案,之后看新题就知道答案

3.2. 无监督学习

看大量题,没有直接答案,提取特征进行分类

3.3. 生成对抗网络

结合监督学习和无监督学习,无监督学习出题目,监督学习回答,相爱相杀

3.4. 强化学习

自由活动,做对了加分,做错了减分

Footnotes

  1. TSP讨论

  2. https://mp.weixin.qq.com/s/CstWZwZXhLS57TzMRdlV9A