文章目录
标记表示记忆,标黑表示注意
一、计组
1、cache的全名、作用、映射方式和写操作的具体实现、多级cache
(1)全名
高速缓冲存储器
高速缓存
(2)作用
Cache的主要作用是存储那些由CPU频繁访问的数据和指令,从而减少访问主内存的次数,提高系统的整体性能,减少访存平均时间。
(使用局部性原理思想:空间局部性即一次从主存中调入一个块,时间局部性即存在高速缓存中方便下次访问,再次访问时速度更快。)
(3)映射方式
(映射方式指的是主存地址映射成cache地址的方式。)
地址映射方式分为:全相联映射 、直接映射 、组相联映射。
(4)写操作的具体实现
(写操作指的是CPU想要往主存中写一个数据(修改)。如果这个数据在cache中,若不同时更新cache和内存,则必将导致不一致的情况)
写直达、写回、写缓冲
(5)多级cache
第一级cache更注重速度,第二级cache更注重命中率,速度都比访问主存快得多。
补充:存储器知识
(1)局部性原理
(2)存储器的层次结构
存储器层次结构:一种由多存储器层次组成的结构,存储器的容量和访问时间随着离处理器距离的增加而增加。
这样组织的原因是:利用局部性原理,使得CPU访问存储器更快
- 如:离CPU 最近的依次是 Cache 、内存、磁盘,访问它的速度越来越慢,容量也越来越大。
原因是使用的硬件实现不一样,cache是SRAM(静态随机访问存储),内存是DRAM(动态随机访问存储),动态和静态的区别除了速度快,还有一个区别是,动态的需要隔几毫秒进行一次刷新,维持数据。
(3)主存地址映射
地址映射:应用某种函数,将主存地址映射到Cache中定位,从而可以将内存地址变换成Cache地址,完成CPU的访问。
地址映射方式也决定了CPU访问cache的方式,cache的结构,主存和cache地址交换的方式。
地址映射方式分为:全相联映射 、直接映射 、组相联映射。
注意主存到cache的存储信息交换的单位是块,CPU访问cache时都是先找块地址,而不是找具体数据地址。数据对应的块在cache内,则必然数据也在cache内
- 全相联映射:内存中的一个块,可以放在cache中的任意块的位置。
- 仅仅使用块地址比对
- 直接映射:其中每个固定的存储器地址仅仅对应到 cache中的一个固定位置。
- 主存地址中划分出一个块号,对应与cache中的第几块。对于一个cache块中的块是否是所需的,需要比较标记字段。
- 时间局部性存在问题,cache中同一个地方被覆盖,但再次访问又缺失了。
- 组相联映射:结合直接映射和全相连映射的特点,在组内采用全相连映射,任意放置,而一个内存中的数据地址放在一个固定的组内。
(4)写操作的处理
- 写直达:同时更新cache和主存。直达cache和主存。
- 写回:只更新cache,cache被替换时写回至主存。(dirty位)
- 写缓冲:更新cache和写缓冲即可,由写缓冲代之写入主存。
- 写缺失:也就是在cache中,这个块并不存在,则发生了缺失。我们需要先将块调入cache中,然后更新。
(5)虚拟存储器
在仅仅考虑cache和主存的关系时,不需要考虑虚拟存储的问题,直接认为cache和主存进行交互,CPU给的是主存物理地址即可。
如果考虑虚拟存储器,那么就引入了多进程概念了,开始考虑主存和磁盘之间的映射。页表启动!
cache是主存的cache,主存是磁盘的cache。
虚拟存储器:一种将主存用作辅助存储器高速缓存的技术。实际上就是让各进程认为自己有一个单独的地址空间。
- 在主存中维护一个页表用于虚拟页地址到主存页地址的映射。(CPU给出的是虚拟地址,通过页表基址寄存器和虚拟地址的虚页号可以在页表中可以找到对应的页表项,页表项中存了该页在磁盘中的位置,通过全相联的方式映射到主存中,这时更新后页表项中就存的时主存物理地址的页位置,使用虚拟地址的页内地址和物理页地址合并,就可以得到物理地址。为了使得CPU虚拟地址找到物理地址速度更快,使用TLB快表来实现。TLB存的是 最活跃的页表项,直接用虚拟地址页和TLB的所有虚拟地址比一遍。)
主存到磁盘的存储信息交换的单位是页,页远大于块。
也采用写回的方式,因为访问磁盘开销太大了。
ps:cache和页表都有引用位和脏位,cache的全相联部分和页表的引用位用于选择替换谁,引用位为1表示最近被使用了,优先不被替换。脏位表示被替换的时候是否写回。
Q:为什么磁盘页要以全相联方式放置在内存中?不使用cache的组相联之类的?
因为磁盘访问开销太大了,我们尽可能不替换它,页表的存在可以使得直接找到磁盘页在内存的位置,因此使用全相联尽量保证替换的次数最少,放置再次访问磁盘。
2、流水线数据冒险以及解决方式
(1)数据冒险:
当一条指令依赖于前一条指令的执行结果,但前一条指令的结果尚未计算完成时,后续指令已经开始执行。这种情况下,后续指令无法获取正确的数据,可能导致错误的执行结果。
简单来说就是,后面的指令需要用到前面指令写的数据,但前面指令还没写时,导致后面指令使用了旧值,导致错误。
(黑书定义:因无法提供指令执行所需数据而导致指令不能在预定的时钟周期内执行的情况。)
(2)解决方式
- 使用旁路(无法解决取数-使用型数据冒险,包括lw-lw和lw-add等。原因是存储器取数的前一阶段就是ALU计算。lw在取数时下一条指令就可以计算了。)
- 插入气泡(空指令),插入无关数据指令
(3)解决控制冒险的方法:
①假定分支不发生:假定不会发生跳转,正常顺序执行
②缩短分支的延迟:将beq指令的判断提前到ID阶段
③动态分支预测
二、数据结构
1、分布式场景下,十个计算节点的大规模排序问题
将数据均分成十组内部进行排序之后,使用多路归并排序
这里是多路归并排序问题:使可以用分治归并 或 使用优先队列合并
。
可以参考力扣题目:23. 合并 K 个升序链表
个人题解:23. 合并 K 个升序链表
2、红黑树和B树
BST、AVL、红黑树、B树都是用来查找的树形结构,他们都有增删改查的操作。但是它们使用的场景不一样,面试时主要是问红黑树和B树。
这些查找都是树形查找,由于对数底对时间复杂度不影响,所以这些树查找的平均时间复杂度都是O(logn),但为什么我们使用场景不一样呢?
我们需要进行磁盘中信息的索引时,比如数据库索引(比如主键索引)和文件索引,我们需要快速且访问磁盘次数尽可能少的算法,因为磁盘的I/O时间长,导致计算机性能瓶颈。
- 文件存储在磁盘上,I/O操作的时间成为瓶颈
- 使用哈希表一定存在冲突,散列不均匀变成线性查询,这不是我们想要的
- 使用二叉树查找,结点数量越多,树的深度越深,访问磁盘次数越多。AVL/红黑树等虽然可以实现O(logn)查询但是查询次数也很多。红黑树和AVL树都会随着数据的插入、发现树的深度会变深,意味着I/O次数越多,影响读取的效率。但这里我们引入多叉树却有更好的效果!!
B树,多叉树,我们可以在一个结点中存储更多的儿子信息,也就是索引信息。相当于我一次磁盘检索就可以找到更多的索引信息,比二叉树两个信息更多!虽然时间复杂度跟底数没关系,但是在磁盘访问上,可以看出有很大的区别。我们可以一个可以存多个儿子的位置,实现多路查询!因为这样的话我们访问了一个结点就能有更多的磁盘信息,访问磁盘次数比二叉树查找少得多!
那红黑树又比AVL好在哪儿呢?嗯?
- 在普通的内存查询的问题中,红黑树并不需要像AVL一样插入时花费很多时间来时刻保持平衡,而只需要保证左右子树的高度不大于2倍关系即可。这样没有牺牲插入时间,性能也很好。在C++STL的map和set中都使用到了红黑树(也支持顺序遍历)。在内存中查找的数据库系统等也有用到红黑树的。
B树的使用场景、优点、能够维护什么样的操作等
(1)使用场景
B树是一种自平衡的树数据结构
主要用于存储系统中的索引和数据库管理系统中。
(2)优点
效率高,高效的查找性能
优化磁盘I/O,更多的信息
动态扩展
(3)能够维护什么样的操作
增删改查,顺序遍历
红黑树的使用场景、优点、能够维护什么样的操作等
(1)使用场景
-
关联数组:红黑树可以用来实现标准库中的关联数组数据结构,如 C++ 中的
std::map
、std::set
和 Java 中的TreeMap
、TreeSet
。这些结构通常使用红黑树来维持元素的有序状态。 -
内存管理:某些类型的内存管理算法使用红黑树来维护内存块的各种大小,以便快速分配和释放内存。
-
数据库:数据库系统中的索引经常使用红黑树来快速查找记录。
- 红黑树可能用于一些特定场景的数据库索引,特别是在内存数据库或小型数据库中,其中数据量较小,且数据主要存储在内存中的情况。
B树更适合大数据量的磁盘存储场景,而红黑树可能更适合内存中的数据结构管理。
(2)优点
-
自平衡:红黑树通过在树中插入和删除节点时的旋转和重新着色,保持树的平衡,确保最长路径不会超过最短路径的两倍。这意味着树大致上是平衡的。
-
效率:操作如插入、删除和查找都可以在 O ( log n ) O(\log n) O(logn)时间内完成,其中 n n n 是树中的节点数。这对于动态数据集合(即频繁修改的数据)特别重要。
效率高B树和红黑树都有奥。
(3)能够维护什么样的操作
增删改查,顺序遍历
3、生成树算法的使用场景
(1)prim算法和Kruskal算法分别适合场景?
Prim算法:稠密图,时间复杂度
O
(
n
2
)
O(n^2)
O(n2),堆优化是
O
(
n
l
o
g
n
+
e
)
O(nlogn+e)
O(nlogn+e)
Kruskal算法:稀疏图,时间复杂度
O
(
e
l
o
g
e
)
O(eloge)
O(eloge)
Kruskal是使用边排序和并查集,边排序相当于时间复杂度约束于边的条数,如果有一亿个图顶点,但是是边很少的稀疏图,那么Kruskal会比prim快,所以Kruskal很适合稀疏图,因为点多边少对他有利。
(2)邻接矩阵存图时使用哪种算法
邻接矩阵常存储稠密图,使用Prim算法
第一个是因为邻接矩阵常存储稠密图;
第二个是因为使用Kruskal需要得到边,仍然需要对邻接矩阵进行一次遍历,时间复杂度变成了 O ( n 2 + e l o g e ) O(n^2+eloge) O(n2+eloge),它的优势没了。
而Prim算法的时间复杂度还是 O ( n 2 ) O(n^2) O(n2),因为对于每一个点都得遍历一次它的边来更新它的邻居,邻接矩阵需要 O ( n ) O(n) O(n),而选择最短顶点,每一次最坏也就 O ( n ) O(n) O(n),因此整体时间复杂度是 O ( n 2 ) O(n^2) O(n2),Kruskal还多了 e l o g e eloge eloge,且需要的空间复杂度也更高。
pk,稠稀,p稠k稀
三、离散数学
1、集合论
(1)集合基础
幂集
笛卡尔积
余集/补集:
A
的余集
=
E
−
A
,
E
是全集
A的余集 = E-A,E是全集
A的余集=E−A,E是全集
(2)关系:集合A与集合B上的一个二元关系
关系是
A
×
B
A×B
A×B的一个子集
R
R
R,根据幂集的数量可以知道
A
A
A、
B
B
B上一共有
2
a
b
2^{ab}
2ab个关系。
(3)A上的二元关系
若
A
=
B
A=B
A=B则,称关系为A上的二元关系。
A上的二元关系的重点种类:
- 空关系: R = ∅ R=∅ R=∅
- 全域关系: R = A × A R=A×A R=A×A
- 相等关系: I A = { ( x , x ) ∣ x ∈ A } I_{A}= \{(x,x)|x∈A\} IA={(x,x)∣x∈A}
for example:
- A A A是所有人的集合
- A A A上的一个关系 R R R,表示婚姻关系
- ( 张三,李四 ) ∈ R (张三,李四)∈R (张三,李四)∈R表示张三和李四是夫妻。但是序偶是有顺序的。但可以发现这里的夫妻关系并没有顺序关系,因此也有 ( 李四,张三 ) ∈ R (李四,张三)∈R (李四,张三)∈R,我们说这个集合具有对称性,这就引入了关系的性质。
(4)关系的性质
自反性:
对称性:
反对称性:反对称性,对
(
x
,
x
)
(x,x)
(x,x)没有约束
传递性:
反自反性:反自反不包含任何的
(
x
,
x
)
(x,x)
(x,x)
(5)等价关系
自反、对称、传递
(6)偏序关系
自反、反对称、传递
(7)1-1映射
满射+单射
A映射到B,B全能被映射到,则称为满射。
A的每一个都映射到一个B且映射到的B都不相同,则称为单射。
(8)集合的基数
- 阿列夫0:自然数集合
- 所有能和自然数集合对等的集合基数都是阿列夫0.
- 自然数集合称为可数集合。
- 无穷多个可数集合的并集是可数集合
- 有理数集合是可数集合
- 实数区间集合
- 不可数集合
- 不可数集合的基数不能被证明为阿列夫1,阿列夫1也不能被证明为不可数集合的基数。
2、鸽巢定理
这个原理的基本思想很直观:如果你有更多的物体要放入较少的容器中,那么至少有一个容器会包含多于一个的物体
- 抽屉原理:如果有十对袜子在抽屉里混合在一起,那么至少抽取11只袜子可以保证至少有一对颜色相同的袜子。
- 相当于均匀的取到极限,然后再加一个就必然会出现重复。
3、容斥原理
2、判断平面图,K5,K33定理之类的
特征值和特征向量的意义
(1)特征值(Eigenvalue)和特征向量(Eigenvector)
给定一个方阵 A A A(即行数和列数相等的矩阵),如果存在一个非零向量 v \mathbf{v} v和一个标量 λ \lambda λ,使得:
A v = λ v A \mathbf{v} = \lambda \mathbf{v} Av=λv
那么,这个标量 λ \lambda λ 称为矩阵 A A A 的一个特征值,非零向量 v \mathbf{v} v 称为对应于特征值 λ \lambda λ 的特征向量。
(2)意义
-
方向保持不变:
特征向量的方向在矩阵 A A A 的变换下保持不变,只是被拉伸或压缩。特征值 λ \lambda λ 描述了这种拉伸或压缩的程度。如果 λ \lambda λ 大于1,向量在变换后被拉伸;如果 λ \lambda λ小于1,向量被压缩;如果 λ \lambda λ为负,向量的方向也会翻转。 -
数据降维:
在数据分析中,特征值和特征向量用于确定数据的主要变化方向。在主成分分析(PCA)中,数据集的主成分是数据协方差矩阵的特征向量,而这些主成分的重要性由其对应的特征值的大小决定。
特征向量和特征值的概念源自线性代数中的矩阵理论。对于任何方阵,特征向量和特征值描述了这个矩阵的一些内在特性。理解为什么一个矩阵可以有多个特征向量,需要从线性变换的角度来考虑。
一个方阵可以存在多个特征向量
(3)一个方阵可以有多个特征向量和特征值
具体原因包括:
-
特征多项式:特征值是方阵 A A A的特征多项式的根。特征多项式是一个 n n n阶多项式,对于 n × n n \times n n×n 的矩阵,理论上可以有多达 n n n 个根,这些根可以是实数或复数,可以是不同的或重复的。
-
特征空间:每个特征值 λ \lambda λ 都对应一个特征空间,该空间由满足 ( A − λ I ) ⋅ v = 0 (A - \lambda I) \cdot v = 0 (A−λI)⋅v=0 的所有向量$v¥构成(这里 I I I 是单位矩阵)。特征空间可能包含多个线性独立的特征向量,特别是在特征值是重根的情况下。
-
维数:每个特征值的特征空间的维数被称为该特征值的代数重数。如果一个特征值的代数重数大于1,那么它的特征空间中将存在多个线性独立的特征向量。
(4)考虑一个简单的 2 × 2 2 \times 2 2×2 方阵:
A
=
[
4
1
0
3
]
A = \begin{bmatrix} 4 & 1 \\ 0 & 3 \end{bmatrix}
A=[4013]
对应的特征多项式是
(
4
−
λ
)
(
3
−
λ
)
=
0
(4 - \lambda)(3 - \lambda) = 0
(4−λ)(3−λ)=0,解出来的特征值是
λ
1
=
4
\lambda_1 = 4
λ1=4 和
λ
2
=
3
\lambda_2 = 3
λ2=3。对每个特征值求解
(
A
−
λ
I
)
v
=
0
(A - \lambda I)v = 0
(A−λI)v=0可以得到相应的特征向量。
因此,矩阵 A A A有多个特征向量,它们分别对应于不同的特征值,或者即使是同一个特征值也可能存在多个线性独立的特征向量。这使得矩阵能够描述多维空间中的各种独立变换方向。
你觉得科研成功最重要的因素是什么
钻研的精神,实验的精神,求真的精神,以及知识储备。