什么是算法?算法工程师的知识结构

本文打算科普一下什么是算法?算法工程师需要必备哪些知识和技能?适合非专业人士阅读,也适合专业人士阅读;我们先引用定义:

算法是解决特定问题求解决步骤的描述,再计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。

就是程序员在编写程序时,按问题的需要会针对这个问题写一些代码(算法最终也是用程序体现出来),说人话吧:

用程序来解决问题的方法。

方法中即包含了思路和步骤,但又不限于此,还包括数据在计算。机中的组织方式。

算法的特点

IO:只要是程序,就必需有输入输出。输入可以是前端普通用户,也可以由程序(机器)或者自动获取其某些需要的数据来输入。输入输出,可以不输入造成0输出(0输入=>0输出,反之未必哦,0输入是必要条件不是充分条件);也可以1输入然后1输出或者多输出;也可以多输入1输出或多输出。

如果你让上面这段话绕晕了,没关系,我们举个栗子:

你用搜索引擎搜索,一般情况下你在搜索框里会搜一个词或一句话,然后搜,这就完成了输入(Input),二般情况下你可能会搜一个词或一句话然后空格一下,再打一个词或一句话,然后搜,三般情况下你可能会搜三个词或句,每个用空格隔开,依此类推......你会发现,不管你用几般的搜法,都会有好多页或满满一页这就是输出(结果),极少出现只有一条或几条链接的情况。除了显示一条链接是1个输出,其它的都算多个输出。当然,大多数情况下列出的链接都不是你想要的结果。

有穷性:你解决问题总不能没完没了吧。

确定性:非常肯定的这个方法能搞定这个问题。

可行性:你明天穿越回古代,当下可行吗?可能性有多高?

算法还和什么有关?

如上文提到“数据在计算机中的组织方式”,这指的是空间(数据的空间结构,详见计算机专业核心课程之一《数据结构》一书。),除这外还和时间有关,两者结合起来就是和时空有关。说到时空是不是想起现在热门话题量子、相对论这类物理学问题?其实,学问都是相通的。如果是学文科的人看到可能有些心虚,没关系,搞一句你能秒懂的,这句话非常精确地指出了程序、算法的核心:

太初有道,道生时空,故时空乃程序设计之阴阳。

我个人非常喜欢这句话。用道(一阴一阳之谓道)来形容程序的核心本质,再合适不过。

是不是个个程序员都懂算法?

这个问题不精确;所以以不精确的回答方式答案是:不一定。算法,怎么才算“懂”,一般一个高中毕业生,或非强相关专业的大专、本科生想成为程序员去参加编程培训(全天,一般不超过三个月时间,包括实例训练),一般不懂算法。但是数学计算机专业科班出身(认真学习的那种,不是混的)都懂基础的算法。对了,高中生会学习递归、递推两种算法,这两种广泛应用于DNS中。不懂啥是DNS也没关系,你只要知道什么是网址,你在浏览器上输出一个网址,就出直接出现这个网站。这个过程应用了递归和递推两种算法(如果你想成为网络工程师,必需会用图示+文字来描述这个哦)。

想成为算法工程师怎么学习算法?

嘿嘿嘿。简单地说:任何人都可以学,前提条件还是跟时空有关,就是你有时间、最好还有让你安静的空间,如果没有,你可以去当地图书馆,这够安静了。

复杂地说嘛,这个...比较难...因为涉及具体操作问题,这是一个不断脱几层皮的问题,是一个不断挑战自已不断过关的问题。我总结了一下,总的来说有三大关:

1、程序设计

必需学习低级语言(汇编语言)+中级语言(C语言)+高级语言(PHP、GO、RUST等任选一)

2、电子、计算机基础理论知识

电子最少学数电、单片机;计算机主要学其专业主干课程:《计算机组成原理》、《微机原理》、《操作系统》、《数据结构》、《数据库原理》、《算法分析与设计》、《TCP/IP协议》、《网络安全》、《形式语言与自动机理论》、《编译原理》

3、数学

一般地,计算机专业会学习《高等数学》、《线性代数》、《概率论与数理统计》、《离散数学》最少四门数学课,注意是最少。特别地,离散数学可以拆分成《集合论》、《组合数学》、《图论》、《数理逻辑》、《抽象代数》等数学课程,而高等数学后续建议学习《复变函数》、《积分变换》(或《傅里叶分析》)。

总的来说,数学学得越多越好,对算法设计的帮助是绝对性的。有可能的话,数学课的课程都可学习。以上大方面的知识,是一名合格的算法工程师必备的知识结构,但远远不够,必需独立思考问题、分析问题、解决问题。如果你具体了上述知识,那还必需在后续的工作中不断学习数理方面的知识。

稿源:TechTMT.Com原创首发

猜你喜欢
微信 WeChat新浪微博TwitterTelegram搜索linkclock