算法
算法是对特定问题求解步骤的一种描述,它是指定的有限数列,其中每一条指令表示一个或多个操作。
算法的5个特征:
有穷性:一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。
确定性:算法中每一条指令必须有确切的含义,读者理解时不会产生二义性。并且,在任何条件下,算法只有唯一的一条执行路径,即对于相同的输入只能得出相同的输出。
可行性:一个算法是能行的,即算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的。
输入:一个算法有零个或多个的输入,这些输入取自于某个特定的对象的集合。
输出:一个算法有一个或多个的输出,这些输出是同输入有着某些特定关系的量。
算法的设计要求
正确性:算法的正确性大概分为四个层次:程序不含语法错误;程序对于几组输入数据能够得出满足规格说明要求的结果;程序对于精心选择的典型、苛刻而带有刁难性的几组输入数据能够得出满足规格说明要求的结果;程序对于一切合法的输入数据都能产生满足规格说明要求的结果。通常以达到第三层意义的正确性作为衡量一个程序是否合格的标准。
可读性:算法主要是为了人的阅读与交流,其次才是机器执行。可读性好有助于人对算法的理解;晦涩难懂的程序易于隐藏较多错误,难以调和和修改。
健壮性:当输入数据非法时,算法也能适当地做出反应或进行处理,而不会产生莫名其妙的输出结果。处理出错的方法应是返回一个表示错误或者错误性质的值,而不是打印错误信息或异常并终止程序的执行,以便在更高的抽象层次上进行处理。
效率与低存储量需求:通俗的说,效率指的是算法执行的时间。存储量需求指的是算法执行过程中需要的最大存储空间。效率与低存储量需求都与这两者都与问题的规模有关。
算法效率的度量
度量一个程序的执行时间通常有两种方法:
1.事后统计的方法
2.事前分析估算的方法
一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于以下因素:依据的算法选用何种策略;问题的规模;书写程序的语言(对于同一个算法,实现语言的级别越高,执行效率就越低);编译程序所产生的机器代码的质量;机器执行指令的速度。
一个算法是由控制结构(顺序、分支和循环)和原操作(指固有数据类型的操作)构成的,则算时间取决于两者的综合效果。通常从算法中选取一种对于所研究的问题(或算法类型)来说是基本操作的原操作,以该基本操作重复执行的次数作为算法的时间量度。
一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数f(n),算法的时间量度记作:T(n) = O( f(n) )。它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同,称做算法的渐近时间复杂度,简称时间复杂度。
算法的存储空间需求
类似算法的时间复杂度,算法所需存储空间的度量称为空间复杂度:S(n) = O( f(n) )。其中n为问题的规模(或大小)。
我们在设计算法的时候,通常时间复杂度和空间复杂度是相互矛盾的,一般我们会采取牺牲空间换取时间的方式。当然,我们也要根据实际情况来设计合适的算法。