zoukankan      html  css  js  c++  java
  • 说说个人对算法的理解(老物)

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

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

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

      工科学习更是如此。

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

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

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

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

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

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

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

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

      那就进入正题吧。

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

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

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

      为何这么说呢?

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

      何谓流程?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      并没有。

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

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

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

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

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

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

      算法如何体现其价值。

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

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

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

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

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

  • 相关阅读:
    一些关于视频相关基础概念
    熟悉某项目代码---零碎小知识总结
    C#中如何判断一个字符是汉字
    面试碰到一个这样的题------ 输入为一个字符串和字节数,输出为按字节截取的字符串
    C# 拼Json格式字符串 返回前段js 出错解决
    学习maple
    格林公式
    麦克斯韦方程组 (Maxwell's equation)的简单解释
    关于Ciarlet的泛函的一道homework的一个想法
    关于分开编写多个LaTeX文件的一点微小的总结
  • 原文地址:https://www.cnblogs.com/juwan/p/11448963.html
Copyright © 2011-2022 走看看