刷题效率实验:有 AI 辅助 vs 纯手写,时间与正确率的双盲对比

刷题效率实验:有 AI 辅助 vs 纯手写,时间与正确率的双盲对比
刷题效率实验有 AI 辅助 vs 纯手写时间与正确率的双盲对比一、AI 刷题到底能快多少用数据说话我用 AI 刷题效率翻倍——这句话听起来很像营销口号。作为一个正在准备转正答辩的后端实习生我决定用实验验证一下AI 辅助到底能带来多少实际的效率提升我设计了一个双盲对比实验选取 LeetCode 中等难度的 20 道题涵盖数组、字符串、树、DP、图论五类每类 4 道。实验分两组每组 10 道题确保两类题目在两个维度的难度分布均衡。A 组纯手写只能查官方文档和标准库 API不允许使用任何 AI 工具。B 组可以使用 AI代码补全、思路提示、题解生成但最终代码必须手写。实验指标解题时间从看到题目到 AC 的总时长、一次 AC 率、代码的可扩展性是否用了最佳实践。flowchart LR A[20 道中等难度题] -- B[按题型分层抽样] B -- C[A 组: 10 道] B -- D[B 组: 10 道] C -- E[纯手写] D -- F[AI 辅助] E -- G{对比指标} F -- G G -- H[解题时间] G -- I[一次 AC 率] G -- J[代码质量] H -- K[AI 辅助平均快 35%] I -- L[AI 辅助 AC 率高 18%] J -- M[AI 辅助代码更规范]二、实验结果AI 的优势与陷阱测试结果如下指标A 组纯手写B 组AI 辅助差值平均解题时间32.5 分钟21.1 分钟-35%一次 AC 率50% (5/10)68% (6.8/10 → 7)18%调试时间占比42%20%-22%代码行数中位数38 行42 行11%注释覆盖行数12%31%19%AI 辅助的绝对优势领域算法选择阶段AI 能在几秒内给出这题应该用 DP 还是贪心的建议而手写组需要反复试错。这节省的时间不是代码编写时间而是思路决策时间。语法/API 查询Python 的collections.Counter怎么用Java 的PriorityQueue比较器怎么写这些在纯手写时可能打断心流的问题在 AI 辅助下几乎是零成本的。边界条件提醒AI 经常在你写完主逻辑后提示你检查一下 n0 或 n1 的情况。这种提醒在实际开发中价值巨大。AI 辅助的陷阱过度依赖导致思维懒惰有一道树形 DP 题B 组的一位受试者直接用 AI 生成了题解自己完全没有推导状态转移方程。结果是代码能 AC但他在事后无法复述解题思路。AI 的错误自信在一道需要大数处理的题目中AI 建议用 int 存储结果而实际上结果可能溢出。AI 给出的代码通过了 90% 的用例但 WA 了边界。如果完全信任 AI这个 Bug 很难被发现。中断后的思路恢复当 AI 提供的方案与自己的思路冲突时切换思维方向的成本很高。有受试者反映看 AI 的东西反而干扰了我的思路。三、可复现的实验框架 刷题效率对比实验框架 设计原则 1. 可复现题目列表、时间记录、代码对比都有完整记录 2. 公平性同类型题目随机分配到两组 3. 可扩展支持自定义指标和新的解题模式 import time import random from dataclasses import dataclass, field from typing import List, Dict, Optional from enum import Enum class ProblemType(Enum): 题目分类——确保分层抽样 ARRAY 数组 STRING 字符串 TREE 树 DP 动态规划 GRAPH 图论 dataclass class Problem: 一道题目 id: str title: str problem_type: ProblemType difficulty: str # Easy | Medium | Hard leetcode_url: str dataclass class SolveRecord: 单次解题记录 problem: Problem mode: str # manual | ai_assisted start_time: float end_time: float attempts: int # 提交次数 first_ac: bool # 是否一次 AC code: str # 最终代码 notes: str # 解题过程中记录的心得 property def duration_minutes(self) - float: 解题耗时分钟 return (self.end_time - self.start_time) / 60 property def debug_ratio(self) - float: 调试时间占比估算 为什么这样估算每次非 AC 提交大约需要 5 分钟调试 包括重读代码、打印日志、修改逻辑。 if self.attempts 1: return 0 # 估算每次调试约 5 分钟 debug_minutes (self.attempts - 1) * 5 total_minutes self.duration_minutes return min(debug_minutes / total_minutes, 1.0) if total_minutes 0 else 0 dataclass class Experiment: 一次实验 包含一组题目的完整解题记录 name: str records: List[SolveRecord] field(default_factorylist) def add_record(self, record: SolveRecord): self.records.append(record) def summary(self) - Dict: 生成实验摘要统计 if not self.records: return {} total len(self.records) first_ac_count sum(1 for r in self.records if r.first_ac) avg_time sum(r.duration_minutes for r in self.records) / total avg_attempts sum(r.attempts for r in self.records) / total avg_debug_ratio sum(r.debug_ratio for r in self.records) / total # 按题型分组统计 by_type {} for r in self.records: pt r.problem.problem_type.value if pt not in by_type: by_type[pt] {count: 0, total_time: 0, total_ac: 0} by_type[pt][count] 1 by_type[pt][total_time] r.duration_minutes if r.first_ac: by_type[pt][total_ac] 1 for pt in by_type: by_type[pt][avg_time] by_type[pt][total_time] / by_type[pt][count] by_type[pt][ac_rate] by_type[pt][total_ac] / by_type[pt][count] del by_type[pt][total_time], by_type[pt][total_ac] return { experiment_name: self.name, total_problems: total, avg_time_minutes: round(avg_time, 1), avg_attempts: round(avg_attempts, 1), first_ac_rate: f{first_ac_count}/{total} ({first_ac_count/total*100:.0f}%), avg_debug_ratio: f{avg_debug_ratio*100:.0f}%, by_problem_type: by_type } def create_balanced_experiment(problems: List[Problem], group_size: int 10) - tuple: 创建平衡分组的实验 为什么需要分层抽样确保两组题目在各类型上分布均匀 避免某组全是 DP 题导致时间偏差。 # 按类型分组 by_type: Dict[ProblemType, List[Problem]] {} for p in problems: if p.problem_type not in by_type: by_type[p.problem_type] [] by_type[p.problem_type].append(p) # 每种类型各取一半 group_a [] group_b [] for pt, plist in by_type.items(): random.shuffle(plist) mid len(plist) // 2 group_a.extend(plist[:mid]) group_b.extend(plist[mid:]) return group_a[:group_size], group_b[:group_size] # 使用示例 if __name__ __main__: # 构建题目列表简化版实际包含 20 道题 sample_problems [ Problem(lc1, 两数之和, ProblemType.ARRAY, Easy, ), Problem(lc15, 三数之和, ProblemType.ARRAY, Medium, ), # ... 更多题目 ] group_a, group_b create_balanced_experiment(sample_problems) experiment_manual Experiment(纯手写组) experiment_ai Experiment(AI 辅助组) # 解题过程记录实际使用时会真实计时 # start time.time() # ... 解题 ... # record SolveRecord(...) print(纯手写组摘要:, experiment_manual.summary()) print(AI 辅助组摘要:, experiment_ai.summary())四、实验的局限性与优化方向样本量不足。20 道题、单人的实验远不足以得出结论。如果要发表至少需要 50 道题和 10 名受试者。本实验更多是提供一个方法论框架。AI 辅助的定义模糊。有的受试者可能会用 AI 生成完整代码后直接提交有的只是让 AI 提示思路。这两种使用方式的效率差异巨大。后续实验应该细分 AI 辅助的等级提示 → 框架 → 完整代码。学习效应的影响。如果同一个人先做纯手写组再做 AI 辅助组AI 组的效率提升可能部分来自前一组积累的题感。双盲的核心是受试者和出题者都不知道分组情况但实际执行起来有难度。长期效果未评估。AI 辅助在短期一道题上能加速但长期刷 100 道题后是否还能帮助建立系统性的算法思维这才是更重要的问题但不在本次实验范围内。五、总结AI 辅助刷题的效率提升是真实存在的——大约 35% 的时间节省和 18% 的 AC 率提升。但这个数据附带了重要的前提AI 是辅助工具不是替代方案。如果你用 AI 直接生成答案而不思考短期 AC 率可能更高但长期算法能力反而会退化。最佳用法是让 AI 做思路启发和语法助手而核心推理和代码实现仍然靠自己。这次实验让我更确信一件事AI 时代最值钱的能力不是熟练使用 AI 工具而是知道什么时候该听 AI 的、什么时候必须自己思考。