数据结构与算法——数据结构篇

263 阅读3分钟

绪论

数据结构三要素:逻辑结构、存储结构、数据的运算

五个特征:有穷性、确定性、可行性、输入、输出

数据

从大到小:数据对象 -> 数据 -> 数据元素 -> 数据项(不可拆分了)

举例:
数据对象 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层上最多有Mi1M^{i-1}个节点

高度为h的m叉树,最多有Mh1m1\frac{M^h-1}{m-1}

具有n个节点的m叉树的最小高度为log(n(m1)+1)\log{(n(m-1)+1)}

二叉树

满二叉树:非常齐全

完全二叉树:从上到下,从左到右的节点都是全的,就算有单节点,也没亲兄弟节点

性质

第i层上最多有2i12^{i-1}个节点

深度为k的二叉树中,最多具有2k12^k-1个节点

如果叶子节点数为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