《数据结构》第三版 第一章 绪论

写在数据结构系列的开头

使用的教材是王红梅老师的《数据结构——从概念到C++实现(第3版)》。
笔者是一名大三软件工程的学生,因为大二第一次修的时候绩点太低所以这学期再修了数据结构。整理这个系列主要是为了可爱的软件一霸的小朋友和我自己提升期末成绩。整理都整理了不放上来可惜了~这个系列的会更多的以我们的期末重点为重点,有一些我其实很感兴趣但是不在考试范围内的内容,我会后面有时间的时候再补充嘻嘻。

第一章 绪论

数据结构的基本概念

数据结构

数据元素(data element)是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理

数据项(data item)是构成数据元素的最小单位,并且数据元素通常具有相同个数和类型的数据项。

数据结构(data structure)是指相互之间存在一定关系的数据元素的集合。

数据元素时讨论数据结构时涉及的最小数据单位,其中的数据项不予考虑。按照视点的不同,数据结构分为逻辑结构和存储结构。

数据的逻辑结构(logical structure)是指数据元素以及数据元素之间的逻辑关系。

数据的存储结构是数据及其逻辑结构在计算机中的表示(也称映像)。

抽象数据类型

算法概念

算法是对特定问题求解步骤的一种描述,是指令的优先序列。

算法特性

除概念外,算法还必须满足以下基本特性:

  1. 有穷性:一个算法必须总是(对于任何合法的输入)在执行有穷步之后结束,且每一步都在有穷时间内完成。
  2. 确定性:算法中的每一条指令必须有明确的含义,不存在二义性。并且,在任何条件下,对于相同的输入只能得到相同的输出。
  3. 可行性:描述算法的每一条指令可以转换为某种程序设计语言对应的语句,并在计算机上可以执行

算法的描述方法

重点掌握程序设计语言方法与伪代码形式,接下来以欧几里得算法为例(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)O(log2n)<O(n)<O(nlog2n)<O(n2)<O(n3)<<O(2n)<O(n!)

算法的空间复杂度

算法的空间复杂度(space complexity)是指算法在执行过程中需要的辅助空间数量,也就是除算法本身和输入输出数据所占用的空间外,算法临时开辟的储存空间。

算法在运行过程中所需的存储空间包括:

  1. 输入/输出数据占用的空间
  2. 算法本身占用的空间
  3. 执行算法需要的辅助空间

算法分析举例

递归算法的时间性能分析

  1. 常量阶:求“++x;”的时间复杂度
    ++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=1nj=1i11=i=1n(i1)=2n(n1)
所以时间复杂度为 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),称为对数阶

递归算法的时间性能分析(非本次考试重点)

注:笔者写整理主要是为了应对大三上再修的数据结构期末考试,所以说考试范围外的东西暂时不整理。等笔者考完寒假空闲时再整理这部分的内容诶嘿~

你可能感兴趣的:(数据结构)