开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
一、什么是算法
在运用算法解决具体问题前,我们要先了解什么是算法,首先算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作;此外,一个算法还具有5个重要特性:
(1)有穷性 一个算法总是(对任何合法的输入值)在执行有穷步后结束,且每一步都可在有穷时间内完成。
(2)确定性 算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。并且,在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的输出。
(3)可行性 一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现。
(4)输入 一个算法有零个或多个的输入,这些输入取自某个特定的对象的集合。
(5)输出 一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量。
二、算法设计的要求
通常设计一个“好”的算法应考虑达到以下目标。
(1)正确性(correctness)算法应当满足具体问题的需求。通常一个大型问题的需求,要以特定的规格说明方式给出,而一个实习问题或练习题,往往就不那么严格,目前多数是用自然语言描述需求,它至少应当包括对于输入、输出和加工处理等的明确的无歧义性的描述。设计或选择的算法应当能正确地反映这种需求;否则,算法的正确与否的衡量准则就不存在了。
(2)可读性(readability) 算法主要是为了人的阅读与交流,其次才是机器执行。可读性好有助于人对算法的理解;晦涩难懂的程序易于隐藏较多错误,难以调试和修改。
(3)健壮性(robustness) 当输入数据非法时,算法也能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。例如,一个求凸多边形面积的算法,是采用求各三角形面积之和的策略来解决问题的。当输入的坐标集合表示的是一个凹多边形时,不应继续计算,而应报告输入出错。并且,处理出错的方法应是返回一个表示错误或错误性质的值,而不是打印错误信息或异常,并中止程序的执行,以便在更高的抽象层次上进行处理。
(4)效率与低存储量需求 通俗地说,效率指的是算法执行的时间。对于同一个问题如果有多个算法可以解决,执行时间短的算法效率高。存储量需求指算法执行过程中所需要的最大存储空间。效率与低存储量需求这两者都与问题的规模有关。求100个人的平均分与求1000个人的平均分所花的执行时间或运行空间显然有一定的差别。
三、算法效率的度量
(1)事后统计的方法 (2)事前分析估算的方法
四、关于算法分析
根据对算法的分析,我们知道一个算法是由控制结构(顺序,分支和循环3种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。
其实算法分析的目的是分析算法的效率以求改进。在往后的学习中会继续了解有关算法的其他概念。