一、数据结构与算法
1.时间复杂度和大 O 表示法:
- 时间复杂度描述算法的运行时间与输入数据规模之间的关系。大 O 表示法用于表示算法的时间复杂度,常见的有 O(1), O(log n), O(n), O(n log n), O(n^2) 等等。
2.线性存储结构和链式存储结构:
- 线性存储结构是指数据元素依次存储在内存中的连续地址上,比如数组。
- 链式存储结构是指数据元素存储在内存的非连续地址上,通过指针链接,比如链表。
3.顺序存储与链式存储:
- 顺序存储指的是数据存储在连续的存储空间中,常见的例子是数组。
- 链式存储则是数据存储在不连续的存储空间中,通过指针将数据链接起来,常见的例子是链表。
4.头指针和头结点的区别:
- 头指针是指向链表第一个结点的指针。
- 头结点是链表的第一个结点,通常用于存放链表的一些信息或作为哨兵节点。Dummy
5.循环队列的元素个数计算:
- 元素个数的计算公式为:(rear - front + capacity) % capacity,其中 capacity 是队列的总容量。
6.循环队列的空满判断:
- 队列为空的条件是 front == rear。(也就是rear指针指向的元素是不作数的)。
- 队列为满的条件是 (rear + 1) % capacity == front。
7.哈希表:
- 哈希表是一种用于实现快速数据查找的数据结构,通过哈希函数将键值映射到数组中的某个位置来快速找到目标数据。
8.判断链表是否有环:leetcode 141
- 可以使用快慢指针法:设置两个指针,慢指针每次走一步,快指针每次走两步。如果链表中有环,两个指针最终会相遇。
9.平衡二叉树、二叉排序树、完全二叉树、二叉搜索树:
- 平衡二叉树是左右子树高度差不超过1的二叉树。
- 二叉排序树是一种二叉树,左子树所有结点值小于根结点值,右子树所有结点值大于根结点值。
- 完全二叉树是除了最后一层外,每一层都是满的,且最后一层的结点是从左到右依次填充的。
- 二叉搜索树是一种特殊的二叉树,满足左子树小于根节点,右子树大于根节点。
10.由遍历序列构造二叉树:(实现?)
- 如果给出前序和中序或后序和中序遍历序列,可以唯一确定一个二叉树。
11.B 树和 B+ 树:408数据结构考点:B树 - 知乎 (zhihu.com)
- B 树是一种平衡的多路查找树。
- B+ 树是 B 树的变种,它的所有叶子结点都在同一层,且叶子结点间通过指针连接,适合区间查询。
12.红黑树:
- 红黑树是一种平衡二叉搜索树,每个节点带有颜色属性,通过红黑规则来保持树的平衡,确保时间复杂度为 O(log n)。
13.多种排序算法:
- 常见的排序算法有:冒泡排序、选择排序、插入排序、归并排序、快速排序等。(具体实现待更)
14.最小生成树和最短路径算法:
- 最小生成树算法包括 Prim 算法和 Kruskal 算法,用于求解加权连通图的最小生成树。
- 最短路径算法包括 Dijkstra 算法和 Floyd-Warshall 算法,用于求解图中两点之间的最短路径。
15.深度优先搜索和广度优先搜索:
- 深度优先搜索 (DFS) 是一种沿着树的深度遍历的算法,使用栈(递归调用)实现。
- 广度优先搜索 (BFS) 是一种沿着树的宽度遍历的算法,使用队列实现。
16.字符串匹配算法:
- 常见的字符串匹配算法包括暴力匹配算法、KMP 算法等,用于在文本中查找子串。
17.堆和栈的区别:
- 栈是后进先出(LIFO)的内存结构,主要用于函数调用、局部变量存储。
- 堆是动态内存分配的区域,用于存储需要动态分配的对象和数据。
18.Top-K 算法:
- Top-K 算法用于从数据流或大量数据中找到最大的 K 个元素,常用的实现方法包括堆排序和快速选择算法。
AcWing 786. 第k个数 - AcWinghttps://www.acwing.com/activity/content/problem/content/820/
19.树转换为等价的森林:
- 树转换为森林的过程是去掉树的根节点,根节点的子树即为森林。
20.平衡二叉树的构建:
- 平衡二叉树的构建通过在插入和删除节点时调整树的结构,确保树的高度差不超过 1,常见的实现包括 AVL 树和红黑树。
21.数据结构的重要性:
- 数据结构是计算机科学的基础,决定了算法的执行效率和程序的存储需求,影响着软件的性能和可维护性。
22.平衡二叉树的优势:
- 平衡二叉树具有较低的树高度,确保查找、插入和删除操作的时间复杂度为 O(log n),提高了效率。
23.哈夫曼编码:
- 哈夫曼编码是一种无损数据压缩算法,通过使用频率较高的字符对应较短的编码来压缩数据。
24.AVL 树:
- AVL 树是最早的平衡二叉搜索树之一,每个节点的左右子树的高度差不超过 1,确保 O(log n) 的时间复杂度。
25.图的拓扑排序:
- 图的拓扑排序用于对有向无环图(DAG)中的节点进行线性排序,使得对图中每条有向边 (u, v),节点 u 在 v 之前。
26.并查集:
- 并查集是一种处理不相交集合合并和查询的数据结构,主要用于解决连通性问题。
27.Trie 树:
- Trie 树是一种用于高效存储和检索字符串集合的数据结构,特别适合处理大量前缀共享的字符串。
28.跳表:
- 跳表是一种在链表上增加多级索引的结构,能够提高链表查找的效率,平均时间复杂度为 O(log n)。
29.字典序:
- 字典序是字符串的排列顺序,即按字母顺序排列,如同字典中单词的排列方式。
30.二叉树中找到最大值:
- 在二叉搜索树中,最大值在最右侧的节点;在普通二叉树中,可以使用递归遍历来比较各节点的值。
31.判断二叉树是否为平衡二叉树:
- 可以使用递归方法,检查每个节点的左右子树高度差是否不超过 1,并确保所有子树也是平衡的。
32.树转换为二叉树:
- 可以通过“孩子-兄弟表示法”将多叉树转换为二叉树,其中每个节点的第一个孩子作为左子节点,兄弟节点作为右子节点
33.KMP的时间复杂度O(m + n)
====408数据结构选择题真题=====
①稀疏矩阵,三元组存储
②huffman树与等长编码
1)huffman
2)huffman与等长编码
③B树:
④二分/折半查找
⑤散列表hash
1)在理想情况下,n个元素的散列表查找的复杂度是O(1)。
2)影响散列(哈希)方法平均查找长度的是( )。
I. 装填因子
II. 散列函数
III. 冲突解决策略
A. 仅I、II B. 仅I、III C. 仅II、III D. I、II、III
解答:
本题为送分题,散列(哈希)表三要素,全选。
⑥有关排序:
插入排序和快排的比较:
快排的空间复杂度(产生于递归)
⑦M叉树
Q: 已知一颗度为m的树中,有n1个度为1的结点,有n2个度为2的结点...有nm个度为m的结点,问该树有多少个叶子结点?
⑧时间复杂度求解:
二、计网
1.OSI模型和TCP/IP模型:
- OSI模型: 七层体系结构,用于标准化通信功能(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层)。
- TCP/IP模型: 四层体系结构,应用于互联网(链路层、网络层、传输层、应用层),比OSI模型更为实际。
2.计算机网络分层的优点:
- 模块化设计、便于故障排查、标准化、互操作性强、能够在不影响其他层的情况下升级或增强某一层。
3.单工、半双工、全双工通信:
- 单工: 数据只在一个方向上传输(如键盘到计算机)。
- 半双工: 数据可以在两个方向上传输,但同一时间只能一个方向传输(如对讲机)。
- 全双工: 数据可以同时在两个方向上传输(如电话)。
4.协议的三要素:
- 语法: 数据格式和编码。
- 语义: 控制信息和错误处理。
- 同步: 速率匹配和时序控制。
5.香农公式(香农-哈特利定理):
- 通过带宽和信噪比计算信道的最大数据传输速率。
6.CSMA/CD协议:
- 载波侦听多路访问/冲突检测:用于以太网网络,通过检测冲突并在随机延迟后重传来避免数据冲突。
7.TCP和UDP的异同点:
- TCP: 面向连接,可靠但速度较慢(如HTTP, FTP)。
- UDP: 无连接,速度快但不可靠(如DNS, 流媒体)。
8.TCP的三次握手和四次挥手过程:
- 三次握手: SYN,SYN-ACK,ACK用于建立连接。
- 四次挥手: FIN,ACK,FIN,ACK用于断开连接。
9.TCP和UDP协议的头部结构:
- TCP头部: 包含序列号、确认号、标志位(如SYN, ACK等)。
- UDP头部: 较为简单,包含源端口、目的端口、长度和校验和。
10.TCP建立连接的过程和可靠传输保证:
- TCP通过三次握手建立可靠连接,并通过确认和重传机制保证数据完整性。
11.TCP拥塞控制中的算法:
- 慢启动、拥塞避免、快速重传、快速恢复是TCP拥塞控制的关键组成部分。
12.TCP快速重传机制:
- 收到三个重复的ACK时,触发快速重传机制,在超时前重传丢失的数据包。
13.流量控制与拥塞控制的关系:
- 流量控制: 管理发送方与接收方之间的数据速率。
- 拥塞控制: 管理网络整体数据速率以防止网络拥塞。
14.UDP报文收发问题原因:
- 由于没有重传机制、网络拥塞、缓冲区溢出、以及缺乏流量控制导致数据丢失。
15.ARP和RARP协议:
- ARP(Address Resolution Protocol,地址解析协议): 将IP地址解析为物理地址(MAC地址)。(IP地址->MAC地址)
- RARP(Reverse ARP,反向地址解析协议): 将物理地址(MAC地址)解析为IP地址。
16.网卡的功能:
- 连接计算机和网络,处理数据的物理传输和接收。
- 网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件。由于其拥有MAC地址,因此属于OSI模型的第1层和2层之间。它使得用户可以通过电缆或无线相互连接。
- 每一个网卡都有一个被称为MAC地址的独一无二的48位串行号,它被写在卡上的一块ROM中。在网络上的每一个计算机都必须拥有一个独一无二的MAC地址。
- 没有任何两块被生产出来的网卡拥有同样的地址。这是因为电气电子工程师协会(IEEE)负责为网络接口控制器(网卡)销售商分配唯一的MAC地址。
17.网络中主机通信流程:
- 包括数据封装、传输、路由选择、解封装,最终达到目标主机并进行数据处理。
18.主机多端口对吞吐量的影响:
- 多端口能够并行处理多个数据流,从而提高主机的总吞吐量,但也可能导致网络拥塞或负载不均。
19.DNS域名解析过程:
- DNS解析是将域名转换为IP地址的过程,通常通过递归查询和迭代查询方式完成。
20.HTTP请求过程:
- 包括客户端向服务器发送请求,服务器处理请求并返回响应,涉及到请求行、请求头、请求体的传输。
21.IP地址和MAC地址的区别和用途:
- IP地址: 网络层地址,用于在网络中进行路由和寻址。
- MAC地址: 数据链路层地址,用于局域网中设备的唯一标识。
22.HTTP状态码及HTTP与HTTPS的区别:
- HTTP状态码: 常见的如200(成功),404(未找到),500(服务器错误)等。
- HTTP与HTTPS的区别: HTTPS是HTTP的安全版,使用SSL/TLS协议加密数据传输。
23.DHCP的作用:
- 动态主机配置协议(DHCP)自动分配IP地址及网络配置参数给网络设备,简化网络管理。
24.应用层与网络层的数据交换:
- 应用层通过网络层的协议(如IP协议)进行数据封装和传输,应用层数据被封装在网络层数据包中进行路由。
25. Socket的概念:
- Socket是网络通信的端点,应用程序通过Socket发送和接收数据,使用特定的协议(如TCP/IP)。
- 在网络中,套接字扮演的角色正如插座一样,它是一个端点,可以与网络中的其它套接字建立连接。套接字是一个位于网络中特定节点的服务所具有的标识符。套接字包含一个节点地址和一个端口号,用来标识这一服务。
- 在网络中,由IP地址可以唯一确定一台主机,但是准确来说,网络通讯中的双方并不是主机,而是运行在主机上的进程,这样就需要进一步确定是主机中的哪个进程要进行网络通讯。因此,除了IP地址之外,还需要端口号来唯一确定主机中的通讯进程。IP地址和端口号就构成了一个网络中的唯一标识符,即套接字。
- Socket被用于客户端/服务端应用框架中。服务端是一个针对客户端的请求执行某些特定操作的进程。大多数应用层协议如FTP、SMTP和POP3使用Socket来建立客户端与服务端之间的连接,从而进行数据的交换。
26. Cookie和Session的区别:
- Cookie: 存储在客户端,用于保存用户状态。
- Session: 存储在服务器,用于跟踪用户会话。
- 彻底了解Cookie和Session的区别(面试)_session和cookie的区别-CSDN博客
27. 路由器的作用:
- 路由器在不同网络之间转发ip数据包,决定数据包的最佳传输路径。
- 隔离广播域
- 将不同网段上的设备进行互通。
====408真题====
①时延计算题目
②奈奎斯特定理
③数据链路层三种流量控制协议的利用率
④NAT/源ip地址
⑤IPv6和IPv4
⑥TCP/IP相关
1)ACK
A主机发给B的数据,seq=x,那么B回送给A的ack = x + 1,即累积确认机制(前面一直到数据x都没问题,希望下面A送来的数据是x+1开始的序号)
⑦应用层相关
发qq邮件用的协议是什么?
⑧OSI七层:
该模型将通信系统划分为七层,从下到上依次为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
物理层为数据链路层在一条物理的传输媒体上传送和接收比特流。
数据链路层具有实现两个相邻结点之间流量控制功能。
网络层具有实现点到点之间流量控制功能。
传输层具有实现端到端之间流量控制功能。
⑨子网掩码和默认网关
10.SDN网络体系结构
11.TCP三次握手建立连接和四次握手释放连接
C数据发完了,用fin告诉S我发完了,但通常来说S不一定也发完了,这里面问至少,所以,认为同时发完了,同时断开。
这里C向S发完ACK后,还要等待报文段在网络中的寿命的两倍时间,这时候C才会真正的Closed。
综合应用:
三、操作系统
1.操作系统的特点和功能:
- 提供资源管理(如CPU、内存、I/O设备)、进程管理、文件管理和用户界面等功能。
2.中断和系统调用的区别:
- 中断: 硬件或软件事件触发的处理机制,打断当前执行流。
- 系统调用: 用户程序请求操作系统服务的接口。
3.进程和线程的概念及区别:
- 进程: 操作系统中的一个运行实例,拥有独立的内存空间。
- 线程: 进程中的一个执行单元,线程共享进程的内存。
4.进程的状态和调度策略:
- 进程状态: 包括新建、就绪、运行、等待、终止。
- 调度策略: 如先来先服务(FCFS)、短作业优先(SJF)、时间片轮转调度等。
5.读写者问题、文件系统组织:
- 读写者问题: 经典的同步问题,涉及多个进程对共享资源的读写操作。
- 文件系统组织: 如树形结构、目录和文件的层次关系,文件的存储和管理。
6.死锁、产生条件及预防:
- 死锁: 系统中多个进程相互等待,无法继续执行。
- 产生条件: 互斥、占有且等待、不剥夺、循环等待。
- 预防: 资源分配时避免满足死锁条件,如银行家算法。
7.哲学家进餐问题:
- 经典同步问题,五个哲学家和五根筷子的争用问题,用于模拟资源竞争和死锁。
8.银行家算法:
- 死锁避免算法,通过判断资源分配后的安全状态来决定资源是否分配。
- 银行家算法---------概念&举例_银行家算法例子-CSDN博客
9.进程调度算法:
- 常见的调度算法有先来先服务(FCFS)、最短作业优先(SJF)、优先级调度、时间片轮转(RR)、多级反馈队列等。
10.分页、分段、虚拟内存和共享内存:
- 分页: 将内存分成固定大小的页,简化内存管理。
- 分段: 将内存划分为大小不一的段,便于逻辑组织。
- 虚拟内存: 通过使用磁盘空间扩展物理内存,使程序能超出实际内存大小运行。
- 共享内存: 不同进程可以访问同一块内存,实现进程间通信。
11.页面置换算法:
- 常见算法: 如FIFO(先进先出)、LRU(最近最少使用)、OPT(最佳置换算法)、LFU(最少使用频率)。
12.缓冲区溢出处理:
- 缓冲区溢出是指程序在写入数据时超过了缓冲区的容量。常见的处理方法包括:使用安全函数、进行边界检查、使用堆和栈的保护机制(如堆栈金丝雀)等。
13.磁盘调度和存储管理:
- 磁盘调度算法如FCFS、SSTF(最短寻道时间优先)、SCAN(电梯算法)、C-SCAN(循环扫描)等。
- 存储管理涉及到磁盘分区、文件系统管理、以及数据的物理存储和逻辑组织。
14.文件系统组织:
- 文件系统通过目录结构组织文件,常见的组织方式包括树形结构、图形结构(如DAG),不同的文件系统(如FAT32、NTFS、ext4)采用不同的组织和管理方式。
15.进程饥饿原因:
- 饥饿(Starvation)通常是由于某个进程优先级过低,长时间得不到资源调度造成的,可以通过动态调整优先级等方法解决。
16.操作系统启动过程:
- 包括从BIOS/UEFI启动加载器,然后加载操作系统内核,最后启动用户级进程和服务。
17.进程与线程的使用场景:
- 进程: 用于需要隔离的任务,适合高独立性、高资源需求的应用。
- 线程: 用于并发任务,需要共享资源的任务,适合高效、轻量级的并发处理。
18.冯诺依曼机体系结构:
- 包括五大部分:运算器、控制器、存储器、输入设备和输出设备,核心思想是存储程序,即程序和数据存储在同一内存中。
19.计算机性能指标:
- 主要有时钟频率、CPI(每指令周期数)、MIPS(每秒百万条指令)、内存带宽、缓存命中率等。
20.原码、反码、补码:
- 原码: 符号位+绝对值表示法。
- 反码: 正数反码与原码相同,负数反码为符号位不变,其余位取反。
- 补码: 正数补码与原码相同,负数补码为反码加1。
21.奇偶校验、汉明码校验、循环冗余校验:
- 奇偶校验: 通过增加一位校验位来检测数据传输中的单比特错误。
- 汉明码校验: 能检测并纠正单比特错误。
- 循环冗余校验(CRC): 用于检测数据的传输或存储错误,常用于网络通信和文件传输。
22.存储器分类:
- 主要分为主存(如RAM、ROM)和辅助存储器(如硬盘、SSD);根据访问方式分为随机存取存储器和顺序存取存储器。
23.段页式虚拟内存:
- 段页式虚拟内存结合了分段和分页技术,提供了更灵活的内存管理,可以更有效地利用内存空间。
24.CPU指令周期流程:
- 包括取指(Fetch)、译码(Decode)、执行(Execute)、访存(Memory Access)、写回(Write Back)。
25.总线通信方式:
- 包括单总线和多总线结构,采用并行或串行通信模式,总线仲裁机制决定设备如何访问总线。
26.CPU和GPU的区别和作用:
- CPU(中央处理器): 适合处理复杂的计算任务,通用性强。
- GPU(图形处理器): 擅长并行处理大量数据,适合图形渲染和科学计算。
27.段式、页式、段页式内存管理:
- 段式: 逻辑内存分段,独立管理。
- 页式: 物理内存按页管理,便于虚拟内存实现。
- 段页式: 结合段式和页式的优点,提升了内存管理的灵活性和效率。
======408真题======
①宏内核与微内核特点比较
②中断向量表
③位图
④用户态和内核态
⑤三态的转换
1)进程P读文件会让进程p从运行态进入阻塞态。
⑥进程虚拟空间
⑦文件系统
⑧设备分配
⑨Linux
10.多道程序系统
11.操作系统的初始化
12.进程调度的次数不是切换进程的次数。
13.缺页
14.驱动程序
四、数据库
1. 一二三范式
- 第一范式(1NF):确保每一列的值都是原子的,即列不能包含多个值或重复的组。
- 第二范式(2NF):在满足第一范式的基础上,要求表中的非主键列完全依赖于主键,不能依赖于主键的一部分。
- 第三范式(3NF):在满足第二范式的基础上,要求非主键列不能依赖于其他非主键列,即消除传递依赖。
2. SQL查询语句
- SQL查询语句包括
SELECT
、INSERT
、UPDATE
、DELETE
等操作。复杂查询还涉及JOIN
、GROUP BY
、HAVING
、子查询和集合操作(如UNION
、INTERSECT
、EXCEPT
)等。
3. 数据库类型和关系型数据库特点
- 关系型数据库(RDBMS):数据以表格的形式存储,具有结构化的数据模型,常用的关系型数据库包括MySQL、PostgreSQL、Oracle等。
- 非关系型数据库(NoSQL):包括键值存储、文档存储、列存储和图形数据库,适用于大规模、高并发的场景,如MongoDB、Redis、Cassandra等。
4. 数据库锁的种类
- 共享锁(S锁):允许多个事务读取数据但不能修改。
- 排他锁(X锁):允许一个事务读写数据,同时阻止其他事务访问。
- 意向锁:用于多粒度锁定机制,表明一个事务打算对某个对象加锁。
- 乐观锁:不使用数据库锁机制,而是在更新数据时检测冲突。
- 悲观锁:假设会发生冲突,先加锁再操作。
5. 数据库的完整性约束
- 实体完整性:主键不能为NULL,每行数据必须是唯一的。
- 参照完整性:外键值要么为NULL,要么匹配到父表中存在的值。
- 域完整性:确保字段的值在一定范围内或符合特定的格式。
- 用户定义完整性:由应用程序或用户定义的业务规则。
6. 事务与锁的概念
- 事务:是数据库的逻辑工作单元,具有ACID(原子性、一致性、隔离性、持久性)特性。
- 锁:是为了保证数据库并发访问时数据的正确性和一致性。锁机制用于控制多个事务对相同数据的并发访问。
7. 存储过程和触发器
- 存储过程:是一组预编译的SQL语句,可以在数据库中保存并重复执行。它提高了代码重用性和执行效率。
- 触发器:是在某些事件(如INSERT、UPDATE、DELETE)发生时自动执行的SQL语句,用于保持数据一致性或自动执行业务逻辑。
8. 数据库ACID特性和REDO/UNDO机制
- ACID特性:
- 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不执行。
- 一致性(Consistency):事务执行前后,数据库状态必须保持一致。
- 隔离性(Isolation):一个事务的执行不能被其他事务干扰。
- 持久性(Durability):事务一旦提交,对数据的修改是永久的。
- REDO/UNDO机制:
- REDO日志:用于重做已提交事务的操作,以确保数据的持久性。
- UNDO日志:用于回滚未提交事务的操作,以恢复数据到先前的状态。
9. MySQL存储引擎及区别
- InnoDB:支持事务、外键、行级锁,适用于高并发和数据一致性要求高的场景。
- MyISAM:不支持事务和外键,使用表级锁,适合读取操作多于写入操作的应用场景。
10. 数据库优化和索引使用
- 索引:是一种数据结构,能够快速查询数据。常见的索引类型包括B树索引、哈希索引、全文索引等。
- 优化方法:包括使用索引、优化查询语句、分区表、缓存机制、数据库规范化、减少锁竞争等。
11. 软件工程概念和三要素
- 软件工程:是关于软件开发、操作、维护的一系列方法、技术和实践。软件工程的三要素是过程、方法和工具。
12. 软件生命周期
- 软件生命周期指软件从需求分析、设计、编码、测试、部署、维护到最终退役的整个过程。
13. 软件开发模型
- 常见的软件开发模型包括瀑布模型、增量模型、螺旋模型、V模型、敏捷开发等,每种模型适用于不同的项目类型和需求。
五、编译原理
1. 编译过程和First、Follow集合的求法
编译过程
编译是将源代码转换为目标代码的过程,通常包括以下几个阶段:
-
词法分析(Lexical Analysis):
- 将源代码分解为记号(token),这些记号是语法分析的基本单位。
- 词法分析器识别出关键词、标识符、操作符和分隔符等。
-
语法分析(Syntax Analysis):
- 语法分析器根据语法规则将记号流解析成语法树(或抽象语法树)。
- 语法分析器通常基于上下文无关文法(CFG)工作。
-
语义分析(Semantic Analysis):
- 检查语法树是否符合语言的语义规则,如类型检查、作用域分析等。
- 确保程序语义的正确性。
-
中间代码生成(Intermediate Code Generation):
- 将语法树或语法制导的中间表示转换为中间代码,中间代码是一种介于源代码和目标代码之间的表示形式。
-
代码优化(Code Optimization):
- 改善中间代码或目标代码的效率,减少运行时间或降低内存占用。
-
目标代码生成(Code Generation):
- 将中间代码转换为特定机器或虚拟机上的目标代码(如汇编代码或字节码)。
-
代码链接与装载(Linking and Loading):
- 将多个目标文件和库文件链接成可执行文件,装载到内存中准备执行。
First和Follow集合的求法
在语法分析中,First和Follow集合是用于构造预测分析表的重要工具,特别是在LL(1)分析法中。
-
First集合:
- 对于任意文法符号X,First(X)集合是能够出现在由X推导出的任意串的第一个符号的集合。
- 计算规则:
- 如果X是终结符,则First(X) = {X}。
- 如果X → Y1 Y2 … Yn是一个产生式,将First(Y1)中的所有非ε元素加入First(X)。
- 如果First(Y1)包含ε,则继续将First(Y2)中的元素加入First(X),以此类推。
- 如果所有Yi的First集合都包含ε,则将ε加入First(X)。
-
Follow集合:
- 对于非终结符A,Follow(A)集合是可以跟在A后面的终结符集合。
- Follow集合的求法:
- 如果A是文法的开始符号,将结束符号
$
加入Follow(A)。 - 如果存在产生式B → αAβ,则将First(β)中的非ε元素加入Follow(A)。
- 如果β可以推导出ε,或β为空,则将Follow(B)中的所有元素加入Follow(A)。
- 如果A是文法的开始符号,将结束符号
2. 上下文无关文法的特点
上下文无关文法(Context-Free Grammar, CFG)是编译原理中用于描述程序语言语法的文法形式,其特点是:
- 产生式规则的左侧:每个产生式规则的左侧是一个单一的非终结符。
- 产生式规则的右侧:可以是终结符和非终结符的任意组合。
- 独立于上下文:非终结符的推导不依赖于它的上下文,即不考虑左邻或右邻的符号。
- 广泛应用:CFG广泛用于设计解析器,如语法分析器和编译器中的解析器。
示例:
S → aSb | ε
这个文法生成的语言是由相等数量的'a'和'b'组成的字符串,如 "ab", "aabb", "aaabbb" 等。
3. 0型、1型、2型、3型文法及其关系
Chomsky层次结构将文法分为以下四种类型:
-
0型文法(无限制文法):
- 最一般的文法形式。
- 产生式形式为 α → β,其中 α, β 为任意字符串,且 α 至少包含一个非终结符。
- 这种文法可以描述所有可计算的语言(即递归可枚举语言)。
-
1型文法(上下文相关文法):
- 产生式形式为 αAβ → αγβ,其中 A 是一个非终结符,γ 是一个非空字符串。
- 保证字符串的长度在推导过程中不会缩短,适合描述上下文相关的结构。
- 描述的是上下文相关语言。
-
2型文法(上下文无关文法):
- 产生式形式为 A → γ,其中 A 是非终结符,γ 是任意字符串。
- 不依赖上下文,广泛用于程序语言的语法分析。
- 描述的是上下文无关语言。
-
3型文法(正则文法):
- 产生式形式为 A → aB 或 A → a,其中 A, B 是非终结符,a 是终结符。
- 最简单的一类文法,用于描述正则语言,可以用有限状态自动机实现。
关系:
- 0型文法 > 1型文法 > 2型文法 > 3型文法
- 随着文法类型的增加,表示能力减弱,但解析的复杂度降低。3型文法是表示能力最弱的,但解析效率最高;0型文法表示能力最强,但解析难度最大。
六、编程语言
1.指针和引用的区别:
- 指针是一个变量,存储的是另一个变量的内存地址,可以为空指针,也可以重新指向其他变量。
- 引用是某个变量的别名,一旦引用被初始化后就不能改变,引用必须初始化,并且不能为空。
2.浅拷贝和深拷贝:
- 浅拷贝只复制对象的值和指向对象的引用向,不复制引用指的实际数据,改变引用指向的对象会影响到所有的拷贝。
- 深拷贝不仅复制对象的值,还会复制引用指向的实际数据,生成完全独立的对象实例,修改其中一个对象不会影响另一个。
3.程序的编译执行过程:
- 编译的过程包括预处理(处理宏定义和头文件)、编译(将源代码转换为汇编代码)、汇编(将汇编代码转换为机器代码)和链接(将目标文件和库文件链接生成可执行文件)。
- 执行时,操作系统加载可执行文件,分配内存,然后由CPU执行指令。
4.C++中的符号重载:
C++允许重载运算符,使得可以用自定义的方式处理运算符。例如,可以重载+
运算符,使其能够对两个对象执行加法操作。
5.C++多态实现方式:
C++中的多态性主要通过虚函数来实现,虚函数允许子类重写父类的函数。运行时根据对象的实际类型调用相应的函数版本。
6.Java、C++和C的区别:
- C是一种面向过程的语言,没有对象和类的概念。
- C++是C的扩展,增加了面向对象的特性。
- Java是纯面向对象的语言,具有自动垃圾回收机制,代码更为安全和可移植。
7.Java垃圾回收算法:
Java使用垃圾回收器自动回收不再使用的对象。常用算法包括标记-清除、标记-压缩和分代收集等。
8.JVM内存管理:
JVM将内存分为堆区、栈区、方法区、程序计数器和本地方法栈。堆区用于对象的存储,栈区用于方法调用和局部变量存储,方法区存放类的信息和常量。
9.全局变量的优缺点:
- 优点:全局变量可以在多个函数间共享数据,易于实现某些全局的功能。
- 缺点:容易造成命名冲突,增加代码的耦合度,难以维护,可能导致难以发现的bug。
10.C++异常处理机制:
C++使用try-catch
块来捕获和处理异常。try
块中放置可能会产生异常的代码,catch
块中处理异常。还可以使用throw
语句抛出异常。
11.C++中的const关键字:
const
用于定义常量或保证变量在初始化后不可修改。可以修饰变量、指针、函数参数和成员函数。
12.C++中int和枚举的区别:
int
是一种基本数据类型,用于表示整数。- 枚举(
enum
)用于定义一组命名常量,枚举的本质也是整数,但更具语义化。
13.C++中指针类型:
C++中有多种指针类型,如普通指针、空指针、悬空指针、智能指针等。每种指针在使用时要注意各自的特点和风险。
14.数组指针和指针数组:
- 数组指针:指向数组的指针,可以遍历整个数组。
- 指针数组:数组中每个元素都是指针,可以用来存储多个地址。
15.C中输入输出字符串方法:
常用的输入方法有scanf
和gets
,输出方法有printf
和puts
。注意gets
不安全,容易造成缓冲区溢出问题。
七、计算机组成原理
1M=1e6, 1G=1e9
1.计算机的基础指标
2.原码、反码、补码相关
short是2Byte。
3.IEEE754 单精度浮点数
4.地址空间划分
5.溢出标志(OF)和借位标志(CF)
6.指令寻址方式
7.计算机系统中操作元件与状态元件的区别
8.流水线阻塞相关问题
9.存储器访问时间
10.硬件和异常/中断关系
11.I/O控制方式
12.cache命中
CPU访问内存,以下哪种不可能发生?
CD选项为:
C. TLB(快表)命中,但发生缺页。
D. cache没有命中,但没有发生缺页。
14.cache容量计算
主存地址线32位,按字节编址。cache块大小64Byte,cache的数据容量是64Kbyte,cache采用写回,cache和主存采取直接映射,问cache容量多大?
Core: cache 容量 是指 cache 存储的总容量,包括 数据部分 和 必要的控制信息(如标记位等)
分析:
15.可能异常的指令
指令取到指令寄存器开始后,
POP X2;
DIV X2,X1;
AND X1,X2;
MOV X1 0(X2),这四种哪一个不会发生异常?
16.分页虚拟存储
注意,这个虚页号是十进制。。。。。有点坑
17.组相连映射
18.ISA