浙江大学慕课《数据结构》学习笔记_1.2 什么是算法

第一讲 基本概念


1.2 什么是算法


定义

算法(Algorithm)

  • 一个有限指令集
  • 接受一些输入(有些情况下不需要输入)
  • 产生输出
  • 一定在有限步骤之后终止

每一条指令必须

  • 有充分明确的目标,不可以有歧义
  • 计算机能处理的范围之内
  • 描述应不依赖于任何一种计算机语言以及具体的实现手段

选择排序算法的伪码描述

void SelectionSort ( int List[], int N )
{ 
	/* 将N个整数List[0]...List[N-1]进行非递减排序 */
	for ( i = 0; i < N; i ++ ) 
	{
		MinPosition = ScanForMin( List, i, N–1 ); 
		/* 从List[i]到List[N–1]中找最小元,并将其位置赋给MinPosition */
		Swap( List[i], List[MinPosition] );
		/* 将未排序部分的最小元换到有序部分的最后位置 */
	}
}

抽象 ——

  • List到底是数组还是链表(虽然看上去很像数组)?
  • Swap用函数还是用宏去实现?

什么是好的算法?

  • 空间复杂度S(n) —— 根据算法写成的程序在执行时
    占用存储单元的长度。这个长度往往与输入数据的
    规模有关。空间复杂度过高的算法可能导致使用的
    内存超限,造成程序非正常中断。
  • 时间复杂度T(n) —— 根据算法写成的程序在执行时
    耗费时间的长度。这个长度往往也与输入数据的规
    模有关。时间复杂度过高的低效算法可能导致我们
    在有生之年都等不到运行结果。

空间复杂度的例子

void PrintN ( int N )
{
	if ( N )
	{
		PrintN( N – 1 ); 
		printf(%d\n”, N );
	}
	return;
} 
······1000009999999998············1······
  • PrintN(100000)
    • PrintN(99999)
      • PrintN(99998)
        • PrintN(99997)
          • ……
            • PrintN(0)

递归函数执行下一次函数时需要内存来存放该次函数,因此S(N) = C · N

而循环函数只需要存放一次函数,因此S(N) = C


时间复杂度的例子

double f( int n, double a[], double x )
{ 
	int i;
	double p = a[0];
	for ( i=1; i<=n; i++ )
		p += (a[i] * pow(x, i)); 
	return p;
} 

(1+2+……+n)=(n2+n)/2次乘法
T(n) = C1n2+C2n

double f( int n, double a[], double x )
{
 	int i;
	double p = a[n];
	for ( i=n; i>0; i-- )
		p = a[i-1] + x*p;
	return p;
} 

n次乘法!
T(n) = C · n


什么是好的算法

在分析一般算法的效率时,我们经常关注下面两种复杂度

  • 最坏情况复杂度
    Tworst( n )
  • 平均复杂度
    Tavg( n )

Tavg( n ) ≤ Tworst( n )

我们一般只关注最坏情况复杂度,因为平均复杂度有时会很难算。


复杂度的渐进表示法

  • T(n) = O(f(n)) 表示存在常数C >0, n0>0 使得当 n≥n0 时有 T(n) ≤ C·f(n)
  • T(n) = Ω(g(n)) 表示存在常数C >0, n0>0 使得当 n≥n0 时有 T(n) ≥ C·g(n)
  • T(n) = Θ(h(n)) 表示同时有 T(n) = O(h(n)) 和 T(n) = Ω(h(n))
    输入规模 n
    在这里插入图片描述
    在这里插入图片描述

复杂度分析小窍门

  • 若两段算法分别有复杂度T1(n) = O(f1(n))和T2(n) = O(f2(n)),则
    • T1(n) + T2(n) = max( O(f1(n)), O(f2(n)) )
    • T1(n) × T2(n) = O( f1(n) × f2(n) )
  • 若T(n)是关于n的k阶多项式,那么T(n)=Θ(nk)
  • 一个for循环的时间复杂度等于循环次数乘以循环体代码的复杂度
  • if-else 结构的复杂度取决于if的条件判断复杂度和两个分枝部分的复杂度,总体复杂度取三者中最大
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值