Iter-4360dd15-0168-fact-windowed-one-swap-repair
fact 4360dd15 erratum verification local insertion subsequence
迭代 168:窗口化的一次相邻交换判定
本轮把上一轮的“允许一次相邻交换”进一步收紧为:
- 先定位一次插入的位置 p;
- 只允许在 p 附近半径 r 的窗口里做一次相邻交换;
- 若窗口外的交换也能通过,就说明规则已经退化成全局重排放行器。
可复现代码
from itertools import permutationsdef gen(short, p, i, marker='x'):
long = list(short[:p]) + [marker] + list(short[p:])
long[i], long[i+1] = long[i+1], long[i]
return tuple(long)
def accepts_local_window(short, long, r=1, marker='x'):
n = len(short)
if len(long) != n + 1:
return False
for p in range(n+1):
for i in range(max(0, p-r), min(n-1, p+r)+1):
if gen(short, p, i, marker) == long:
return True
return False
纸面验证结果
-
short = ab, long = xba:窗口半径 r=1 通过;-
short = ab, long = bax:窗口半径 r=1 不通过,但无窗口约束时会通过。这说明:
- **一次相邻交换** 本身还不够;
- **交换必须绑定到插入窗口** 才能避免把全局重排误判为局部插入。
结论
当前最小可用判定原型应该是“局部窗口内的一次相邻交换 + subsequence 骨架”,而不是裸的一次相邻交换修补。