算法分析的两个主要方面:时间复杂度和空间复杂度
1、时间复杂度大O记法
用f(n)来抽象表示一个算法的执行总次数。因此可以推导出所有代码的执行总时间T(n)和每行代码的执行次数n之间的关系是:
T(n)=O(f(n))
公式中的O表示代码的执行总时间T(n)和其执行总次数f(n)成正比。这种表示法,称之为大O记法。大O记法T(n)=O(f(n)),表示随问题规
模n的增大,算法执行时间的增长率和f(n)的增长率相同,表示的是算法的渐近时间复杂度,简称时间复杂度。
2、时间复杂度分析
时间复杂度分析有一个基本的法则,就是四则运算法则。
-
加法法则,如果算法的代码是平行增加的,那么就需要加上相应的时间复杂度。
-
乘法法则,如果算法的代码增加的是循环内的嵌套或者函数的嵌套,那么就需要乘上相应的时间复杂度。
-
减法法则,如果是去掉算法中平行的代码,就需要减掉相应的时间复杂度。
-
除法法则,如果是去掉嵌套内的循环或函数,就需要除去相应的时间复杂度。
时间复杂度分析另外几个常用的结论:
-
加法常数项可以忽略
-
除去最高阶项,其它次项可以忽略
-
与最高次项相乘的常数可以忽略
3、常见时间复杂度
常见时间复杂度主要有以下几种:
常数阶 O(1)
用常数1取代运行时间中的所有加法常数。
对数阶 O(logn)
线性阶 O(n)
线性阶表示代码要执行n次
线性对数阶 O(nlogn)
线性对数阶O(nlogn)
就是将一段时间复杂度为O(logn)
的代码执行n次
平方阶 O(n²)
将时间复杂度为O(n)的代码再执行n次
4、最好、最坏、平均情况时间复杂度
对于这种最理想情况的时间复杂度我们称之为最好情况时间复杂度。
对于这种最坏情况下的时间复杂度我们称之为最坏情况时间复杂度。
但是,不论是最好情况还是最坏情况,都是极端情况下才会发生的,因此为了更好的表示一个算法的时间复杂度,我们需要引入平均情况
时间复杂度。
5、均摊时间复杂度
有时,会出现一个算法的复杂度比较高,但是该算法是和其它操作是一起的,在将这个较高复杂度的算法和其它操作一起进行复杂度分析
时,需要将其均摊到其它操作上,这种分析称之为均摊复杂度分析。
6、空间复杂度
算法的空间复杂度通过计算算法所需的存储空间实现,算法空间复杂度的计算公式记作:S(n)=O(f(n)),其中n为问题的规模,f(n)为语句关于n所占存储空间的函数。
判断题
1、数据结构概念包括数据之间的逻辑结构、数据在计算机中的存储方式和数据的运算三个方面。
T
2、数据的逻辑结构说明数据元素之间的顺序关系,它依赖于计算机的存储结构。
F 逻辑结构可用不同的存储结构实现。
3、算法独立于具体的程序设计语言,与具体的计算机无关。
T
4、解决问题的效率,跟数据的组织方式无关。
F 解决问题方法的效率跟数据的组织方式有关,跟空间的利用效率有关,也跟算法的巧妙程度有关。
5、时间复杂度是根据算法写成的程序在执行时耗费时间的长度,往往与输入数据的规模有关。
T
6、空间复杂度是根据算法写成的程序在执行时占用存储单元的长度,往往与输入数据的规模有关。
T
7、对应同一个数据结构,可以有不同的实现方法。
T
8、抽象数据类型与计算机内部表示和实现无关。
T
9、算法和程序没有区别,在数据结构中二者是通用的。
F 程序包含算法。
10、算法的优劣与算法描述语言无关,但与所用计算机有关。
F 算法独立于具体的程序设计语言,与具体的计算机无关。
11、在选择数据对象的存储结构时,主要考虑该对象有哪些运算、节点的多少以及所采用的编程语言是否适合实现这种结构,不必考虑数据对象中各元素的取值。
T
12、数据项是数据的最小单位。
T
13、数据元素是数据的最小单位。
F 数据项是数据的最小单位。
14、数据的逻辑结构与数据元素本身的内容和形式无关。
T
15、数据元素可以由类型互不相同的数据项构成。
T
选择题
1、被计算机加工的数据元素不是孤立的,它们彼此之间一般存在某种关系,通常把数据元素之间的这种关系称为
A.规则
B.结构
C.集合
D.运算
B
数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。
2、在 Data_Structure = (D,R)中,D 是( )的有限集合。
A.数据元素
B.算法
C.数据操作
D.数据对象
A文章来源:https://uudwc.com/A/dbkjM
3、以下关于数据结构的说法中错误的是( )。
A.数据结构相同,对应的存储结构也相同
B.数据结构涉及数据的逻辑结构、存储结构和施加其上的操作3个方面
C.数据结构操作的实现与存储结构有关
D.定义逻辑结构时可不考虑存储结构
A
数据的逻辑结构可用不同的存储结构实现。
4、以下关于数据结构的说法中正确的是( )。
A.数据结构的逻辑结构独立于其存储结构
B.数据结构的存储结构独立于该数据结构的逻辑结构
C.数据结构的逻辑结构唯一地决定了该数据结构的存储结构
D.数据结构仅由其逻辑结构和存储结构决定
A
B.存储结构:数据的逻辑结构用计算机语言的实现
C.数据的逻辑结构和存储结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构
D.数据结构概念包括数据之间的逻辑结构、数据在计算机中的存储方式和数据的运算三个方面
5、数据结构在计算机内存中的表示是指( )。
A.数据的存储结构
B.数据结构
C.数据的逻辑结构
D.数据元素之间的关系
A
6、在数据结构中,从逻辑上可以把数据结构分为
A.动态结构和静态结构
B.紧凑结构和非紧凑结构
C.线性结构和非线性结构
D.内部结构和外部结构
C
7、在数据结构中,与所使用的计算机无关的是数据的( )结构。
A.逻辑
B.存储
C.逻辑和存储
D.物理
A
8、在存储数据时,通常不仅要存储各数据元素的值,而且还要存储( )。
A.数据的处理方法
B.数据元素的类型
C.数据元素之间的关系
D.数据的存储方法
C
9、算法分析的两个主要方面是( )
A.空间复杂度和时间复杂度
B.正确性和简明性
C.可读性和文档性
D.数据复杂性和程序复杂性
A
10、以下属于顺序存储结构优点的是( )。
A.存储密度大
B.插入运算方便
C.删除运算方便
D.可方便地用于各种逻辑结构的存储表示
A
11、算法的计算量的大小称为计算的( )。
A.效率
B.复杂性
C.现实性
D.难度
B
12、算法的时间复杂度取决于( )
A.问题的规模
B.待处理数据的初态
C.A和B
C
13、一个算法应该是( )
A.程序
B.问题求解步骤的描述
C.要满足五个基本特性
D.A和C
B
14、数据元素在计算机存储器内表示时,物理相对位置和逻辑相对位置相同并且是连续的,称之为( )。
A.逻辑结构
B.顺序存储结构
C.链式存储结构
D.以上都不对
B
15、顺序存储设计时,存储单元的地址( )。
A.一定连续
B.一定不连续
C.不一定连续
D.部分连续,部分不连续
A
16、以下关于算法的描述,错误的选项是( )。
A.算法可能没有输入,但一定有输出。
B.算法是有限条指令的序列,确定了解决某个问题的运算步骤。
C.对于算法效率的度量,一般用在某台计算机上真实的运行时间作为度量标准。
D.对于同样的问题可以设计不同的算法来求解,它们的时间复杂度可能不一样。
C
算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。
而度量一个程序的执行时间通常有两种方法。
①事后统计的方法。
②事前分析估算的方法。
因事后统计方法更多的依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用事前分析估算的方法。
事前分析估算:在计算机程序编写前,依据统计方法对算法进行估算。
17、算法设计的要求
设计一个好的算法应该满足正确性、▁▁▁▁▁、健壮性和高效性等要求。
A.稳定性
B.可读性
C.可靠性
D.可行性
B
18、给定程序时间复杂度的递推公式:T(1)=1
,T(N)=2T(N/2)+N
。则对该程序时间复杂度最接近的描述是:
A.O(logN)
B.O(N)
C.O(NlogN)
D.O(N^2)
C
T(1)=1
T(2)=2T(1)+2=4
T(3)=2T(1)+3=5
T(4)=2T(2)+4=12
T(5)=2T(2)+5=13
a=2,b=2,f(n)=n
O(n^logb(a))=O(n^log2(2))=O(n)
T(n)=O(nlogn)
19、下面的程序段违反了算法的()原则。
void sam()
{ int n=2;
while (n%2==0) n+=2;
printf(“%d”,n);
}
A.有穷性
B.确定性
C.可行性
D.健壮性
A
20、下列程序段的时间复杂度为()。
x = n; /*n > 1*/
y = 0;
while(x >= (y + 1) * (y + 1))
y = y + 1;
A.Θ(n)
B.Θ(n^½)
C.Θ(1)
D.Θ(n^2)
B
x >= ( y + 1 ) * ( y + 1 )
n >= ( y + 1 ) * ( y + 1 )
n^½ >= y + 1
y <=n ^½ - 1
21、使用渐近性来表示算法复杂度的原因是( )。
A.可以精确表示算法的复杂度
B.算法的复杂度无法使用时间单位来表示
C.研究者更关心算法的增长趋势
D.我们只研究小规模问题
C
22、算法的时间复杂度用()来度量。
A.与硬件相关
B.相应程序的运行时间(精确到秒)
C.相应程序的运行时间(精确到毫秒)
D.算法中所有基本运算的次数
D
23、使用()来度量算法的空间复杂度。
A.存储相应程序的空间大小
B.算法运行时所占用的内存空间大小
C.函数调用次数
D.算法运行时所占用的硬盘空间大小
B
24、时间复杂度分析
以下算法的时间复杂度为 ▁▁▁▁▁。
int foo(int n)
{
int s;
if (n <= 1)
{
s = 1;
}
else
{
s = foo(n - 1) * 2;
}
return s;
}
A.O(n^2)
B.O(2^n)
C.O(n^½)
D.O(n)
D
函数共执行n
次,所以时间复杂度为O(n)
。
25、下面说法中,错误的是( )。
ⅰ
.算法原地工作的含义是指不需要任何额外的辅助空间
ⅱ
.在相同规模n下,复杂度为O(n)的算法在时间上总是优于复杂度为O(2n)的算法
ⅲ
.所谓时间复杂度,是指最坏情况下估算算法执行时间的一个上界
ⅳ
.同一个算法,实现语言的级别越高,执行效率越低
A.ⅰ
B.ⅰ,ⅱ
C.ⅰ,ⅳ
D.ⅲ
A
算法原地工作的含义是指算法所需要的辅助空间不随着问题的规模而变化,是一个确定的值。
26、算法分析(应用)
下面 Abs 函数的时间复杂度为 ▁▁▁▁▁ 。
int Abs(int n)
{
int m;
if (n >= 0)
{
m = n;
}
else
{
m = -n;
}
return m;
}
A.O(n^2)
B.O(2^n)
C.O(log2(n))
D.O(nlog2(n))
E.O(n)
F.O(1)
G.O(n^½)
H.O(n*n^½)
F
函数共执行了一次,因此时间复杂度为O(1)
。
27、在下面的程序段中,对x的赋值语句的频度为( )
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
x=x+1;
A.O(2n)
B.O(n)
C.O(n^2)
D.O(log2(n))
C
共执行n*n = n^2
次,因此时间复杂度为O(n^2)
。
28、下面程序段的时间复杂度是 ( )
i = 0;
while(i<=n)
i = i * 3;
A.O(2n)
B.O(n)
C.O(n^2)
D.O(log3(n))
D
i=3^x<=n
(x为执行次数)
x<=log3(n)
因此时间复杂度为O(log3(n))
29、流程图是描述算法的很好的工具,一般的流程图中由几种基本图形组成。其中判断框的图形是
A.菱形
B.长方形
C.平行四边形
D.椭圆型
A
30、下列复杂度表示法中,( )表示算法复杂度渐近的紧的界,即一种算法的复杂度与某个函数的阶相等。
A.大O表示法
B.大Θ表示法
C.大Ω标识符
D.以上都不对
B
31、假设为解决某问题而设计的三个算法的时间复杂度分别为:①O(n^2)
,②O(nlogn)
, ③O(logn)
。请问这三个算法按时间效率由高到低的顺序是( )。
A.①②③
B.③②①
C.①③②
D.②①③
B
时间复杂度越小,时间效率越高。
32、下面程序段的时间复杂度是( )
for(i=0;i<n;i++)
for(j=1;j<m;j++)
A[i][j]=0;
A.O(n)
B.O(m+n+1)
C.O(m+n)
D.O(m*n)
D
共执行(n+1)m
次,因此时间复杂度为O(m*n)
。
33、T(n)表示当输入规模为n时的算法效率,以下算法中效率最优的是( )。
A.T(n)=T(n-1)+1,T(1)=1
B.T(n)=2n^2
C.T(n)=T(n/2)+1,T(1)=1
D.T(n)=3nlog2(n)
C
分析:
A.O(n)
B.O(n^2)
C.O(log2(n))
D.O(nlog2(n))
C.
T(n) = T(n/2) + 1
= T(n/2^2) + 2
= T(n/2^3) + 3
= ...
= T(n/2^(log2(n))) + log2(n)
=T(1)+log2(n)=log2(n)+1
34、下述程序段的时间复杂度为( )
for(i=0; i<n-1; i++)
for(j=0; j<n-1-i; j++)
t=a[j], a[j]=a[j+1], a[j+1]=t;
A.O(1)
B.O(n)
C.O(n^2)
D.O(n^3)
C
共执行n(n-i)
次,因此时间复杂度为O(n^2)
35、空间复杂度分析(阶乘,循环+动态数组版)
下面算法的空间复杂度为 ▁▁▁▁▁。
double Fac(int n)
{
int k;
double p, *a;
a = (double*)malloc((n + 1) * sizeof(double));
a[0] = 1.0;
for (k = 1; k <= n; ++k)
{
a[k] = a[k - 1] * k;
}
p = a[n];
free(a);
return p;
}
A.O(n)
B.O(2^n)
C.O(n^2)
D.O(1)
A
共占用n个数组a的存储单元,因此空间复杂度为O(n)
文章来源地址https://uudwc.com/A/dbkjM