您现在的位置是:首页 >技术交流 >算法,离你并不遥远网站首页技术交流
算法,离你并不遥远
引子
今天又是搬砖摸鱼胡混的一天,在问答闲逛,看到了一个问答,题主对算法学习有了一点点的小疑问,问答地址:https://ask.csdn.net/questions/7921824。不知道题主是怎么看待算法这件事的,老顾认为,算法,就在我们身边,就在我们所写的任何代码里。
什么是算法?
在学校学习的小学生们,会说,加减法乘除法是算法,没错。中学生们会说,数学公式,物理公式,化学反应公式是算法,很对。大学生们会说,统计学,各种猜想是算法,都对。
那么,在计算机领域里,什么是算法?
计算机算法是以一步接一步的方式来详细描述计算机如何将输入转化为所要求的输出的过程,或者说,算法是对计算机上执行的计算过程的具体描述。
上边这个关于算法的描述,摘自百度百科。
那么,先不看百科后边的内容,以老顾的浅见,只要你使用计算机进行了编程,将数据正确的录入,正确的处理,在有限的时间内返回了正确的结果,那就是你实现了你的需求,这就是最基本的算法,那怕他再土,那怕他比较耗费时间,耗费计算机内的资源,他也还是算法。
再看百度百科对算法的定义。
一个算法必须具备以下性质:
(1)算法首先必须是正确的,即对于任意的一组输入,包括合理的输入与不合理的输入,总能得到预期的输出。如果一个算法只是对合理的输入才能得到预期的输出,而在异常情况下却无法预料输出的结果,那么它就不是正确的。
(2)算法必须是由一系列具体步骤组成的,并且每一步都能够被计算机所理解和执行,而不是抽象和模糊的概念。
(3)每个步骤都有确定的执行顺序,即上一步在哪里;下一步是什么,都必须明确,无二义性。
(4)无论算法有多么复杂,都必须在有限步之后结束并终止运行;即算法的步骤必须是有限的。在任何情况下,算法都不能陷入无限循环中。
一个问题的解决方案可以有多种表达方式;但只有满足以上4个条件的解才能称之为算法。
很好,这就是算法,当你写了一个简单的代码,那怕是两个数相加,得出结果,他也是算法。
比如老顾学编程的第一个代码,微机课老师在讲台上巴拉巴拉了半天,没听懂,就知道最后是让5个数字从小到大排个序。
很多小伙伴们直接就会告诉现在的老顾,冒泡排序啦,快速排序啦,归并排序啦等等等等8、9、十来种。老顾当时不懂啊,生生用 60 个 if 指令,121行代码完成了5个数字的排序。
那么,老顾在不使用各种排序算法的情况下,这121行代码算不算排序算法呢?老顾认为是算的,虽然他很土,虽然他不优美,虽然他效率低下,虽然他适用范围很小,虽然有各种各样的缺陷,但他能完成任意5个数字的排序,他是能得到正确结果的。所以,老顾认为这就是一个不那么能说的出口的算法实现。
为什么算法很重要?
其实,自从有了计算机以来,所有的操作都是受限于硬件条件的,为了在有限的条件内完成复杂的运算,所以算法被单独拿了出来。
所有的算法,都是有一个基本的隐藏条件在里面的,即在不使用超出当前计算机性能的情况下,尽可能快的完成一些复杂的计算。这是算法的唯一目标。
他是以节省计算机性能为目的而存在的,当我们有很多运算,每一个算法能节约一点性能,那么能完成的事情就越多。尤其是一些大量数据运算的时候,一个好的算法是可以用令人惊叹的速度完成一些计算的。
所以,在当前,计算机没有发展到无限性能时,节约内存,节约算力,才是算法的根本目的。
什么时候开始学算法?
其实,在学习编程的时候,你就已经踏入了算法的大门,就像老顾第一个代码一样,只要你能完成运算的流程控制,那么你就算是完成了基本的算法。就像是武学里一样,当你拿起了剑,一通乱挥,那也可以称之为吓激霸挥剑法。相声里还有王八拳呢,怕啥,能完成代码,得到正确的结果,过程可控可复现,那就是算法。
两个循环的控制,就可以完成排序中最入门的冒泡排序了,这难道不是算法吗?编写一个函数,计算阶乘,这难道不是算法了吗?再说到人工智能,大数据模型,他就是由无数小算法用大的方向控制并融合的一个更复杂的算法。
那么,算法就是从你学会流程控制,完成了第一个运算的时候,就已经陪伴在你身边了。
说回到问答的这个小伙伴,他的疑问则是另外的说法了。
狭隘的算法定义
按照这个小伙伴的描述,应该是在 leetcode 或者牛客之类的网站在刷题,目前自我解答能力不太够,可能无法得到比较好的成绩,所以迷茫了。他所认为的算法,就是这些题解中提到的什么动态规划,什么栈堆,什么指针之类的。
老顾在这里不得不吐槽一句,老顾靠写代码吃饭这么多年,真tmd的就不知道这些算法具体的名字叫个啥。反正是天下文章一大抄,这边抄来那边抄,抄来抄去就抄会了,但谁关心他叫啥,我关心的是能不能解决我的问题,能不能节约我的服务器的性能。
当然,老顾这么说不是觉得算法不重要,而是你不能狭隘的去看待算法,算法的存在目的刚才也说了,就是为了节约性能,很多题中都有具体要求,必能超过多少内存,不能超过多少时间,这就是为了给刷题的人提个醒,计算机的性能是有限的。所以,对于像 leetcode 这样的题库来说,他里面的题目大部分都是基础题,甚至有的只需要一两行代码就能完成的,他这些题是为了让没有见过类似题型、问题的人有一个见多识广的途径。刚才老顾也说来抄来抄去就抄会了,那怕你不在这些地方刷题,在工作中解决的问题多了,这些算法不说会大半,小半还是会有的。
而且,真正的需求,是开发人员进行问题拆分,拆成多个小问题,当一个小问题有对应的算法时,这就是相对优的解答了。大部分的码农,就是这样用现成的相对优的算法拼搭出来问题的解决方案和实现过程的。
算法从现在学起,从现在用起
老顾一直认为,计算机开发,其实就是一个搭积木的过程。他不需要你有特别高深的研究能力,只需要你见多识广,能用自己知识体系内的算法,或者百度、谷歌来的算法,完成你的任务,搭建好工程内容,那就是一个好的代码工人。
算法不仅仅是开发程序在用,计算机的一切,都是通过算法实现的,操作系统本身就是一个集各种算法于一身的整体,每个软件都有其自称体系的算法集合。
在刷 leetcode 的题目之前,老顾在工作中从没有碰到过01背包这样的问题,但是刷题之后,学会了这个,那么工作中,总会有用得到的时候。不怕学的多用不上,而是怕到用的时候,根本就没有概念,不知道怎么解决。
所以,老顾对所有刚刚入行,以及所有没有深入学习的小伙伴们送上一句祝愿:算法,从现在学起,从现在用起。
计算机算法并不高深,他不用我们去弄懂那些犹如天数一般的数学公式,只需要我们会用,那就是好的。从来没有听说过厨师还会自己打一口锅,造一把刀的,会用,就是开发人员的基本要求。
算法永不过时
老顾流浪在培训班的时候,有个姓冀的老师,嗯也是高校高学历人才,对老顾说,你用程序画个哆啦A梦需要多少行代码?老顾想了想,琢磨了琢磨,不打确定的说,大概需要80行(basic)?那位老师就说,想办法优化代码,能写到50行以内算合格,大拿们30行左右就能搞定。
然后听这个老师说,有个世界 demo 大赛,那里面全都是天才,几十kb的代码,能完成普通人所想象不到的绚烂效果(时过境迁,现在也不知道当初的惊艳能不能撼动现在网民们的神经了),这些才是当前的算法极致。可以说,老顾最终走上靠代码吃饭的路,这位老师的影响真的很大。
在那个时期,老顾在这位老师的带领下,算是学到了很多基础的编程算法,为老顾现在打下了坚实基础。现在回过头来看,虽然老顾并不知道这些算法的专门名称,但并不妨碍老顾去运用他们。而且,越是基础的算法,运用就越广泛,在完成了基本流程控制的学习后,越早接触算法,越容易解决一些问题。就像数学一样,基础的永远是用的最多的。