(一)什么是算法?——算法设计与分析


一、基本定义

1.1 计算的定义

可由一个给定计算模型机械地执行的规则或计算步骤序列称为该计算模型的一个计算。

注意:

  • 计算可能永远不停止(区别于算法)
  • 一个计算机程序是一个计算(计算模型是计算机)

1.2 算法的定义

算法是一个满足下列条件的计算:

有穷性/终止性:有限步内必须停止

确定性:每一步都是严格定义和确定的动作

能行性:每一个动作都能够被精确地机械执行

输入:有一个满足给定约束条件的输入

输出:满足给定约束条件的结果


1.3 问题的定义

I n p u t Input Input O u t p u t Output Output是两个集合。

一个问题是一个关系 R ⊆ I n p u t × O u t p u t R\subseteq Input\times Output RInput×Output I n p u t Input Input称为问题 R R R的输入集合, I n p u t Input Input的每个元素称为 R R R的一个输入, O u t p u t Output Output称为问题 R R R的输出或结果集合, O u t p u t Output Output的每个元素称为 R R R的一个结果。

问题定义了输入和输出的关系。一个算法面向的是一个问题,而不是仅仅求解问题的一个或者几个实例。(说人话就是,算法是一类问题的通解)


二、算法分析

2.1 正确性分析

2.1.1 正确性

算法的正确性:如果一个算法对于每一个输入都最终停,而且产生正确的输出,那么我们认为该算法是正确的。

相应地,不正确算法有两种情况:①不停止;②输出结果错误。

类似地,定义近似算法:①对所有输入停止;②输出结果近似正确,或者错误量少。


2.2.2 循环不变量

(1)定义

循环不变量方法是证明主要结构为循环结构的算法正确性的方法。

循环不变量:数据或者数据结构的关键性质,依赖于具体算法。

(2)证明方法:

初始时:循环开始前,循环不变量成立

循环中:循环体每执行一次,循环不变量成体

终止后:算法结束后,循环不变量保证算法正确

以插入排序为例:

//Insertion-sort(A)
for j=2 to n do:
	key = A[j]
	i = j-1
	while i>0 and A[i]>key do
		A[i+1] = A[i]
		i = i-1
A[i+1] = key

其中:

循环不变量为:A[1, 2,...,j-1]来自输入且有序

初始时, j = 2 j=2 j=2,循环不变量成立( A [ 1 ] A[1] A[1]来自输入且有序)

循环时:循环不变量成立( A [ 1 , 2 , . . . , j − 1 ] A[1, 2,...,j-1] A[1,2,...,j1]来自输入且有序)

终止后: j = n + 1 j=n+1 j=n+1,循环不变量成立,且保证算法正确( A [ 1 , 2 , . . . , n ] A[1,2,...,n] A[1,2,...,n]来自输入且有序,并且使得数组达到了排序的目的)


2.2 复杂性分析

复杂性分析用于预测算法对于不同输入所需要的资源量。一般分为时间复杂度和空间复杂度,并称时空复杂度。

具体如何求解时空复杂度将在以后讲解,这里给出定义。


2.2.1 时间复杂度

(1)定义

该算法对于给定输入,求解问题所需的原子操作的步数。

一般有最好时间复杂度、最坏时间复杂度、平均时间复杂度。对于一些含有随即性质的算法,还会有期望复杂度等。

注意:

①时间复杂度是输入大小的函数;

②即使实际上每步需要的时间量不同,但我们仍假设执行每一步所需要常数时间。


2.2.2 空间复杂度

(1)定义

该算法对该输入产生结果所需要的额外存储空间大小。


2.2.3 复杂度的分类

I n p u t Input Input是问题 R R R的输入集合, C o m p l e x i t y ( X ) Complexity(X) Complexity(X)是求解 R R R的算法 A A A的复杂度函数, S i z e ( y ) Size(y) Size(y)是问题输入大小的函数。

(1)最坏(大)复杂度
M a x { C o m p l e x i t y ( S i z e ( y ) ) ∣ y ∈ I n p u t } Max \left \{ Complexity(Size(y))\mid y\in Input\right \} Max{Complexity(Size(y))yInput}
(2)最好(小)复杂度
M i n { C o m p l e x i t y ( S i z e ( y ) ) ∣ y ∈ I n p u t } Min \left \{ Complexity(Size(y))\mid y\in Input\right \} Min{Complexity(Size(y))yInput}
(3)平均复杂度
∑ y ∈ I n p u t p y × C o m p l e x i t y ( S i z e ( y ) ) \sum_{y\in Input}p_y\times Complexity(Size(y)) yInputpy×Complexity(Size(y))
其中, p y p_y py是任意 y y y作为输入的概率

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友人帐_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值