数据结构——2.算法及算法分析

数据结构

2.算法及算法分析

算法:是指令的有限序列,是对特定问题求解步骤的描述。
算法具有下列5个重要特性:
1.有穷性:步骤有限,执行时间有限。
2.确定性:有确切的合义,无二义性,算法只有唯一的一条执行路径。
3.可行性:可以通过已经实现的基本运算执行有限次来实现的;
4.输入:算法具有零个或多个输入。
5.输出:算法具有一个或多个输出。

算法和程序的区别:
(1)在执行时间上,算法所描述的步骤一定是有限的,而程序可以无限地执行下去。因此程序并不需要满足上述的第一个条件(有穷性)。例如操作系统程序,是一个在无限循环中执行的程序,因而不是一个算法。
(2)在语言描述上,程序必须采用规定的程序设计语言来书写,而算法没有这种限制。

设计一个好的算法通常要考虑达到以下目标:
1.正确性:算法应能正确地实现预定的功能;
2.易读性:算法应易于阅读和理解,以便于调试、修改和扩充;
3.健壮性(鲁棒性):当环境发生变化(如遇到非法输入)时,算法能适当地做出反应或进行处理,不会产生不正确的运算结果;
4.高效率:具有较高的时间和空间性能。

算法的评价方法常分两类:
1.事前分析估计
2.事后统计

算法的时间复杂度

算法的时间复杂度(Time Complexity):T(N)是该算法的时间耗费,是其所求解问题规模N的函数。当问题规模N趋向无穷大时,不考虑具体的运行时间函数,**只考虑运行时间函数的数量级(阶)**这称为算法的渐进时间复杂度(Asymptotic Time Complexity)。

渐进表示法的常用记法如下:
大O表示法 T ( N ) = O ( f ( N ) ) T(N)=O(f(N)) T(N)=O(f(N))
说明:如果存在常量c>0和正整数 N 0 N_0 N0>=1,当 N ≥ N 0 N\geq N_0 NN0时有 T ( N ) ≤ c f ( N ) T(N)\leq cf(N) T(N)cf(N)。即给出了时间复杂度的上界,不可能比cf(N)更大。

语句的频度(frequency count):指的是该语句重复执行的次数。
常通过计算基本操作的语句频度,求解时间复杂度。

【例3】分析下述程序段的时间复杂度。
{++x;S=0;}
选取“++x;”为基本操作,语句频度为1,则时间复杂度为O(1),即常量阶

【例4】分析下述程序段的时间复杂度。
for(j=1;j<=10000;++j){
++X;S+=x;}
选取“++x;”为基本操作,语句频度为10000,则时间复杂度为O(1),即常量阶

【例5】分析下述程序段的时间复杂度。
s=0;
for(j=1;j<=n;j*=2)
++x;
选取“++x;”为基本操作,语句频度为 log ⁡ 2 n \log_2n log2n,则时间复杂度为O( log ⁡ n \log_{}{n} logn),即对数阶

【例6】分析下述程序段的时间复杂度。
for(i=1;i<=2*n;++i){
++x;s+=x;}
选取“++x;”为基本操作,语句频度为2xn,则时间复杂度为0(n),即线性阶

【例7】分析下述程序段的时间复杂度。
for(j=1;j<=n;++j){
for(k=1;k<=n/4;++k){
++x;s+=x;}
}
选取“++x;”为基本操作,语句频度为nxn/4,则时间复杂度为 O ( n 2 ) O(n^2) O(n2),即平方阶

【例8】分析下述程序段的时间复杂度。
s=0;
for(j=1;j<=n;j++)
for(k=1;k<=j;++k)
++x;
选取“++x;”为基本操作,语句频度为(1+n)xn/2,则时间复杂度为 O ( n 2 ) O(n^2) O(n2),即平方阶

并非所有的双重循环的时间复杂度都是 O ( n 2 ) O(n^2) O(n2),下面举例说明。
【例9】分析下述程序段的时间复杂度。
for(j=1;j<n;j*=2){
for(k=1;k<=n;++k){
++x;s+=x;}
}
时间复杂度为 O ( n log ⁡ 2 n ) O(n\log_2n) O(nlog2n),即线性对数阶

冒泡排序的算法:
最好时间复杂度: O ( n ) O(n) O(n)
最坏时间复杂度: O ( n 2 ) O(n^2) O(n2)
平均时间复杂度: O ( n 2 ) O(n^2) O(n2)
选择最坏情况和平均情况,得出冒泡的时间复杂度是 n 2 n^2 n2

算法的空间复杂度

如果所需额外空间相对于输入数据量来说只是一个常数,则称此算法为“原地工作”,此时的空间复杂度为 O ( 1 ) O(1) O(1)
例:问题的规模是n,
(1)若使用了大小是n的辅助一维数组,则空间复杂度为? O ( n ) O(n) O(n)
(2)若使用了大小是n*n的二维数组,则空间复杂度为? O ( n 2 ) O(n^2) O(n2)
(3)若使用了100个辅助变量,则空间复杂度为? O ( 1 ) O(1) O(1)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值