数据结构1

概率论与数理统计 1-基本概念
概率论与数理统计 2-基本数据结构
概率论与数理统计 3-基本数据处理技术

使用材料

数据结构 C 语言版(严蔚敏).pdf

数据结构习题集 (严蔚敏).pdf

文件备份在这:https://www.alipan.com/s/SWam4yQpb1j

指导视频 b 站王卓老师

数据结构基本概念

程序=数据结构+算法

image

数据结构研究内容

计算机解决问题的步骤:具体问题抽象成数学模型-> 设计算法->编程、调试、运行

具体问题抽象成数学模型:分析问题,提取操作对象,找出操作对象之间的关系,用数学语言描述

数据结构:是研究非数值计算的程序设计中计算机的操作对象以及它们之间的关系操作

基本概念和术语

  1. 数据

    输入到计算机当中且能被计算机处理的各种符号的集合,

    1. 数值型数据:整数,实数

    2. 非数值型数据:文字,图像,图形,声音

  2. 数据元素

    是数据的基本单位,通常作为整体考虑(可以被叫做:元素、记录、结点、顶点)

    一个数据元素由若干个数据项组成

    例如:一个表当中的一行数据就相当于数据元素

  3. 数据项

    构成数据元素的不可分割的最小单位

    例如:一个表当中的一行数据当中的一列数据相当于数据项

  4. 数据对象

    性质相同的数据元素的集合,是数据的子集

数据元素与数据对象间的关系

数据元素是组成数据的基本单位,是集合当中的个体

数据对象是性质相同的数据元素的集合,是集合的子集

数据结构

  1. 数据元素相互之间的关系称为结构
  2. 相互之间存在一种或多种特定关系的数据元素集合
  3. 带结构的数据元素的集合

数据结构包含:逻辑结构,存储结构,数据的运算和实现

逻辑结构

数据元素之间的关系

第一类划分方法

  1. 线性结构:有且只有一个开始和一个终端节点,并且所有结点都最多只有一个直接前趋和一个直接后继。

    1. 线性表,栈,队列,串
  2. 非线性结构:一个结点可能有多个直接前趋和直接后继

    1. 树,图

第二类划分方法

  1. 集合结构:元素除了同属于一个集合的关系外,无其他关系
  2. 线性结构:元素存在一对一的线性关系
  3. 树型结构:元素存在一对多的层次关系
  4. 图状结构:元素存在多对多的任意关系

物理结构(存储结构)

数据元素在计算机中的存储方式

  1. 顺序存储结构:用一组连续的存储单元依次存储数据元素,用存储位置表示逻辑关系
    c 语言当中用数组来实现顺序存储结构
  2. 链式存储结构:用一组任意位置的存储单元存储数据元素,用指针来表示逻辑关系
    c 语言当中用指针来实现链式存储结构
  3. 索引存储结构:在存储结点信息的同时,建立附加的索引表
    索引表中的每一项成为一个索引项:(关键字,地址),关键字是唯一标识
    每个结点都有索引项叫稠密索引,一组结点对应一个索引项叫稀疏索引
  4. 散列存储结构:根据结点关键字计算结点存储地址

逻辑结构和存储结构的关系

存储结构是逻辑关系的映象与元素本身的映象

逻辑结构是数据结构的抽象,存储结构是数据结构的实现

两者综合起来建立了数据元素之间的结构关系

抽象数据类型表示方法

数据类型->抽象数据类型

数据类型:能明显的或隐含的规定程序在执行期间变量和表达的所有可能的取值范围,以及在这些数值范围上所允许的操作

抽象数据类型(ADT):是指一个数学模型以及定义在此数学模型上的一组操作

抽象数据类型(ADT)的形式定义:(D,S,P)三元组表示,D 是数据对象,S 是 D 上的关系集,P 是对 D 的基本操作

一个抽象数据类型的定义格式如下:

ADT 抽象数据类型名{
    数据对象: <数据对象的定义>
    数据关系: <数据关系的定义>
    基本操作: <基本操作的定义>
} ADT 抽象数据类型名

数据对象、数据关系的定义用伪代码描述
基本操作的定义格式为:
    基本操作名(参数表)
    初始条件: <初始条件描述>
    操作结果: <操作结果描述>
参数表:赋值参数只为操作提供输入值,引用参数以&打头,除可提供输入值外,还将返回操作结果
初始条件:描述操作执行前数据结构和参数英满足的条件,不满足则操作失败,返回响应出错信息,初始条件为空,则省略。
操作结果:操作正常完成后,数据结构的变化状况和应返回的结果

举例:Circle 圆,Complex 复数
ADT Circle{圆
    数据对象: D={r,x,y|r,x,y均为实数}
    数据关系: R={<r,x,y>|r是半径,<x,y>是圆心坐标}
    基本操作:
    Circle(&C,r,x,y)
        操作结果: 构造一个圆。
    double Area(C)
        初始条件: 圆已存在
        操作结果: 计算面积
    double Circumference(C)
        初始条件: 圆已存在
        操作结果: 计算周长
    ...
}ADT Circle

ADT Complex{复数
    D={r1,r2|r1,r2都是实数}
    S={<r1,r2>|r1是实部,r2是虚部}
    assign (&C,v1,v2)
        初始条件: 空的复数C已存在
        操作结果: 构造复数C,r1,r2分别被赋以参数v1,v2的值
    destroy (&C)
        初始条件: 复数C已存在
        操作结果: 复数C被销毁
    getreal (C,&realPart)
        初始条件: 复数C已存在
        操作结果: 用realPart返回复数C的实部值
    getimag (C,&imagPart)
        初始条件: 复数C已存在
        操作结果: 用imagPart返回复数C的虚部值
    add (z1,z2,&sum)
        初始条件:z1,z2是复数
        操作结果:, sum返回两个复数z1,z2的和
    ......
}ADT Complex

抽象数据类型-》算法(代码)

使用具体的语言定义抽象数据类型

抽象数据类型可以通过固有的数据类型来表示实现

将上述,这种抽象数据类型表示实现如下:

#include <stdio.h>
#include <stdlib.h>
#define pi 3.14

typedef struct {
    int x;
    int y;
    float r;
}Circle;

float Area(Circle C){
    if (C.r >= 0)
        return pi*C.r*C.r;
    else
        return 0;
}

float Circumference(Circle C){
    if (C.r >= 0)
        return 2*pi*C.r;
    else
        return 0;
}

int main(){
    Circle circle = {12, 12, 12};
    float area = Area(circle);
    float circumference = Circumference(circle);
    printf("圆心坐标为 (%d, %d)\n半径为 %f\n面积为 %f\n周长为 %f\n", circle.x, circle.y, circle.r, area, circumference);
}

算法及算法分析

算法的定义:对特定问题求解方法和步骤的描述,是指令的有限序列。每个指令可以表示一个或多个操作。

算法的描述

  1. 自然语言
  2. 流程图
  3. 伪代码、类语言
  4. 程序代码

算法和程序的关系

算法是解决问题的一种方法或一个过程

程序是解决问题时使用某种程序设计语言对算法的具体实现

程序 = 数据结构+算法

算法特性

有穷性:算法必须在执行有穷步后结束,每步都在有穷时间内完成

确定性:算法每条指令必须有确切含义,没有二义性,在任何条件下只有唯一的一条执行路径。相同的输入得到相同的输出

可行性:算法通过已经实现的基本操作执行有限次能实现

输入:一个算法有零个或多个输入

输出:一个算法有一个或多个输出

算法设计的要求

正确性:对精心选择的、典型、苛刻且带有刁难性的几组数据进行验证能得到满足要求的结果。

可读性:算法主要是为了人的阅读和交流。

健壮性:输入非法数据时,不应中断程序的执行,而返回一个表示错误或错误性质的值。

高效性:要求花费尽量少的时间和尽量低的存储需求。

通过评判算法的效率来考虑算法的优劣程度

  1. 时间效率:算法执行所消耗的时间,\(O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)\)
  2. 空间效率:算法执行过程中所消耗的存储空间\(O(1)<O(logn)<O(n)<O(nlogn)<O(n^2)<O(n^3)<O(2^n)<O(n!)<O(n^n)\)
  3. 一般而言\(O(n^2)\)就是不可接受的复杂度。

算法时间效率度量

使用算法编制的程序在计算机上执行所消耗的时间来度量

两种度量方式:

  1. 事后度量

    将算法实现,测算其时间和空间开销

    缺点:花费较多的时间和精力,依赖软硬件等环境因素。

  2. 事前度量

    对算法所消耗资源的一种估算

    执行一中简单操作所需要的时间与简单操作次数乘积。

    \[算法运行时间=\sum每条语句的执行次数\times该语句执行一次所需要的时间 \\ \downharpoonleft\downharpoonright\\ 算法运行时间=\sum每条语句频度\times该语句执行一次所需要的时间 \\ \downharpoonleft\downharpoonright\\ f(n)=算法运行时间=\sum每条语句频度\times单位时间 \]

    简化后只比较数据量级,这样叫做算法的渐进时间复杂度(\(O\)是数量级的符号)简称时间复杂度。\(T(n)=O(f(n))\)
    这表示随着 n 的增大,算法执行的时间的增长率和\(f(n)\)的增长率相同,称渐近时间复杂度

算法时间复杂度需要考虑:最坏时间复杂度,平均时间复杂度,最好时间复杂度

算法空间效率度量

空间复杂度:算法所需存储空间的度量,记作\(S(n)=O(f(n))\)

posted @ 2025-03-22 20:10  *--_-  阅读(16)  评论(0)    收藏  举报