目录
----------------------------------------------
数学公式:
- 排列组合公式(可能用于计算变形等)
![](https://img2018.cnblogs.com/blog/1265453/201908/1265453-20190810134337661-1339608038.png)
数据结构零碎知识
- 数据的存储结构分四大类 : 顺序存储(数组) 链式存储(链表)索引存储 散列存储(哈希表)
- 而按逻辑结构分又有:线性表,栈,队列,树,图等
- 用于压缩存储稀疏矩阵的是:三元组和十字链表。
- 三元组表的结点存储了行row、列col、值value三种信息,是主要用来存储稀疏矩阵的一种数据结构。
- 十字链表将行单链表和列单链表结合起来存储稀疏矩阵。
- 邻接矩阵空间复杂度达O(n^2),不适于存储稀疏矩阵。
- 二叉链表又名左孩子右兄弟表示法,可用于表示树或森林。
- 任何一个递归过程都可以转换成非递归过程。
字符串
线性表
链表
- 长度为无穷大的广义表不能在计算机中实现,但是无限递归的广义表可以在计算机中实现
- 存储密度 = (结点数据本身所占的存储量)/(结点结构所占的存储总量)
- 有头指针和尾指针的单链表中对最后一个元素进行删除或在最后一个元素后插入元素的区别:
- 插入因为有尾指针,插就好了;
- 删除需要将倒数第二个结点指向尾结点,而只有尾结点的单链表,要取到倒数第二个元素还需要从头开始遍历。
- 题目中所述"地址"是存放当前元素的地址,'链接地址"是指向当前元素的下一个元素的地址,相当于指针,看到不熟悉的描述不要懵了
![](https://img2018.cnblogs.com/blog/1265453/201908/1265453-20190811132938577-1677709442.png)
- 若某线性表最常用的操作是在最后一个元素之后插入一个元素和删除进入表中的最后一个元素,则采用(双向链表 )存储方式最节省运算时间和存储空间。
- 因为删除时用到尾指针的前一个指针,单向链表需要从头遍历整个链表。
- 若某线性表中最常用的操作是在最后一个元素之后插入一个元素和删除第一个元素,则采用( 仅有尾指针的单循环链表 )存储方式最节省运算时间。
- 与上一条的区别:不用删除最后一个元素因此不需要用到倒数第二个元素的指针,因此单链表即可。
- 构造链表:数据域;指向自身的指针域
![](https://img2018.cnblogs.com/blog/1265453/201908/1265453-20190811152549815-627098211.png)
![](https://img2018.cnblogs.com/blog/1265453/201908/1265453-20190811152605819-1009748307.png)
广义表
- 深度:从最右边看半括号个数(注意最外一层是不算的,它是作为head或者tail运算时整体的一部分的)。
- 如果计算的是head操作,会发现计算结果的右半括号个数是深度–1;
- 如果计算的是tail操作,会发现计算结果的右半括号个数是=深度;
- 广义表的表头表尾:
- 定义:若广义表Ls非空(n≥1),则al 是LS的表头,其余元素组成的表( a2,a3,…,an )称为Ls的表尾。
- 第一个元素是表头,其余元素是表尾,表尾要用()括起来,表头不用
- 如果只有一个元素,那么表尾为空即()
- 对任意一个非空的广义表,其表头可能是单元素,也可能是广义表,而其表尾一定是广义表。所以需要在表尾的直接元素外面再加一层括号。
- head(a,b):保留括号第一个元素a,去除其余;tail(a,b):去除第一个元素a,保留其余
- 注:对于表尾的(),分情况,有时候要仔细考虑,有时候就不用....
- 注:有时候括号很迷惑,头尾直接取括号里的??
- 例子若干:
![](https://img2018.cnblogs.com/blog/1265453/201908/1265453-20190811143423717-130520156.png)
![](https://img2018.cnblogs.com/blog/1265453/201908/1265453-20190811144103913-1682919213.png)
栈与队列
入栈出栈和入队出队:
- 队列:尾插入,头删除
- 看清题,输入顺序是否是常规的,还是倒序,或者乱序
- 对于数组给出的长度,注意是否从0开始,需不需要+1
- 队列注意rear指向的是队尾的元素还是队尾的下一个元素(大话中是下一个元素)
- 栈空的情况下出栈属于下溢出,说“溢出”不算错
- 循环队列的一些公式(rear指向尾的下一个,队满为仍保留一个元素)
- 1.队空条件:rear==front
- 2.队满条件:(rear+1) %QueueSIze==front,其中QueueSize为循环队列的最大长度
- 3.计算队列长度:(rear-front+QueueSize)%QueueSize
- 4.入队:rear = (rear+1)%QueueSize
- 5.出队:front = (front+1)%QueueSize
- 求出栈序列个数:卡特兰数公式:C(2n,n)/(n+1)
- 其中,卡特兰数前几项为: 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796
- 根据排列组合公式:
![](https://img2018.cnblogs.com/blog/1265453/201908/1265453-20190810153919379-567220742.png)
- 树的深度优先遍历是用到栈,树的广度优先遍历用到队列
- 输出受限的双端队列:删除限制在一端进行,而插入仍允许在两端进行。
![](https://img2018.cnblogs.com/blog/1265453/201908/1265453-20190810212452639-946526220.png)
栈
- 后缀表达式的计算规则:
- 从左到右遍历表达式的每个数字和符号
- 遇到数字就进栈
- 遇到符号,就将处于栈顶的两个数字出栈,并运算,且运算结果进栈
- 直到最终获得结果
- 中缀表达式转后缀表达式的规则:
- 从左到右遍历中缀表达式的每个数字和符号
- 若是数字就输出,即成为后缀表达式的一部分
- 若是符号,先判断其与栈顶符号的优先级
- 是右括号或优先级低于栈顶符号,则栈顶元素依次出栈并输出,并将当前符号进栈
- 若优先级高于栈顶符号,则不用管栈顶,直接压栈
- 直到最终输出后缀表达式为止
队列
- Redis和kafka都是常见的开源队列。
- 循环队列:队列的头尾相接的顺序存储结构。因此循环队列是一种顺序存储结构。
- 队列的链式存储:队头指针指向链队列的头结点,队尾指针指向终端结点。尾插入头删除。
树与二叉树
二叉链表
- 在有n个结点的二叉链表中,值为非空的链域的个数为n-1,值为空的链域个数为n+1。
- 每个结点都会有左右指针各两个,故n个结点有2n个链域
- n个结点n-1个指针就可以互连,所以还剩2n-(n-1)=n+1
- 看清问的是空还是非空!!!
END
posted @
2019-08-06 09:24
anliux
阅读(
856)
评论()
编辑
收藏
举报