算法的概念
算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务。一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用。
算法的定义:是对特定问题求解步骤的一种描述。算法是指令的有限序列,其中每条指令表示一个或多个操作。
算法的五大特性
- 输入: 算法具有0个或多个输入
- 输出: 算法至少有1个或多个输出
- 有穷性: 算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
- 确定性:算法中的每一步都有确定的含义,不会出现二义性
- 可行性:算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成
算法和程序
程序不一定满足有穷性。程序中的指令必须是机器可执行的,算法的指令无此限制。算法代表了对问题的解,而程序则是算法在计算机上的特定的实现。
一个算法用若用程序设计语言来描述,就是一个程序。
算法与数据结构
二者相辅相成。解决某一特定的算法可以选定不同的数据结构,而且选择恰当与否直接影响算法的效率。反之,一个数据结构的优劣由各种算法的执行来体现。
算法设计的要求
评价算法的标准:
- 正确性
- 可读性
- 健壮性
- 效率与存储量要求:
-
效率指算法运行时间
-
存储量指算法运行时占用的最大存储空间
-
正确性:实际情况下,无法把所有情况都输入到算法,也不能随便选择几个输入进行测试。所以要选择典型的、苛刻的、边缘的输入进行测试,看是否能得出正确的结果。
可读性和健壮性没什么说的,也很重要。
前三点没有具体的衡量标准,但是 效率与存储量要求是有方法衡量的。
算法效率的衡量方法和准则:
通常有两种衡量方法:
事后统计法,一般不采用,主要有两个缺点:
- 必须执行程序
- 其它因素掩盖算法本质
事前分析估算法
和算法执行时间相关的因素:
- 算法选用的策略(算法的思想)
- 问题的规模
- 编写程序的语言
- 编译程序产生的机器代码质量
- 计算机执行指令的速度
一个特定算法的“运算工作量”的大小,只依赖于问题的规模(通常用整数量n nn表示),或者说,它是问题规模的函数。
假如,随着问题规模n nn的增长,算法执行时间增长率和f(n) f(n)f(n)的增长率相同,则可记作:
T(n)=O(f(n))
称T(n) 是算法的 (渐进)时间复杂度。
如何估算算法的时间复杂度
算法=控制结构+原操作(固有类型操作)
算法的执行时间=原操作(i)的执行次数×原操作(i)的执行时间
算法效率衡量
执行时间反应算法效率
对于同一问题,我们给出了两种解决算法,在两种算法的实现中,我们对程序执行的时间进行了测算,发现两段程序执行的时间相差悬殊(214.583347秒相比于0.182897秒),由此我们可以得出结论:实现算法程序的执行时间可以反应出算法的效率,即算法的优劣。
单靠时间值绝对可信吗?
假设我们将第二次尝试的算法程序运行在一台配置古老性能低下的计算机中,情况会如何?很可能运行的时间并不会比在我们的电脑中运行算法一的214.583347秒快多少。
单纯依靠运行的时间来比较算法的优劣并不一定是客观准确的!
程序的运行离不开计算机环境(包括硬件和操作系统),这些客观原因会影响程序运行的速度并反应在程序的执行时间上。那么如何才能客观的评判一个算法的优劣呢?