2021-01-01

数据结构笔记

一、绪论

  1. 顺序存储结构在物理上一定是连续的
  2. 非顺序存储结构在物理上可以是离散的
  3. 数据的存储结构会影响存储空间分配的方便程度
  4. 运算的定义是针对逻辑结构的
  5. 运算的实现是针对存储结构的

二、算法

  1. 算法的五个特征
    有穷性:算法程序的运行时间是有限的
    确定性:每一条代码都有明确性的目的,对于相同的输入都有相同的输出
    可能性:算法中的步骤都是可以被基本均算执行有限次
    输入:丢给算法处理的数据
    输出:算法处理后的结果
  2. “好”算法的特质
    正确性:算法应能够正确地解决求解问题
    可读性:算法应有良好的可读性
    健壮性:算法能够处理一些异常
    高效率与低储存量:算法省时、省内存;时间复杂度低,空间复杂度低

三、算法效率的度量

  1. 时间复杂度
    表达式T(n), T:time n:问题规模
    时间复杂度表达式只考虑表达式高阶部分
    Eg:
    T(n)=3n+3≈3n
    T(n)=3n2+3n+3≈3n2
    T(n)=3n3+3n2+3n+3≈3n3

    常对幂指阶

高阶梯度图
2. 空间复杂度
表达式S(n), T:space n:问题规模
空间复杂度表达式也只考虑表达式高阶部分

四、线性表

  1. 线性表具有相同数据结构(每个数据元素所占空间一样大)
  2. 是有限序列(有次序)
  3. ai表示第i个元素,第i个位序(位序从1开始)
  4. a1为表头元素、 an为表尾元素
  5. 除了a1,每一个元素有且仅有一个直接前驱;除了an,每一个元素有且仅有一个直接后驱
基本操作 表达形式表达形式
InitList(&L) 初始化表
DestroyList(&L) 销毁链表
Listinsert(&L,i,e) 插入元素
ListDelete(&L,i,&e) 删除元素
LocateElem(L.e) 按值查找
Length(L) 求表长
PrintList(L) 输出打印
Empty(L) 判空

Tip:
什么时候要传入引用“&”——对阐述的修改结果需要“带回来”(C++中才能用“&”)

线性表
顺序表
链式表

五、顺序表

  1. 顺序表的实现——静态分配
#define MaxSize 10  //定义最大长度
typedef struct{
     
   ElemType date[MaxSize];  //用静态的“数组”存放数据元素 ElemType数据类型,实际自己定义
   int length;  //顺序表当前的长度
}SqList;  //顺序表的类型定义(静态分配方式)

Eg:
2021-01-01_第1张图片
Tip:
Q: 静态分配的顺序表满了怎么办
A: 重建。顺序表的表长刚开始的时候就已经确定,后续无法更改

  1. 顺序表的实现——静态分配
#define InitSize 10  //顺序表的初始长度
typedef struct{
     
	ElemType date *date; //指示动态分配数组的指针
	int MaxSize;  //顺序表的最大容量
	int length;  //顺序表当前的长度
}SqList;  //顺序表的类型定义(动态分配方式)

2021-01-01_第2张图片
Eg:
2021-01-01_第3张图片
在IncreaseSize();中将原来的数组地址复制给p 同时新建更大的数值,在将原来的数组数值复制到新数组中,再free(p);

  1. 顺序表的特点
    1、随机访问,在O(1)时间内即可找到第i个元素
    2、储存密度高,每个节点只能存储数据元素
    3、扩展容量不方便
    4、插入、删除不方便。每次都要移动大量元素

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