算法与数据结构
1.数组(里面的点为空格)
数组类型 | 存储地址运算 |
---|---|
一维数组a[n] | a[i]的存储地址为:a+i*len 例子:a[0] = a, a[1] = a + 1 |
二维数组a[m][n] | a[i].[j]的存储地址(按行存储)为:a+(i * n + j) * len a[i][j]的存储地址(按列存储)为:a+(j * m + i) * len |
已知5行5列的二维数组a中的各元素占两个字节,求元素a[2][3]按行优先存储的存储地址?
根据二维数组按行公式a+(i * n + j) * len:我们可求出a + (2 * 5 + 3) * len = a + 13 * 2. 其中:i 代表几行,n 代表总共几列, j 代表这列有几个元素,len 代表每个位置上所占用的字节数。
2.数据结构的定义
从大体意义上来讲,图可以包含树,树可以包含线性结构的。
3.线性表的定义
图中:
- 顺序表就是开辟了连续的空间,依次存储的(就是采用了一位数组的方式)
- 链表就是磁盘上哪里空闲了开辟哪里的空间,连起来之后就形成了链表。
链表进一步可以分为 单链表、循环链表、双向链表
单链表:只有一套指针,指针挨个指过去,例如:头结点---1---2---3....
循环链表:把尾元素的指针指向了头结点,定位元素的时候可以继续往下走,不用重头结点开始。
双向链表:指针既可以往前有可以往后,不像单指针一样只往一个方向走。
单链表删除结点原理:假设a3的地址为x,那么a1的地址p —>next = x指向a3从而删除a2链接起来,
单我们看图中q—>next指向a3,所以a1的地址p —>next = q—>next从而a2删除结点。
单链接插入结点原理:一个x值指针为s的数据插入先链接a2地址(p—>next)(尾),即s—>next = p—>next,接着链接a1地址(p—>next)(头),即p—>next = s—>next。
顺序存储与链式存储对比
![](https://img-blog.csdnimg.cn/20190302135334590.JPG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIwNTUzMDA3,size_16,color_FFFFFF,t_70)
释义:
空间性能等于1为所有空间都用在了数据存储上面,<1为有部分空间用在了存储地址上面,即66.6666%
查找运算顺序存储更优。
读运算:顺序存储直接读取,而链式存储的一个一个去比较地址读取。
插入运算:顺序存储插入前提下必须插入这个元素的后面所有元素往后移一下,而链式插入直接插入,为更优,删除用理。
队列与栈(重点):
习题:
如果只是认为c、b、a那我对栈的认识还比较肤浅,还可能有a、b、c,a进栈后直接出栈,同理b、c也是所得,还可以得到
b、c、a,a进栈,接着b进栈直接跳出,c也一样,左后a出栈,所以还有a、c、b b、a、c c、a、b.
树与二叉树
节点的度:每个节点有几个节点就是几度。
树的度:每个节点的分支最大值。图中是2度
叶子节点:像4、5、7、8都是叶子节点,因为它们都属于最下成,且没有结点
分支节点:有分支的节点。
内部节点:2、3、6,非叶子节点以及非根节点而夹在中间的节点。
父结点、子节点:例如针对2,针对2的父结点就是1,针对2的子结点就是4、5.
兄弟结点:4、5就是兄弟结点,属于一个父亲并且在同一级就是子宫底结点
层次:4层
几种比较特殊的二叉树:
最少有n个节点
深度为k最少有一个节点
这张图片讲的是最后两行的图解;
前序遍历:跟左右 1、2、4、5、7、8、3、6
中序遍历:左跟右 4、2、7、8、5、1、3、6
后序遍历:左右跟 4、8、7、5、2、6、3、1
根据前序性质跟左右以及中序性质左跟右推出结果: