Iter-4360dd15-0168-fact-windowed-one-swap-repair

fact 4360dd15 erratum verification local insertion subsequence

修改:20260424233033000

迭代 168:窗口化的一次相邻交换判定

本轮把上一轮的“允许一次相邻交换”进一步收紧为:

- 先定位一次插入的位置 p
- 只允许在 p 附近半径 r 的窗口里做一次相邻交换;
- 若窗口外的交换也能通过,就说明规则已经退化成全局重排放行器。

可复现代码


from itertools import permutations

def 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 骨架”,而不是裸的一次相邻交换修补。