既然活在地球上,其实大家的知识构架是差不多的,我说的意思就是,我也不能免俗,会给你讲出一个花来.我也是讲常用的算法,更多的是一种思想方式上的锻炼.还望周知.
一聊算法,肯定会说这句话"数据结构+算法 =程序",但是这句话真的是对的吗?早年我迷信这个,但是我慢慢觉得也不尽然,嘻嘻,后面写文再说.
Now,给算法下一个看起来不是那么高大上,但是接地气的定义:算法是指对特定问题求解步骤的一种描述.
接着来解释一下,一提一个算法,它必然不是孤立的,它肯定是带有一定现实世界的一个具体的应用场景的,其实算法从某种程度上面来讲就是对一个事情进行有限次步骤的抽象.目的是为了可重复性的执行,换取宝贵的时间来享受这短暂的一生.你说,难道不是吗?
来,返回正题,继续说定义,步骤的描述.一说步骤就肯定有一顺序的问题,你先我后,你我平行,而或是在什么条件下触发.这些都是在于具体问题的考量.既然是可重复性的动作,肯定有始有终,就是算法特性里面的,有穷性.既然聊到了算法特性,就把剩下的特性也一并交代了.
确定性:就是做什么什么事情是很明确的,比如去哪里取东西,必须详细的把这个动作序列用原子操作很清楚的表达出来.
可行性:这个就很有趣,一个算法的提出,肯定是为了解决一个问题,你连问题也解决不了,其实从工程学的角度来讲就是不可行.但是这里的内涵很简单,就是可以通过有限次的运算实现.是不是和确定性有点类似呢?
接着我们来做一些对算法的评估,那么首先给出一些标准是一个比较好的做法:
(1).正确性:这个放在首位,我相信没有意义吧.再说一次,算法就是解决特定问题题出来的产物.达不到预期的作用,这种东西的存在真的没什么意思
(2).可读性:是不是有点摸不到头脑呢?这是个啥,其实计算机行业发展了这么多年,程序的量,我主要说数量,是指数增长的.年初的时候,淘宝的公众号说,支付宝今年多写的代码量是5个魔兽的数量(我不知道还有多少人玩魔兽).我想说什么就是现代的软件工程,其实写程序并不是整个生命周期里面的最重要一环,而是后期维护.好的算法里面,标识符命名的明确,简洁易懂,注释和代码量达到一个均衡.
(3).健壮性:就是算法的初期其实是要读入很纯净的数据才可以给出你需要的结果.如果对这些非法数据一视同仁的话.也是违反了第一条对吧!
(4),高效性:是只效率很高.在机器硬件,和时间成本可以承担的前提下,做出正确的结果.这个高效性留在下个文章在讲.