数据结构(一)- 基本概念

一、基本概念

1. 数据

数据(Data)是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。
例如:文本、图像、视频、等。

2. 数据元素

数据元素(Data Element)是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理。
相当于数据库中表的概念,例如在学生表中需要有学号、姓名、班级、年龄等信息作为一个在学校学习的人的记录。

3. 数据项

数据项(Data Item)是组成数据元素的、有独立含义的、不可分割的最小单位。例如,学生基本信息表中的学号、姓名、性别等都是数据项。
如上:学生中学号、姓名、班级、年龄这些信息,都是原子性的。

4. 数据对象

数据对象(Data Object)是性质相同的数据元素的集合,是数据的一个子集。
即是多个数据元素的集合,称之为数据对象。
不支持在 Docs 外粘贴 block

二、数据结构

数据结构(Data Structure)是相互之间存在一种或多种特定关系的数据元素的集合。换句话说,数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。

1、逻辑结构

数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。逻辑结构描述的是数据元素之间的逻辑关系。

  • 集合结构
    数据元素之间除了“属于同一集合”的关系外,别无其他关系。例如,确定一名学生是否为班级成员,只需将班级看作一个集合结构。
  • 线性结构

数据元素之间存在一对一的关系。例如,将学生信息数据按照其入学报到的时间先后顺序进行排列,将组成一个线性结构。

  • 树结构

数据元素之间存在一对多的关系。例如,在班级的管理体系中,班长管理多个组长,每位组长管理多名组员,从而构成树形结构。

  • 图结构

数据元素之间存在多对多的关系。例如,多位同学之间的朋友关系,任何两位同学都可以是朋友,从而构成图状结构或网状结构。
不支持在 Docs 外粘贴 block

2、存储结构(物理结构)

数据对象在计算机中的存储表示称为数据的存储结构,也称为物理结构。要求既要存储各数据元素的数据,又要存储数据元素之间的逻辑关系,数据元素在计算机内用一个结点来表示。
数据元素在计算机中有两种基本的存储结构,分别是顺序存储结构和链式存储结构。
顺序存储结构
逻辑关系:通过每个数据元素的相对的位置表示元素之间的逻辑关系
存储元素:要求所有的元素存放在一片连续的连续空间中。

链式存储结构
逻辑关系:通过指针指向后继节点存储地址。
存储元素:无需顺序存储但是需要保存后继节点存储地址。

三、数据类型和抽象数据类型

1、数据类型
2、抽象数据类型

四、算法

1、算法

  • 什么是算法

为了解决某类问题而规定的一个有限长的操作序列。

  • 需要满足条件
    • 有穷性
    • 确定性
    • 可行性
    • 输入
    • 输出
  • 算法优劣性
    • 正确性
    • 可读性
    • 健壮性
    • 高效性

2、时间复杂度

事前分析估算法

  • 问题规模

问题规模是算法求解问题输入量的多少,是问题大小的本质表示,一般用整数n表示。问题规模n对不同的问题含义不同
一个算法的执行时间大致上等于其所有语句执行时间的总和
语句的执行时间 = 该条语句的重复执行次数 * 执行一次所需时间。

  • 语句频度

一条语句的重复执行次数称作语句频度(Frequency Count)。

  • 算法执行时间

设每条语句执行一次所需的时间均是单位时间,则一个算法的执行时间可用该算法中所有语句频度之和来度量。

时间复杂度

用算法中的“基本语句”(算法中重复执行次数和算法的执行时间成正比的语句)的执行次数来度量算法的工作量。
如上面的例子,f(n) = 2n^3+3n^2+2n+1当n->∞时,f(n) = n^3。用O表示数量级,记作T(n)=O(f(n))=O(n3)。所以算法的复杂度可以记作:
T(n) = O(n3)
分析时间复杂度的基本方法
找出所有语句中语句频度最大的那条语句作为基本语句,计算基本语句的频度得到问题规模n的某个函数f(n),取其数量级用符号“O”表示即可

  • 定理1.1
    • 若f(n)=amn^m+anm-1+…+a1n+a0是一个m次多项式,则T(n)=O(n^m)。

在计算算法时间复杂度时,可以忽略所有低次幂项和最高次幂的系数,这样可以简化算法分析,也体现出了增长率的含义。

案例1、时间复杂度案例说明

1. 常量阶

public void demo(){
    x++;
    s = 0;
}
复制代码
T(n) = O(1)
复制代码

2. 线性阶

public void demo(){
    for(int i = 0 ; i < 10000 ; i++){
        x++;
        s = 0;
    }
}
复制代码
T(n) = O(1)
复制代码

3. 平方阶

在下面代码中,有两个频度一个n,一个是n^2。所以最大频度的语句是8行内的语句,时间复杂度为O(n^2)

public void demo(){
    for(int i = 0 ; i < n; i++){
        y++;
    }

    for(int i = 0 ; i < n; i++){
        for(int j = 0; j < i ; j++){
            x++;
            s = 0;
        }
    }
}
复制代码
T(n) = O(n^2)
复制代码

4. 立方阶

for(int i = 0 ; i < n; i++){
    for(int j = 0; j < i ; j++){
        for(int x = 0; x < j ; x++){
            x++;
        }
    }
}

T(n) = O(n^3)
复制代码

5. 对数阶

for(int x = 0; x < n ; x*2){
    x++;
}
复制代码
T(n) = O(log2N)
复制代码

4、空间复杂度

空间复杂度(Space Complexity)作为算法所需存储空间的量度,简称空间复杂度,它也是问题规模n的函数,记作:

S(n)=O(f (n))
复制代码

案例2、空间复杂度案例说明

for(int i = 0; i < n/2 ; i++){
    t = a[i];
    a[i] = a[a - i -1];
    a[n - i - 1] = t;
}
复制代码

需要另外借助一个变量t,与问题规模n大小无关,所以其空间复杂度为O(1)。
S(n)=O(1)

for(i = 0 ; i < n ; i ++){
    b[i] = a[a - i -1];
}

for(i = 0 ; i < n ; i ++){
    a[i] = b[i];
}
复制代码

需要另外借助一个大小为n的辅助数组b,所以其空间复杂度为O(n)。
S(n)=O(n)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享