最长公共前缀:双重边界内逐位比较,第一次不同就停止
🎯 先猜一猜
缓存是 [1,2,3],新 prompt 是 [1,9,3]。
最长公共前缀长度是多少?
先补的知识
- cached_tokens 和 prompt_tokens 都是 Python token_id 序列,本题使用列表,不涉及张量 shape、dtype 或 device。
- 公共前缀必须从索引 0 连续开始;中间一旦不同,后面即使再次相等也不能计入。
- 循环条件要同时保护两个序列边界,避免一个短序列已经结束却继续索引。
- match_len 同时表示当前比较索引和已经连续匹配的 token 数。
图解原理
LCP 不是统计两列里共有多少 token,而是数“开头连续相同了多久”。因此算法只需要一个从 0 开始的指针:两边都没结束且当前位置相等就加一,遇到第一次不同立刻停。
[1,2,3] 与 [1,2,4]
连续命中长度为 2,第三项不同后立即停止。
[7,8] 与 [7,8,9,10]
短序列整体是长序列前缀,返回 2,不会越界。
语法热身:比较两个路径开头连续相同的站点
saved_route = ['A', 'B', 'C']
new_route = ['A', 'B', 'D', 'E']
same = 0
while same < len(saved_route) and same < len(new_route):
if saved_route[same] == new_route[same]:
same += 1
else:
break
print(same) # 2从语法例子迁移到 TODO 1
saved_route:对应 cached_tokensnew_route:对应 prompt_tokenssame:对应 match_len,既是索引也是命中长度两个 len 条件:分别防止缓存路径或新 prompt 越界break:对应第一次 token 不同后立即停止
巩固一下
while 条件为什么要同时检查两个序列长度?
学完这一段,试着做
用一个小动作确认自己理解了;最后再进入官方题目。