java(2025/7/10)
1.设计模式
原型模式(Prototype Pattern)
核心思想:
用 “克隆”(复制)已有对象的方式创建新对象,而非重新初始化。这样系统无需关心产品具体 “怎么创建、怎么构成”,只要拿到原型(模板对象),就能快速生成新实例。
// 实现 Cloneable 接口,标记可克隆
class Product implements Cloneable {private String name;private String color;public Product(String name, String color) {this.name = name;this.color = color;}// 重写克隆方法@Overrideprotected Product clone() throws CloneNotSupportedException {return (Product) super.clone(); }
}// 使用原型模式
public class Client {public static void main(String[] args) throws CloneNotSupportedException {Product prototype = new Product("手机", "黑色"); // 原型对象Product newProduct = prototype.clone(); // 克隆生成新对象// 新对象与原型独立,修改新对象不影响原型newProduct.color = "白色"; }
}
适用场景:
- 当对象创建成本高(比如初始化需复杂计算、依赖外部资源),克隆比新建更高效时。
- 系统要独立于产品的创建逻辑(比如产品结构复杂,但克隆能屏蔽创建细节)。
- 需要动态生成不同类型对象,但这些对象有共同原型(比如游戏里不同外观的 “角色皮肤”,基于同一原型克隆修改)。
B. 单例模式(Singleton Pattern)
核心:保证一个类仅有一个实例,并提供全局访问点(比如系统的 “配置管理器”“日志工具”,只需要一个实例)。
与题目矛盾点:题目需求是 “创建产品”(可能需要多个实例),而单例模式限制 “只能有一个实例”,完全不匹配 “独立于产品创建、生成多个实例” 的场景。
C. 装饰器模式(Decorator Pattern)
核心:动态给对象添加额外职责(比如给 “咖啡” 对象动态加 “牛奶”“糖” 装饰),不涉及 “产品创建的独立性”,而是关注功能增强。
与题目无关点:题目聚焦 “怎么创建产品”,装饰器模式聚焦 “怎么扩展已有对象功能”,场景不匹配。
D. 代理模式(Proxy Pattern)
核心:为其他对象提供 “代理”,控制对原对象的访问(比如远程代理、权限代理)。重点在 “访问控制”,而非 “产品创建”。
与题目无关点:题目需求是 “独立创建产品”,代理模式不解决 “创建逻辑独立” 问题,而是解决 “访问原对象的中间层” 问题。
2.传输协议数据单元
传输协议数据单元(TPDU)由 TPDU 头部和数据部分组成,TTL 是网络层数据包的生存时间字段,帧头部、帧尾部是数据链路层帧的组成部分
3.有向图
对于无自环的有向图,设顶点数为n,要使得边数最多,可让每个顶点都向其他n−1个顶点有一条有向边,此时边数最多为n(n−1)(因为是有向图,从顶点i到顶点j和从顶点j到顶点i算两条不同的边 )。
我们需要找到最小的n,使得n(n−1)⩾2023。
4.弗洛伊德算法
求解最短路径的弗洛伊德算法的时间复杂度为
O(n^3)
加权有向图中寻找所有顶点对之间最短路径的经典算法
5.搜索树
AVL 树是一种自平衡二叉搜索树,由苏联数学家 Adelson-Velsky 和 Landis 在 1962 年提出,名字便取自这两位数学家。
- 核心特点:在满足二叉搜索树特性(左子树节点值小于根节点值,右子树节点值大于根节点值)的基础上,通过旋转操作来保持平衡,使得树中任意节点的左子树和右子树的高度差的绝对值不超过 1 。
- 应用场景:在需要频繁进行插入和删除操作,同时对查找效率有较高要求的场景中广泛应用,比如数据库索引、编译器符号表管理等。
- 优势:相比于普通二叉搜索树,AVL 树保证了树的高度始终保持在对数级别(近似于 O(logn) ,n为节点数),这使得在树中进行查找、插入和删除操作的时间复杂度稳定在 O(logn) ,避免了普通二叉搜索树在极端情况下退化成链表导致操作效率急剧下降(时间复杂度变为 O(n) )的问题。
- 劣势 :由于每次插入或删除节点后都可能需要进行旋转操作来维持平衡,这会带来一定的额外计算开销,在数据相对静态(插入、删除操作较少)的场景下,可能不如普通二叉搜索树高效。
二叉搜索树(Binary Search Tree,BST)
是一种有序二叉树,遵循特定的节点值大小规则。
- 核心特点:对于树中任意节点,其左子树所有节点值小于该节点值,右子树所有节点值大于该节点值 。基于此规则,可高效实现数据查找、插入、删除。
- 应用场景:适合数据动态插入、删除且需快速查询的场景,如简单的键值对存储(如小型字典系统) 。
- 优势:理想情况下(树结构平衡),查找、插入、删除操作时间复杂度为 O(logn)(n 为节点数 ),能高效处理数据检索与更新。
- 劣势:若数据插入顺序不合理(如有序插入),树会退化成链表,此时操作时间复杂度变为 O(n) ,效率大幅降低 。
B 树(Balance Tree)
是一种多路平衡查找树,专为磁盘等外存储设备设计,优化大规模数据的读写效率。
- 核心特点:每个节点可存储多个关键字和子节点指针,所有叶子节点在同一层,保证树的高度平衡;通过 “多路” 特性,减少磁盘 I/O 次数(一次磁盘读写可获取多个节点数据 )。
- 应用场景:广泛用于数据库索引(如 MySQL 的 InnoDB 存储引擎)、文件系统,处理大规模磁盘存储数据的高效查询、插入、删除 。
- 优势:利用多路特性和平衡结构,大幅减少磁盘 I/O 操作,提升大数据量下的读写效率,保证操作时间复杂度稳定在 O(logmn)(m 为节点子节点数,n 为总节点数 ) 。
- 劣势:节点结构复杂(需维护多个关键字、指针),内存占用相对高;数据量较小时,优势不明显,反而因结构复杂可能降低效率 。
红黑树(Red - Black Tree)
是一种自平衡二叉搜索树,通过颜色标记和旋转操作维持平衡,是二叉搜索树的优化变种。
- 核心特点:节点标记红色或黑色,遵循 5 条颜色规则(如根节点黑色、相邻节点颜色限制等 ),结合左旋、右旋、变色操作,保持树的 “近似平衡”(最长路径不超过最短路径 2 倍 )。
- 应用场景:常用于需要高效插入、删除,且对查找性能有要求的场景,如 Java 的
TreeMap
、Linux 内核的进程调度、C++ STL 的map
/set
等 。 - 优势:相比 AVL 树,插入、删除时旋转操作更少(无需严格维持高度差为 1 ),整体效率更高;保证操作时间复杂度为 O(logn) ,平衡与操作开销达到较好平衡 。
- 劣势:规则和实现相对复杂,理解与编码难度高;相比 AVL 树,平衡程度稍弱,极端情况下树高度可能更高(但不超过 2 倍),理论查找效率略低 。
简单总结:
- 二叉搜索树是基础 “有序” 结构,易退化;
- AVL 树严格平衡,适合读多写少;
- 红黑树 “近似平衡”,读写均衡;
- B 树专为磁盘存储设计,优化大数据量 I/O 。
生产者消费问题
生产者 - 消费者问题是进程同步与互斥中的经典问题,描述如下:
基本场景
有一组生产者进程和一组消费者进程,它们共享一个有限大小的缓冲区。生产者进程负责生产数据,并将数据放入缓冲区;消费者进程负责从缓冲区中取出数据进行消费 。
核心问题
- 同步问题: 生产者不能在缓冲区满时继续放入数据,否则会导致数据覆盖;消费者不能在缓冲区空时取数据,否则会导致取到无效数据 。这就需要生产者和消费者之间协调工作,比如生产者等待缓冲区有空位,消费者等待缓冲区有数据。
- 互斥问题: 缓冲区是临界资源,同一时刻只能有一个进程(生产者或消费者)对其进行操作(写入或读取 ),否则会导致数据混乱,所以需要互斥机制来保证对缓冲区的正确访问 。
解决方法
通常借助信号量机制(如 P、V 操作)来解决。比如使用empty
信号量记录缓冲区的空闲位置数量,full
信号量记录缓冲区的数据数量,mutex
信号量实现对缓冲区的互斥访问。生产者进程在生产数据后,通过P(empty)
检查是否有空缓冲区,然后使用P(mutex)
获取对缓冲区的访问权,放入数据后释放访问权(V(mutex)
),并增加full
信号量的值(V(full)
);消费者进程则先通过P(full)
检查是否有数据,再用P(mutex)
获取访问权,取出数据后释放访问权(V(mutex)
),并增加empty
信号量的值(V(empty)
) 。
十大排序算法时间复杂度
1.0 十大经典排序算法 | 菜鸟教程