绪论
数据结构三要素:逻辑结构、存储结构、数据的运算
五个特征:有穷性、确定性、可行性、输入、输出
数据
从大到小:数据对象 -> 数据 -> 数据元素 -> 数据项(不可拆分了)
举例:
数据对象 Class a = new CLass()
数据 a.name
数据元素 a.name = "dodayum"
数据项 'd'
线性表
定义:n个相同类型的元素的有序排列
顺序表
特点:地址连续
Create:
插入操作:插入数据后,插入未知后面的数据项后移动,时间复杂度为O(n)
Read:
从头到尾一个一个的看,时间复杂度为O(n)
Update:
从头到尾一个一个的看,时间复杂度为O(n)
Delete:
删除元素时,删除节点后面的元素要向前移动,时间复杂度为O(n)
总结
优点:结构简单,占用资源小
缺点,增删改查没一个方便
链表
数据为前/后节点 + 数据
typedef struct {
char data[100]; // 数据
int *next; // 后节点
} 单链表; // 直接后节点
typedef struct {
int *prior; // 前节点
char data[100]; // 数据
int *next; // 后节点
} 双链表; // 前后节点都有
链表分为单链表(单项)、双链表(双向)
因为头节点和尾节点不通,分为循环单链表和循环双链表
特点:逻辑上连续,单物理上不连续
Create:
插入操作:找到插入的位置,吧节点换一下,时间复杂度为O(1)
Read:
从头到尾一个一个的看,时间复杂度为O(n)
Update:
从头到尾一个一个的看,直到找到想要的位置,修改数据,时间复杂度为O(n)
Delete:
删除元素时,后节点直到前节点,被删元素节点放开GC掉,时间复杂度为O(n)
总结
除了查以外,剩下相对于顺序表都有提升
缺点时占用资源有点多
栈
先进后出
特殊:共享栈,一个固定长度的,两遍都可以存取数据
队列
先近先出
特殊:双端队列,两遍都可以取出
数组
demo:
int demo[10][10];
矩阵
树
graph TB;
a-->b
a-->c
a-->d
b-->e
b-->f
c-->g
其中,a为根节点,b、c、d......为节点,节点与节点之间的连线叫度,树的深度是从上到下的高度
树的公式:
树中所有的节点数 = 所有度数+1
度为m的树上第i层上最多有个节点
高度为h的m叉树,最多有
具有n个节点的m叉树的最小高度为
二叉树
满二叉树:非常齐全
完全二叉树:从上到下,从左到右的节点都是全的,就算有单节点,也没亲兄弟节点
性质
第i层上最多有个节点
深度为k的二叉树中,最多具有个节点
如果叶子节点数为a,度为2的节点数为b,则a=b+1
遍历
demo:
graph TB;
a-->b-->d
b-->e-->h
e-->i
i-->j
i-->k
a-->c-->f
c-->g
先序(根左右):abdehijkcfg
中序(左根右):dbhejikafcg
后序(左右根):dhjkiebfgca
层序(一层一层的):abcdefghijk
==哈夫曼树==
图
图的结构G(V,E),其中G表示图,V表示点,E表示边
Demo:
graph TB
a-->b
a-->c
b-->d
c-->d
b-->c
a-->d