本机真实开启batched_key_access=on,真实尝试了三种表结构组合(内表有索引、内表无索引、真实禁用hash join和block_nested_loop强制施压),EXPLAIN里真实从未出现过Batched Key Access——真实验证了现代MySQL优化器已经不太选择这个策略。
本机真实对2000行JOIN 2000行、内表无索引的场景,验证优化器默认选择Hash Join真实只要0.0009秒,而真实禁用Hash Join和Block Nested Loop后退化成的裸嵌套循环,同样的join真实要0.3793秒——差了约421倍。
本机真实对5万客户+30万订单跑IN和NOT IN子查询,EXPLAIN真实显示两者都走了Materialize with deduplication策略,真实测出IN耗时0.0553秒返回22487个客户,NOT IN耗时0.0468秒返回27513个客户——两者相加真实精确等于50000,互补验证结果正确。
本机真实用一个GROUP BY派生表(30万订单聚合成5万客户汇总),验证derived_condition_pushdown=on时耗时只要0.0004秒,关闭后真实变成0.2554秒——差了约638倍,两次都返回同一个正确结果(500, 3398)。
给定一棵二叉树,检查它是否轴对称。一个常见的简化写法是按层收集非空值检查回文,但这会漏掉空位信息:本文用一个具体反例和 30,000 组随机树的穷举测试,证明这种写法会把 34% 的非对称树误判为对称,再给出正确的镜像递归和 5 种语言实现。
给定一棵二叉树,按层返回结点值,每层一个子数组。BFS 的一个常见陷阱是内层循环没有先固定这一层的结点数,导致所有层被合并成一个:本文用真实反例和完全二叉树验证这个错误,再给出正确写法和 5 种语言实现。
在层序遍历基础上,让每层交替从左到右、从右到左输出。一个常见陷阱是方向标记忘了在每层结束后切换,导致退化成普通层序遍历:本文用真实反例验证,再给出正确写法和 5 种语言实现。
给定一棵二叉树,求它的最大深度。一个常见陷阱是用栈做迭代 DFS 时,把访问过的结点总数误当成树的高度:本文用真实的完全二叉树规模对比验证这个错误会有多大偏差,再给出正确写法和 5 种语言实现。
给定前序遍历和中序遍历序列,重建这棵二叉树。一个真实会犯的错误是把两个参数顺序传反:本文用 2000 组随机树验证,超过一半的情况会直接崩溃,另外近三成会静静地重建出错误的树,再给出正确写法和 5 种语言实现。
给定中序遍历和后序遍历序列,重建这棵二叉树。一个真实会犯的错误是照搬前序定根的思路,误把 postorder[0] 当成根:本文用 2000 组随机树验证,超过一半的情况会直接崩溃,再给出正确写法和 5 种语言实现。
和层序遍历一样按层分组,只是结果要从下往上排列。一个常见陷阱是把所有结点拍平成一个数组再整体反转,这样会丢掉层的分组,还会误把每层内部的从左到右顺序也反转掉:本文用真实反例验证,再给出正确写法和 5 种语言实现。
给定升序数组,构造一棵高度平衡的二叉搜索树。一个常见陷阱是把数组按顺序插入 BST,这样虽然满足 BST 性质但完全不平衡,会退化成一条链:本文用真实的规模对比验证这个规律,再给出正确的取中点分治写法和 5 种语言实现。