线性表
顺序逆序 单向链表 双向链表 循环链表 静态链表
顺序存储方式
地址计算方法
c语言中数组从0开始第一个下标
所以知道某一点地址 ai=a1+(i-1)*c
顺序存储结构需要的算法思路两个
插入算法思路
1 插入位置不合理抛出异常
2线性表长度大于数组长度,抛出异常或者动态增加容量
3从最后一个元素向前遍历到第i个位置,分别将他们向后移动一个位置
4将要插入的元素填到i处
5表长加1
删除算法思路
1删除位置不合理 抛出异常
2取出删除元素
3从删除元素位置开始遍历到最后一个元素位置,分别将他们都向前移动一个位置
4表长减一
链式存储结构 就是N个结点链结成一个链表
结点是 数据元素+指针
链表第一个结点的存储位置叫头指针 规定最后一个结点指针为空(NULL或^)
有时候会在单链表第一个结点前附设一个结点,称为头结点。
头结点的数据域可以不存储任何信息。
单链表获取第i个数据的算法
1声明结点p指向链表第一个结点,初始化i从1开始
2 j 3到链表末尾p为空,说明第i个元素不存在
4否则查找成功,返回结点p的数据
单链表的插入
实现 p p->next 让s插入
首先让s的下一个结点成为p的下一个结点(后继结点)
s->next=p->next;
然后再让p的下一个结点变为s
p->next=s
删除结点同理
p p->next p->next->next
删掉中间的
首先让结点q等于p的后继结点
q=p->next
这时候q的后继结点仍然是p->next->next
此时让p的指向变为q的下个指向
p->next=q->next
然后释放q结点 释放内存
数组描述的链表为静态链表
双向链表的插入
p p->next
1 s->prior=p 插入点前驱
2 s->next=p->next 后继给插入点
3 p->next->prior=s p的后继的前驱是s
4 p->next=s p的后继是s
前驱后继-前驱后继的顺序
双向链表的删除
p->prior p p->next
1 p->prior->next=p->next p的前驱的后继变为p的后继
2 p->next->prior=p->prior p的后继的前驱变为p的前驱
栈和队列
栈是只能在表尾进行插入和删除操作的线性表 后进先出 LIFO
比如 123依次进栈 不能让3先进 不可以是 321 只按顺序进出
插入删除分别是 push pop
也叫进栈push 出栈pop
栈的链式存储结构 链栈
队列是先进先出的线性表
删除只能在队头进行 插入只能队尾进行
(Q.rear-Q.front+MAXSIZE)%MAXSIZE
这个是求队列是否满
链队列 是队列的链式存储结构,线性表的单链表,但他只能队尾进头出
串 又名字符串 零个或多个字符组成的有限序列
KMP算法 避免重复遍历的算法
next数组中
前后缀n个字符相等k的值就是n+1
nextval是他的改良版
这个要和next数组做比较
如果字符串Srt(1)!=Str(j)两位不相等
那么
next(j)=nextval(j)
如果Srt(1)=Str(j)
那么更改nextval(j)=nextval(next(j))
树的定义 n个结点的有限集。n=0为空树,任意一颗非空树中,有且仅有一个特定的称为根的结点,n>1时,其余结点可分为m个互不相交的有限集T1,T2,……,Tm,其中每一个集合本身又是一颗树并且称为根的子树。
结点拥有的子树称为结点的度,度为0的结点称为叶结点或者终端结点,度不为0的结点称为非终端结点或分支结点。
除根结点之外,分支结点也称为内部结点。树的度是树内各结点的度的最大值。
二叉树每个节点最多有两棵子树,左子树和右子树是有顺序的,即使树的某结点只有一棵
子树,也要区分他叔左子树还是右子树。
任意一个二叉树,终端结点数(叶子结点数)n0,度为2的结点数为n2,那么n2+1=n0
三种遍历中(前序,中序,后续),必须知道中序遍历加任意遍历才可以推倒另一遍历
赫夫曼编码,最基本的压缩编码
图,由顶点的有穷非空集合和顶点之间边的集合组成。
任意两个顶点都存在方向互为相反的两条弧,为有向完全图。
图中的元素为顶点。
图的邻接矩阵存储方式使用两个数组来表示图,一个一维数组存储图中的顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或者弧的信息。
深度优先遍历 DFS
广度优先遍历 BFS
找出最小生成树 两种算法
普里姆算法prim
通过链接的最短顶点找最小权重
克鲁斯卡Kruscal算法
通过将各个边和权重排序,再连接非环路的各个边。
迪杰斯特拉算法
解决最短路径的问题
弗洛瑞德算法floyd
线性索引,将索引项集合组织为线性结构,也成为索引表
线性索引分为 稠密索引 分块索引
倒排索引 由属性值确定记录的位置
二叉排序树也叫二叉查找树
平衡二叉树是一种二叉排序树 AVL树
左子树深度减去右子树深度的值称为平衡因子BF
多路查找树 B树
2-3树
2-3-4树
上面分别是 3 4 阶的B树
散列技术,通过某种函数记录位置信息
存储位置=f(关键字)
散列函数也叫作哈希函数
这种连续存储空间称为散列表或者哈希表
散列方法
直接定址法
数字分析法
平方取中法
折叠法
除留余数法
随机数法
如果散列表冲突 那么有开放地址法 冲突后取寻找下个空的散列地址。
开放地址发也成为线性探测法
再散列函数法
链地址法
公共溢出区法
排序
内排序分为 插入排序 交换排序 选择排序 归并排序
简单算法
冒泡排序
简单选择排序
直接插入排序
改进算法
希尔排序
(直接插入排序的一种改进)
堆排序
其中堆是具有以下性质的完全二叉树:每个结点的值都大于或者等于其左右孩子结点的值,称为大顶堆;
或者每个节点的值都小于或等于其左右孩子结点的值,称为小顶堆。
用到了完全二叉树 深度 [log2(n)+1]特性
归并排序
如果是两两归并 就是2路归并序列
快速排序
基本思路: 通过一趟排序将待排记录分割成独立的两部分,稳重一部分记录的关键字均比另一部分的记录的关键字小,则可以分别对这两部分记录继续进行排序以达到整个序列有序的目的。
插入排序类 直接插入排序 希尔排序
选择排序类 简单选择排序 堆排序
交换排序类 冒泡排序 快速排序
归并排序类 归并排序