上午综合部分+下午设计部分也会考察到。算法基础部分在下午是最难的。
数组
首地址 + 元素位置 * 每个元素长度。
存储地址计算 | |
---|---|
一维数组 a[n] | a[i]的存储地址为a+i*len |
二维数组 a[m][n] | a[i][j]的存储地址(按行存储)为:a + (i x n + j) x len , a[i][j]的存储地址(按列存储)为:a + (j x m + i) x len |
稀疏矩阵
矩阵中大量元素为相同的数,只有小部分元素数据值不同。这样其实只要存下个性化的值,就相当于存下了整个矩阵。考点其实就是矩阵(二维数组)某一个元素转化成以为数组该元素所在的位置。
在矩阵中下标分别为i和j的元素,对应的一维数组的下标计算公式为
上三角:(2n - i + 1) x i / 2 + j
下三角:(i + 1) x i / 2 + j
做题时可以采用带入的方法。
数据结构
尤监尤介,视频的一些东西,听君一席话,如听一席话。
线性表
(a1, a2, a3, …, am, …, an)
顺序表和链表
顺序表:开辟连续的存储空间。
链表:有一个头结点,一个结点包括数据部分和指针部分,指针用于链接各个结点。链表又可以分为单链表、循环链表、双向链表。
单链表
循环链表:尾结点再连接到头结点。
双向链表:两个指针部分,可以指向后面,亦可以往回。
链表的操作
单链表删除结点;
单链表插入结点;
双向链表删除结点;
双向链表插入结点;
顺序存储与链式存储
性能类别 | 具体项目 | 顺序存储 | 链式存储 |
---|---|---|---|
空间性能 | 存储密度 | =1,更优 | <1 |
容量分配 | 事先确定 | 动态改变,更优 | |
时间性能 | 查找运算 | O(n/2) | O(n/2) |
读运算 | O(1),更优 | O([n+1]/2),最好情况为1,最坏为n | |
插入运算 | O(n/2),最好为0,最坏为n | O(1),更优 | |
删除运算 | O([n-1]/2) | O(1),更优 |
队列与栈
规则简单但是结合起来灵活性很强
队列:先进先出,队尾入,队头出。
队尾→ | 队头→ |
---|
栈:先进后出,栈顶入,栈顶出。(往箱子里放东西)
↔栈顶 | 栈底 |
---|
循环队列
队空条件:head = tail
队满条件:(tail + 1) % size = head。(尾指针下一个元素是头指针)
例子:
留下一个空间不存数据。6个空间,存5个数据,size = 5。空间序号0,1,2,3,4,5→0(5之后又回到0)
队空:队尾tail坐标0 , 队头head坐标0。验证一下公式:head = tail
依次入队:队尾入队。入队1个元素:tail = 1;入队2个元素:tail=2;以此类推。。。
依次出队:对头出队。出队1个元素:head=2;出队2个元素:head=2;以此类推。。。
队满:队头坐标:0,队尾坐标:4。坐标5没有存数据。验证一下公式(tail+1)%size=head。(4+1)%5=0。
告诉队头坐标head和size以及存了多少个元素n,求尾指针坐标。tail=(head+n)%size
出栈序列
栈:元素按照a、b、c顺序入栈,可能的出栈序列。
1.栈空间为1:abc
2.栈空间为2:bca、bac、acb
3.栈空间为3:cba
广义表
广义表是n个元素组成的有序序列,是线性表的推广。
LS=(a0, a1, a2, a3, …, an)
广度:长度;深度:递归定义的重数。原子的深度为0,空表的深度为1。
基本运算:取表头head(Ls)和表位tail(Ls)。(注:表尾是除了表头外所有的元素)
若有LS1=(a, (b, c), (d, e))
LS1的长度为3, 深度为2。
head(LS1) = a ; tail(LS1)=((b, c), (d, e))
若要取出LS1的b元素,需要做的操作为:head(head(tail(LS1)))
。。。烦人,出差回来后,考试已经结束了。。。
未完待续。。。。。。。。。。。