排名失配对数:期望榜单与实测榜单的两两逆序对计数
Rank-Disagreement Count: Pairwise Inversions Between Expected and Realized Strategy Rankings
开始编码实现 solution(expected: list[int], realized: list[int]) -> int。给定 N 只策略的两份等长排名——expected 是先验排序、realized 是观察窗口结束后的实测排序——返回两两排名失配的对数:expected 与 realized 中相对顺序不同的无序对 {a, b} 的总数。两个列表都是 [0, N) 的排列、无并列名次;排名 0 表示"名次最高"。
例
solution([0, 1, 2, 3], [3, 2, 1, 0]) 返回 6。4 * 3 / 2 = 6 个无序对的相对顺序全部翻转了——两个排名互为逆序,逆序对数取到上界 N*(N-1)/2。反过来 solution([0, 1, 2, 3], [0, 1, 2, 3]) 返回 0:两个排名在每一对上都一致。临近排序、只有一处交换的 solution([0, 1, 2, 3], [1, 0, 2, 3]) 返回 1——仅有 {0, 1} 这一对发生了翻转。
预期解法是"排列的排列"归约 + O(N log N) 逆序对计数。先一次扫描得到 pos_r[s] = realized.index(s),再构造复合排列 p[i] = pos_r[expected[i]];答案就是 p 的逆序对数。O(N^2) 的双层循环答案相同但在 N 上界附近会超时。若任一输入不是 [0, N) 的合法排列(重复、越界、非整数)或两列表长度不一致,抛 ValueError 而不是返回部分结果。
实现细节由 stubs/stub.py 提供。
实践背景
这是研究台收盘后复盘里反复出现的诊断量:组长在窗口开盘前对一组策略做了先验排序(比如按事前 Sharpe 估计),窗口结束、实测 PnL 出炉后又得到一份新的同样策略的实测排序。"排名失配对数"——也就是有多少两两顺序翻转了——是衡量"实测表现是否打破了原本假设序"的最干净的标量摘要之一;它在无平局的排列上与 Kendall tau 满足 (1 - tau) * N * (N - 1) / 4 的精确换算,所以又顺带是一个非参稳定性指标。同一个计数值还驱动着排行榜波动监控、因子轮动告警、路由策略 A/B 漂移检查;当 N 上到几万只候选策略或路由订单时,O(N log N) 的实现是日常看板能在秒级返回的关键。
约束条件
- 0 <= N <= 5000,N 为 `expected` 与 `realized` 的公共长度
- `expected` 与 `realized` 都是 `[0, N)` 的排列;排名 0 为最高名次
- 若任一列表存在重复、越界、非整数或两列表长度不一致,抛 `ValueError`(合法性校验是契约一部分;公开测试聚焦于正常路径的计数正确性,异常分支在集成阶段抽样校验)
- 输出为 `[0, N*(N-1)/2]` 范围内的非负整数;使用精确比对
- N == 0 返回 0;N == 1 返回 0;N == 2 返回 0 或 1
样例
Case 1 · statement-example: full reverse N=4
输入: [[0,1,2,3],[3,2,1,0]]
期望: 6
两份排名互为逆序,4*3/2=6 个无序对全部翻转,逆序对数取上界 6。
Case 2 · statement-example: identical N=4
输入: [[0,1,2,3],[0,1,2,3]]
期望: 0
两份排名完全相同,没有任何对发生翻转,返回 0。
Case 3 · statement-example: single swap of top two
输入: [[0,1,2,3],[1,0,2,3]]
期望: 1
只有 {0,1} 这一对在 expected 中 0 在前、在 realized 中 1 在前,仅 1 个逆序对。
最近提交
还没有提交记录。
编码区
实现 solution(...)。本地运行当前支持 Python 可见样例;服务端提交会运行可见样例和隐藏测试。
默认展示公开样例。点击「运行样例」后会在这里显示实际输出;点击「提交评测」会进入隐藏测试。
Case 1 · statement-example: full reverse N=4
输入: [[0,1,2,3],[3,2,1,0]]
期望: 6
两份排名互为逆序,4*3/2=6 个无序对全部翻转,逆序对数取上界 6。
Case 2 · statement-example: identical N=4
输入: [[0,1,2,3],[0,1,2,3]]
期望: 0
两份排名完全相同,没有任何对发生翻转,返回 0。
Case 3 · statement-example: single swap of top two
输入: [[0,1,2,3],[1,0,2,3]]
期望: 1
只有 {0,1} 这一对在 expected 中 0 在前、在 realized 中 1 在前,仅 1 个逆序对。