说说个人对算法的理解(老物)

  我认为,我不是一个合格的软件工程学生。

  可我觉得,我是一名合格的软件开发人员。

  因为在中国的这样的教育大环境,能学会自主思考和独立解决问题是一件很困难的事情。

  工科学习更是如此。

  我们中国的软件工程忽略了一件软件开发最核心的入门学习,有多少人知道何谓复杂度?比如时间、空间、系统复杂度。
  绝大部分是不清楚这些的,因为都没有坐下来好好看过有关算法理论的思考和分析。

  我们不见得要重理论轻实践,倒不如说,我更倾向于,先实践再理论后实践,依次轮回,这样我们才能彼此不落下,理论和实践是精密联系的,因为实践可以导出理论,理论可以教会实践去复用,知识亦如此。

  但,做得到这样的人,寥寥无几。这个年代的年轻人,被快餐和简单屏蔽了双眼,要静下心啃知识已经很难了。

  而算法这件事,如果不静下心来学习和思考,是理解不到何谓算法的。

  大多数走在前面的人都会说算法是内功,计算机专业很重要的知识。

  但这些人,也没讲,什么是算法,应该怎么学,为什么重要这些解释,都未曾提及。

  我想人主要原因在于,人都是自私的吧,毕竟自己辛苦学来的武功,怎会轻易教会别人呢?

  就算是我也不例外,所以我不会讲怎么学,但我会讲,什么是算法,算法的意义,至少留下一点,让后人可以寻迹的脚印。

  那就进入正题吧。

  算法,常定义为:算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。

  翻译成常人理解的话就是指 做事的流程 。

  算法其实并没有什么高深的,倒不如说,算法是存在于日常生活,但不会引起人们注意的一种知识。

  为何这么说呢?

  因为,算法就是描述一个流程的工具。

  何谓流程?

  万物运作都存有流程,而我们把这些流程统一起来,并赋予名词,便是算法。

  如果说,我作为一个物体,从A处移动到B处,该事情之间即存在着移动的这个流程,那么,我在A处,移动,B处,就可以形成一个流程,而这个流程的描述,即为算法。

  任何满足两件事物交互的流程,都可以被称为算法,但仅仅这样去学习算法是远远不够的。

  回想我们掌握数学知识的时候,一定会认识数字的最小单位,人为定义的整数 0,如果我们没有学习这件事情,便不会出现后来的123甚至是其他数域。

  算法亦如此,我们先明白最小流程单位,然后开始,研究对流程单位的运算和分析。

  我希望看到这里的你,学会使用联想能力。

  学问之间是想通的,是我老师说的话,当然我心里也清楚这个道理,但从我口中说出来这话显然没有信服力,有时候年龄还真的会决定一件事的正确性,尽管它不一定正确,因为正确这件事情,也是受到时间控制的,也是存在生命的,或者称为时效性(例如:新闻)。

  流程便是算法的核心体现,与其让我解释什么是流程,倒不如我多举几个例子给你来的实在吧?

  我们习惯于经验主义,所以往往会忽略对一个流程的思考,但经验这件事,即是流程的一种形式。

  所以,研究算法,就是在把各种经验统计出各种流程应用场景。

  如何买一个东西这件事,从面对面易物,到今天网购,本质都是购买物品这个事情,但流程是完全不同的,我们无法说哪个流程更好,也无法说,谁可以替代谁,只能说,根据场景,我们有不一样的选择。

  我就以此为例深入讲算法吧,反正对于现在的我,讲这些事情已然轻而易举,张口就来。

  算法主要有三个指标,空间、时间、系统。

  在软件上我们最希望的事情,就是,空间最少、时间最少、系统最小,这几件事。

  但事实上,这是不可能的,事情一定存在一个总量,我们仅是尽量去保持这样的标准去优化算法。

  我们不见得,网络交易就一定可以取代面对面交易,但会随着时间的流逝,其比重将会越来越大,产生这样的结果的原因,主要有几个基本理论去推导。价值最小理论,我们对一件事物的优化,一定会有一个价值比重,这个价值比重取决于当下的需求。

  因为物以稀为贵导出不可再生的事物为贵,价值最高,所以我们会认为时间和生命很重要,因为都没办法逆转才有它的稀有价值。

  所以面对面易物与网络交易彼此间面临着就是核心成本就是时间,而时间成本将会被不同场景体现出来,有交易渠道浪费的时间;有交易谈判浪费的时间;有交易流程浪费的时间;也有获取交易商品信息获取的时间;无一例外,都可以被折合为时间成本。

  而网络交易将节约大量不必要的时间成本,从而使得最终交易系统成本下降。

  而我说这些又和算法什么关系呢?

  事实上,就恰恰是这些现实生活的思考和启发才导致出算法的理论和应用,在交易这个案例中我们其实可以注意到几个要点。

  第一,所有的事情,都可以是算法的流程。
  第二,算法的事情,都可以被重新调整比重。
  第三,没有绝对的事情,学习算法不是为了得到最好的流程,而恰恰是为了选择最适合的(人生亦如此)。

  所以,我们真正掌握算法的时候,就是在让自己保持独立思考,确定一个最合适的方案,而不是所谓的“最好的”。

  如果你看到某个算法自称是某某算法中最好的算法,那这算法资料也没有继续看下去的必要了。

  话又转回来,我们知道了算法的本质,那么有应该怎样去设计一个合适的算法呢?

  遵循一个基本原则,付出最少,收获最大,这是第一阶段,讲究极限。

  算法一定有一个起始输入,在软件中,就是硬件内存输入,执行指令输入,然后我们在输入这件事情中得到输出,比如执行结果,比如执行时间。
  所以,我们需要评估,当输入一定的情况下,让输出的价值变大。反之,输出最小,输出不变。价值评估则根据需求决定,因为我们可能需要时间最短、效果最好、结果最优等不一样的结果。
  假设输出价值被确定为现阶段最大的情况下,我们就需要压低输入价值,假设输出价值一定,则减少输入的需求。换而言之,就是将输入最小,输出最大极限,让算法保持有利方向的最小状态。

  然后你以为这样就可以了吗?

  并没有。

  算法设计的第二阶段,追求不稳定状态,随机、浮动、变化、熵变,讲究平衡。

  当第一阶段达到瓶颈时,我们改追求均衡,折衷状态,这一阶段讲究的是,当该算法存在两种状态的价值比重,我们需要的不是一种绝对的结果,而是一个随机结果(结果仍然符合预期),比如,希望时间可以少一点,但又希望空间也可以少点,因为我们这里,时间和空间冲突了,两者存在负相关,而我们此时并不需要极限,而是需要一个混合状态,即稳定,而又不稳定的平衡状态,故此时,讲究的即为平衡。

  最后这个阶段没有一个准确的定义,不过在我这里,就是让算法保持进化。比如说输入是可以改变的,而输出是可以不变的,我们过去某一时期定义好的算法,是会随着输入的改变,重新改变价值比重总量,也就是说,过去的算法,在未来不一定是此时的最优,重新退回第一阶段的不满足状态,需要重新追求极限,再追求平衡,然后停下来,等待下一次状态的改变,可能是输入总量变化,也可能是输出结果的变化,但归根结底,它还是原来要做那件事的算法。

  甚至说,算法这件事情,本来就不局限在计算机领域。

  它在我看来,就是研究是人类做事流程的学科,不过是在软件里面掌握的比较系统罢了。

  当我们知道了怎么应用算法的理论了的时候,就是最后的话题了。

  算法如何体现其价值。

  我认为,任何做事的流程,都可以被计算和分析,拥有计算能力也就足以建立其价值体系。保持上述抽象原则,计算机即可拥有基本的进化能力,也就是自我升级来改进其工作流程(例如人工智能)。

  另一方面,程序员的工作结果的价值可以被宏观给出,过去我们认为,结果没有变化,也就等于没有做事,但实际上,如我所说的话,其实要做的事情还是很多的,只不过是看不到罢了。

  最后,无论你懂不懂算法,会不会这些,其实都不重要,重要的是,你有没有去思考去总结出,自己生活的点滴,将其形成一个抽象概念,变成自己的思考法则,进而辐射到其他领域,我认为,这点远远比单讲算法这件事情更重要,希望读者保持思考,让自己变得更值钱。

  本文到此结束,望各位读者,新的一年里,继续努力,不为别人,为自己,更好的活在这个世界。

  陈俊欢
  二〇一八年二月十六日

posted @ 2019-09-13 16:11  Juwan  阅读(1830)  评论(2编辑  收藏  举报