知识点标签

算法面试题解析第 2 页

算法相关面试题解析,按真实面经题目沉淀核心机制、易错点和面试官追问。

170 道题 6 个岗位 16 个公司

算法相关面试题第 2 页

分词算法有哪些?

分词算法解决的是把连续文本切成有意义的词或子词单位。中文没有天然空格,因此分词既要处理词典匹配,也要处理歧义、未登录词、新词、专名、领域词和下游任务适配。常见算法包括基于词典的正向/逆向/双向最大匹配、DAG 加动态规划、HMM/CRF 序列标注、统计语言模型、深度学习序列标注,以及 BPE、WordPiece、SentencePiece 等子词切分方法。

同题还出现在 2 个公司岗位

CAN降低的是计算复杂度还是存储复杂度?

这里的 CAN 按推荐和 CTR 建模语境理解为 Co-Action Network。它的核心不是把线上推理的所有计算量都变少,而是把显式二阶或高阶交叉带来的参数量、存储量和稀疏组合记忆压力降下来。它通过让一个特征参与生成或选择作用于另一个特征的交互权重,用参数共享和动态交互替代海量离散交叉参数,因此主要回答应落在存储复杂度、参数复杂度和长尾稀疏性上,同时承认会引入一定运行时计算。

推荐系统的召回、排序和重排链路如何理解?

这道题考察候选人是否能从工程链路而不是单点模型理解推荐系统:召回负责从海量候选中高覆盖地捞出可能感兴趣的内容,排序负责用特征和模型估计用户行为价值,重排负责在最终曝光前加入多样性、新鲜度、去重、业务规则和体验约束,同时还要兼顾在线延迟、离线评估和 A/B 实验闭环。

同题还出现在 1 个公司岗位

StringBuffer的底层数据结构?

StringBuffer 的底层核心是一个可变的连续缓冲区,而不是每次修改都创建新的 String。常见实现中,真正负责存储、长度、容量和扩容的是 AbstractStringBuilder;早期实现可理解为 char[],JDK 9+ 常见实现为了紧凑字符串改为 byte[] 加 coder 标记,但对外仍表现为可变字符序列。StringBuffer 的特点是在这套可变缓冲区能力之上,用 synchronized 保护关键操作,因此适合多个线程共享同一个实例时使用;单线程场景通常优先 StringBuilder。

对哪些分类算法有研究?

这道题考察的不是背诵分类算法列表,而是候选人能否把分类问题的建模假设、算法家族、适用场景、优缺点、评估方法和工程选择讲清楚。高质量回答应围绕线性模型、树模型与集成方法、核方法、概率模型、神经分类器、文本/NLP分类器以及评估和选型逻辑展开,并能结合特征稀疏性、样本规模、类别不均衡、可解释性、线上延迟等因素说明取舍。

堆上的元素满了会发生什么?

JVM 堆满通常指堆内存中可用于对象分配的空间不足。对象分配失败后,虚拟机会先尝试触发 Young GC 或 Full GC 回收空间;如果回收后仍无法满足分配,或者老年代晋升失败、连续 GC 效率过低,就可能抛出 OutOfMemoryError。回答时要围绕对象分配、GC 尝试、晋升失败、OOM 类型、排查与预防展开,不要误讲成优先队列里的堆元素满了。

数组和链表有什么区别?

数组和链表都是线性表,但底层组织方式不同:数组用连续内存存放元素,链表用离散节点通过引用连接。这个差异决定了数组随机访问快、缓存友好,但插入删除和扩容成本可能高;链表插入删除在已定位节点时很快,但查找慢、缓存局部性差、额外指针开销大。工程上不能只背复杂度,要说明复杂度成立的前提,并结合 Java 的 ArrayList 和 LinkedList 对照。

同题还出现在 1 个公司岗位

红黑树和平衡二叉树的区别?

红黑树和平衡二叉树都是为了避免普通二叉搜索树退化成链表而设计的自平衡二叉搜索树,核心区别在于平衡标准和维护成本。面试中说的平衡二叉树通常特指 AVL 树:它要求每个节点左右子树高度差最多为 1,平衡非常严格,所以查询路径更短;红黑树用颜色规则约束黑色节点数量和红色节点相邻关系,允许一定程度的不完全平衡,因此插入、删除时旋转和调整更少,更适合频繁更新的工程场景。

说一下数据库底层数据结构B+数据,为什么用,与二叉平衡树区别 Redis怎么用的?

数据库索引常用 B+ 树,核心原因不是“查找复杂度看起来是 O(log n)”,而是它非常适合磁盘和页式存储:节点扇出高,树高低,单次查询需要的页访问次数少;叶子节点按键有序并通过链表连接,范围查询、排序扫描、分页扫描都很高效。二叉平衡树如 AVL、红黑树更适合内存中的动态查找结构,节点扇出低、树高大、局部性差,如果直接用于磁盘索引会产生大量随机 I/O。

MySQL 底层数据结构?

MySQL 底层数据结构在 InnoDB 中主要围绕“页、B+树索引、聚簇索引、二级索引、Buffer Pool、事务日志”展开。真正决定查询性能的不是某一个抽象结构,而是这些结构如何协同:数据按页组织,索引以 B+树维护有序访问路径,主键索引叶子节点保存完整行记录,二级索引叶子节点保存主键值,内存中的 Buffer Pool 缓存热点页,变更再通过 redo log、undo log 等机制保证事务与崩溃恢复。理解这些内容,才能解释为什么 MySQL 不直接使用普通二叉树、红黑树或单纯哈希表作为主要索引结构。

JVM中的【堆】是用什么数据结构来实现的?

JVM 中的堆不是二叉堆、最大堆、最小堆这种数据结构,而是 JVM 运行时用于存放对象实例和数组的一块共享内存区域。它的具体组织方式取决于垃圾收集器:可能按年轻代、老年代划分,也可能按 Region 管理;对象分配通常依赖 TLAB、指针碰撞、空闲列表等机制,而对象回收依赖可达性分析和 GC 元数据。

java中有哪些以队列、链表为底层实现的数据结构?

Java 里要区分“队列接口”和“链表底层”。Queue、Deque 是行为抽象,表示先进先出、双端队列或优先级访问;LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue 这类才是链式节点结构。ArrayDeque、ArrayBlockingQueue、PriorityQueue 虽然暴露队列接口,但底层分别是循环数组、有界数组和二叉堆数组,不是链表。LinkedHashMap 则是哈希表加双向链表,用链表维护插入顺序或访问顺序,但它本身不实现 Queue。

决策树做分类和回归时有什么区别?

决策树做分类和回归时有什么区别?这道腾讯牛客题的关键是围绕“决策树分类与回归”讲清概念、机制、取舍和边界。分类树面向离散类别,常用信息增益、信息增益率或 Gini 指数选择划分;回归树面向连续值,常用平方误差、方差下降或 MAE 类目标选择切分。两者树结构相似,但叶子输出、损失度量和评估指标不同。

推荐系统中如何解决冷启动问题?

推荐系统中如何解决冷启动问题?这道腾讯牛客题的关键是围绕“推荐系统冷启动”讲清概念、机制、取舍和边界。推荐系统冷启动要先区分用户冷启动、物品冷启动和系统冷启动。用户没有行为时依赖注册画像、地理位置、设备、兴趣选择和热门兜底;物品没有交互时依赖内容特征、类目、文本/图像 embedding 和小流量探索;系统冷启动则要先靠规则、运营种子数据和快速反馈闭环建立初始样本。

GBDT 中的梯度提升如何理解?

GBDT 中的梯度提升如何理解?这道腾讯牛客题的关键是围绕“GBDT 梯度提升机制”讲清概念、机制、取舍和边界。GBDT 的梯度提升可以理解为在函数空间做梯度下降:当前模型 F_{m-1} 已经给出预测后,下一棵 CART 回归树 h_m 去拟合损失函数对当前预测的负梯度,也就是伪残差,最后按 F_m=F_{m-1}+eta*h_m 逐轮加到模型里。

高维稀疏特征为什么不适合直接用神经网络训练?

高维稀疏特征为什么不适合直接用神经网络训练?这道腾讯牛客题的关键是围绕“高维稀疏特征直接训练神经网络的风险”讲清概念、机制、取舍和边界。高维稀疏特征如果直接 one-hot 输入神经网络,会带来参数巨大、有效梯度稀疏、长尾类别训练不足、过拟合和线上存储/延迟成本。工程上通常先做 embedding、特征哈希、频次截断、交叉特征或用适合稀疏输入的线性/树模型做基线。

最大连续子数组和如何求解?

最大连续子数组和如何求解?这道腾讯牛客题的关键是围绕“最大连续子数组和 Kadane 动态规划”讲清概念、机制、取舍和边界。最大连续子数组和常用 Kadane 算法。定义 current 表示以当前位置结尾的最大连续和,best 表示全局最大值;遍历每个数时,current = max(x, current + x),再更新 best = max(best, current)。

模型过拟合应该如何处理?

模型过拟合应该如何处理?这道腾讯牛客题的关键是围绕“模型过拟合治理”讲清概念、机制、取舍和边界。过拟合是模型在训练集表现好、验证或线上表现差,说明模型记住了训练噪声、泄漏或过细模式。处理要先看训练/验证曲线,再定位容量、数据、正则和评估泄漏。