使用的教材是王红梅老师的《数据结构——从概念到C++实现(第3版)》。
笔者是一名大三软件工程的学生,因为大二第一次修的时候绩点太低所以这学期再修了数据结构。整理这个系列主要是为了可爱的软件一霸的小朋友和我自己提升期末成绩。整理都整理了不放上来可惜了~这个系列的会更多的以我们的期末重点为重点,有一些我其实很感兴趣但是不在考试范围内的内容,我会后面有时间的时候再补充嘻嘻。
数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理
数据项(data item)是构成数据元素的最小单位,并且数据元素通常具有相同个数和类型的数据项。
数据结构(data structure)是指相互之间存在一定关系的数据元素的集合。
数据元素时讨论数据结构时涉及的最小数据单位,其中的数据项不予考虑。按照视点的不同,数据结构分为逻辑结构和存储结构。
数据的逻辑结构(logical structure)是指数据元素以及数据元素之间的逻辑关系。
数据的存储结构是数据及其逻辑结构在计算机中的表示(也称映像)。
算法是对特定问题求解步骤的一种描述,是指令的优先序列。
除概念外,算法还必须满足以下基本特性:
重点掌握程序设计语言方法与伪代码形式,接下来以欧几里得算法为例(C++)实现
#include
using namespace std;
int ComFactor(int m,int n)
{
int r = m%n;
while(r!=0){
m = n;
n = r;
r = m % n;
}
return n;
}
int main()
{
count<<"最大公约数是:"<
算法:ComFactor
输入:两个自然数m和n
输出:m和n的最大公约数
1. r=m%n;
2.循环直到r等于0
2.1m=n;
2.2n=r;
2.3r=m%n;
3.输出n;
基本语句(basic statement)是执行次数与整个算法的执行次数成正比的语句。基本语句对算法运行时间的贡献最大,是算法中最重要的操作。
时间复杂度(time complexity)全称算法的渐进时间复杂度。即只考虑当问题规模充分大时,算法中基本语句的执行次数在渐进意义下的阶。通常用 O ( n ) O(n) O(n)记号表示
O ( l o g 2 n ) < O ( n ) < O ( n l o g 2 n ) < O ( n 2 ) < O ( n 3 ) < … < O ( 2 n ) < O ( n ! ) O(log_2n)
算法的空间复杂度(space complexity)是指算法在执行过程中需要的辅助空间数量,也就是除算法本身和输入输出数据所占用的空间外,算法临时开辟的储存空间。
算法在运行过程中所需的存储空间包括:
++x;
解:++x是基本语句,执行次数为1,时间复杂度为 O ( 1 ) O(1) O(1),称为常量阶
2. 线性阶
for(i = 1; i <= n; ++i)
++x;
解:++x是基本语句,执行次数为n,时间复杂度为O(n),称为线性阶。
3. 平方阶
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
++x;
解:++x是基本语句,执行次数为 n 2 n^2 n2,时间复杂度为 O ( n 2 ) O(n^2) O(n2),称为平方阶
4. 立方阶
for(i = 1; i <= n; ++i)
for(j = 1; j <= n; ++j)
{
c[i][j] = 0;
for(k = 1; k<=n; ++l)
c[i][j] += a[i][k] * b[k][j];
}
解: c[i][j] += a[i][k] * b[k][j]是基本语句,由于是一个三重循环,每个循环从1到n,所以总的执行次数为 n 3 n^3 n3,时间复杂度为 O ( n 3 ) O(n^3) O(n3),称为平方阶
5. 不想取名字阶
for(i = 1;i<=n;++i)
for(j = 1; j<= i-1; ++j)
++x;
解:++x是基本语句,执行次数为
∑ i = 1 n ∑ j = 1 i − 1 1 = ∑ i = 1 n ( i − 1 ) = n ( n − 1 ) 2 \sum_{i=1}^{n}\sum_{j=1}^{i-1}1 = \sum_{i=1}^{n}(i-1)= \frac{n(n-1)}{2} i=1∑nj=1∑i−11=i=1∑n(i−1)=2n(n−1)
所以时间复杂度为 O ( n 2 ) O(n^2) O(n2)。分析的策略是从内部(或最深层的部分)向外展开。
6. 对数阶
for(i = 1; i<=n; i = 2 * i )
++x;
解:++x是基本语句,设其执行次数为 T ( n ) T(n) T(n),则有 2 T ( n ) ≤ n 2^{T(n)}\leq n 2T(n)≤n,即 T ( n ) ≤ l o g 2 n T(n)\leq{log_2n} T(n)≤log2n,所以时间复杂度为 O ( l o g 2 n ) O(log_2n) O(log2n),称为对数阶
注:笔者写整理主要是为了应对大三上再修的数据结构期末考试,所以说考试范围外的东西暂时不整理。等笔者考完寒假空闲时再整理这部分的内容诶嘿~