数据结构基本知识
- 数据项(不可再分割的最小单位)->数据元素(数据的基本单位)->数据
- 数据结构就是相互之间存在一种或多种特定关系的数据元素的集合。
- 数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
- 数据结构的三要素:
逻辑结构:集合(无关系),线性结构(一对一关系),树形结构(一对多关系),图状结构(多对多关系)。
物理结构(存储结构):顺序存储(逻辑相邻,物理也相邻),链式存储(逻辑相邻,物理不一定相邻),索引存储(索引表),散列存储(散列表)。
数据的运算:类似函数、方法。 - 数据类型:原子类型、结构类型(struct)。
- 抽象数据类型:类似于容器、队列、字符串等。
- 算法特性:有穷性、确定性、可行性、输入和输出。
- 好算法的特质:正确性、可读性、健壮性、高效率和低存储。
- 时间复杂度主要看循环执行条件是如何变化的
- 空间复杂度主要看定义变量的空间
空间复杂度是常数级别,就是原地工作。
线性表
线性表概念主要强调逻辑结构和数据的运算:一对一关系,增删查改一系列操作。之后的顺序表、链式表等等都是带上了存储结构的线性表。
一、顺序表(顺序存储的线性表)
定义:
- 静态分配:你知道需要多少空间存数据
- 动态分配:事先不知道,用户输入总个数n才知道or连n都不告诉你。
c:定长malloc,不定长还需要realloc
c++:new数组,vector
基本操作:插入、删除、按值查找平均都是O(n)
二、单链表、双链表、循环链表、双循环链表(链式存储的线性表)
-
单链表
判空:- 头指针为空。
- 头结点的next为空。
判断结束:
- 头指针:当前结点为空。
- 头结点:当前结点的next为空。
-
双链表
判空:同上
判结束:同上。
-
循环链表
判空:1. 同上。 2. 头结点的next指向自己。
判结束:当前指针的下一个指针又变成了开始的指针。
因为有尾指针,下一个就是头指针,而只有头指针则还需要遍历整个链表。 -
循环双链表
判空:1. 同上。2. 头结点的next和prior都指向自己。
判断结束:当前执政的下一个指针或者前一个指针是最开始的结点。
基本操作:单说增删都是O(1),但是实际运用中还是需要查到指定点的位置的,所以增删查时间复杂度都是O(n)。
三、静态链表(实际是一个数组)
其实有很多的定义方法。
0下标的位置不存储数据,cur位置存放起始下标。结束的cur存储0。绝对不移动数据。
- 添加:取备用结点的索引存好数据,想连接到哪个结点后面就把自己的cur值就变成那个结点的cur值,然后把自己的索引赋值那个结点cur值,就和链表一样更改next一样。
- 删除:删除的结点的cur值给到其前驱结点,并把删除节点加入到备用结点中。
- 查找:从0下标的cur开始依次根据cur跳跃到下标查找。
判空:0下标位置的cur为0。
判断结束:当前cur为0。