数据结构个人总结和程序框架

版权声明:皆为本人原创,复制必究 https://blog.csdn.net/m493096871/article/details/84000448


线性表
顺序逆序  单向链表 双向链表  循环链表 静态链表  
顺序存储方式
地址计算方法
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<i时  遍历链表,让p指针向后移动,不断指向下一结点,j累计加1
3到链表末尾p为空,说明第i个元素不存在
4否则查找成功,返回结点p的数据

扫描二维码关注公众号,回复: 4107720 查看本文章


单链表的插入  
实现 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路归并序列


快速排序  

基本思路: 通过一趟排序将待排记录分割成独立的两部分,稳重一部分记录的关键字均比另一部分的记录的关键字小,则可以分别对这两部分记录继续进行排序以达到整个序列有序的目的。


插入排序类  直接插入排序 希尔排序
选择排序类  简单选择排序  堆排序
交换排序类  冒泡排序   快速排序
归并排序类  归并排序

猜你喜欢

转载自blog.csdn.net/m493096871/article/details/84000448