We present a merge-free algorithm for multi-way co-ranking, the problem of computing cut indices $i_1,\dots,i_m$ that partition each of the $m$ sorted sequences such that all prefix segments together contain exactly $K$ elements. Our method extends two-list co-ranking to arbitrary $m$, maintaining per-sequence bounds that converge to a consistent global frontier without performing any multi-way merge or value-space search. Rather, we apply binary search to \emph{index-space}. The algorithm runs in $O(\log(\sum_t n_t)\,\log m)$ time and $O(m)$ space, independent of $K$. We prove correctness via an exchange argument and discuss applications to distributed fractional knapsack, parallel merge partitioning, and multi-stream joins.
Keywords: Co-ranking \sep partitioning \sep Merge-free algorithms \sep Index-space optimization \sep Selection and merging \sep Data structures
论文ID : 2510.22882标题 : Multi-Way Co-Ranking: Index-Space Partitioning of Sorted Sequences Without Merge作者 : Amit Joshi (Independent Researcher)分类 : cs.DS (Data Structures and Algorithms)发表时间 : 2025年10月27日 (arXiv预印本)论文链接 : https://arxiv.org/abs/2510.22882 本文提出了一种无合并的多路协同排名算法,用于计算切割索引i 1 , … , i m i_1,\dots,i_m i 1 , … , i m ,将m m m 个排序序列分割,使得所有前缀段总共包含恰好K K K 个元素。该方法将Siebert和Träff的双列表协同排名扩展到任意m m m 路,维护每个序列的边界并收敛到一致的全局前沿,无需执行多路合并或值空间搜索。算法在索引空间应用二分搜索,时间复杂度为O ( log ( ∑ t n t ) log m ) O(\log(\sum_t n_t)\log m) O ( log ( ∑ t n t ) log m ) ,空间复杂度为O ( m ) O(m) O ( m ) ,且独立于K K K 。通过交换论证证明了正确性,并讨论了在分布式分数背包、并行合并分区和多流连接中的应用。
多路协同排名问题定义如下:给定m m m 个按非递减顺序排序的序列L 1 , … , L m L_1, \ldots, L_m L 1 , … , L m (允许重复),每个序列长度为n t n_t n t ,以及全局目标排名K ∈ { 0 , … , N } K \in \{0, \ldots, N\} K ∈ { 0 , … , N } (其中N = ∑ t n t N = \sum_t n_t N = ∑ t n t ),需要找到切割索引i 1 , … , i m i_1, \ldots, i_m i 1 , … , i m 使得:
∑ t = 1 m i t = K 且 max t ℓ t ≤ min t r t \sum_{t=1}^m i_t = K \quad \text{且} \quad \max_t \ell_t \leq \min_t r_t ∑ t = 1 m i t = K 且 max t ℓ t ≤ min t r t
其中ℓ t \ell_t ℓ t 和r t r_t r t 分别表示左边界值和右边界值。
扩展经典算法 :现有的协同排名算法主要针对两个序列,缺乏高效的多路扩展避免合并开销 :传统方法需要先合并多个序列再进行选择,开销较大索引空间优势 :在索引空间而非值空间操作,避免了值域搜索的复杂性实际应用需求 :分布式计算、并行处理和数据库查询中都需要高效的多路分区算法Siebert-Träff方法 :仅支持两个序列的协同排名Frederickson-Johnson方法 :在值空间操作,需要全局计数操作基于分割器的方法 :需要预先合并或值域搜索,复杂度较高算法设计 :提出了首个无合并的多路协同排名算法,将经典的双路方法扩展到任意m m m 路理论分析 :证明了算法的正确性和O ( log ( ∑ t n t ) log m ) O(\log(\sum_t n_t)\log m) O ( log ( ∑ t n t ) log m ) 时间复杂度数据结构创新 :设计了索引堆(addressable heaps)来高效维护边界值应用拓展 :展示了算法在分布式优化、并行处理和数据库系统中的应用潜力输入 :
m m m 个排序序列L 1 , … , L m L_1, \ldots, L_m L 1 , … , L m ,长度分别为n 1 , … , n m n_1, \ldots, n_m n 1 , … , n m 目标排名K ∈ [ 0 , N ] K \in [0, N] K ∈ [ 0 , N ] ,其中N = ∑ t = 1 m n t N = \sum_{t=1}^m n_t N = ∑ t = 1 m n t 输出 :
切割索引向量( i 1 , … , i m ) (i_1, \ldots, i_m) ( i 1 , … , i m ) 满足协同排名条件 约束条件 :
∑ t = 1 m i t = K \sum_{t=1}^m i_t = K ∑ t = 1 m i t = K max t ℓ t ≤ min t r t \max_t \ell_t \leq \min_t r_t max t ℓ t ≤ min t r t (协同排名条件)算法维护两个索引堆:
H L H_L H L :最大堆,存储左边界值( ℓ t , t ) (\ell_t, t) ( ℓ t , t ) ,返回最大左边界的序列(捐赠者)H R H_R H R :最小堆,存储右边界值( r t , t ) (r_t, t) ( r t , t ) ,返回最小右边界的序列(接收者)每个堆支持O ( log m ) O(\log m) O ( log m ) 的update_key操作和O ( 1 ) O(1) O ( 1 ) 的peek操作。
为每个序列t t t 维护:
下界 :L b [ t ] ≤ i [ t ] Lb[t] \leq i[t] L b [ t ] ≤ i [ t ] 上界 :i [ t ] ≤ U b [ t ] i[t] \leq Ub[t] i [ t ] ≤ U b [ t ] 当前索引 :i [ t ] i[t] i [ t ] 算法采用捐赠者-接收者的贪心策略:
识别极值 :捐赠者p = arg max t ℓ t p = \arg\max_t \ell_t p = arg max t ℓ t (最大左边界) 接收者q = arg min t r t q = \arg\min_t r_t q = arg min t r t (最小右边界) 计算转移量 :donor_slack = ⌈(i[p] - Lb[p])/2⌉
receiver_slack = ⌈(Ub[q] - i[q])/2⌉
Δ = min{donor_slack, receiver_slack}
执行转移 :i [ p ] ← i [ p ] − Δ i[p] \leftarrow i[p] - \Delta i [ p ] ← i [ p ] − Δ i [ q ] ← i [ q ] + Δ i[q] \leftarrow i[q] + \Delta i [ q ] ← i [ q ] + Δ 更新边界:U b [ p ] ← i [ p ] Ub[p] \leftarrow i[p] U b [ p ] ← i [ p ] ,L b [ q ] ← i [ q ] Lb[q] \leftarrow i[q] L b [ q ] ← i [ q ] 更新堆 :刷新受影响序列的堆键值索引空间操作 :完全在索引空间工作,避免了值域搜索和合并操作几何收敛 :通过对半缩减可行域,保证了对数级别的收敛速度不平衡势函数 :定义Φ ( i ) = max t ℓ t − min t r t \Phi(i) = \max_t \ell_t - \min_t r_t Φ ( i ) = max t ℓ t − min t r t 作为收敛判据确定性复杂度 :算法复杂度独立于目标排名K K K 如果Φ ( i ) > 0 \Phi(i) > 0 Φ ( i ) > 0 ,设p = arg max t ℓ t p = \arg\max_t \ell_t p = arg max t ℓ t 和q = arg min t r t q = \arg\min_t r_t q = arg min t r t 。在所有保持∑ t i t = K \sum_t i_t = K ∑ t i t = K 的可行无穷小转移中,( p , q ) (p,q) ( p , q ) 对实现了Φ \Phi Φ 的最大非递增变化。
证明思路 :减少i p i_p i p 会降低ℓ p \ell_p ℓ p (左边界的局部最大值),增加i q i_q i q 会提高r q r_q r q (右边界的局部最小值)。由于ℓ p ≥ ℓ u \ell_p \geq \ell_u ℓ p ≥ ℓ u 且r q ≤ r v r_q \leq r_v r q ≤ r v 对所有u , v u,v u , v 成立,极值对( p , q ) (p,q) ( p , q ) 产生最陡的间隙max ℓ − min r \max\ell - \min r max ℓ − min r 减少。
任何减少Φ \Phi Φ 的可行转移序列都可以重新排序,使得所有极值( p , q ) (p,q) ( p , q ) 转移发生在任何非极值转移之前,且不会恶化任何中间步骤的Φ \Phi Φ 。
算法2以有效的协同排名向量( i 1 , … , i m ) (i_1, \ldots, i_m) ( i 1 , … , i m ) 终止,满足∑ t i t = K \sum_t i_t = K ∑ t i t = K 和max t ℓ t ≤ min t r t \max_t \ell_t \leq \min_t r_t max t ℓ t ≤ min t r t 。
每轮中,捐赠者或接收者的可行距离被对半缩减。每个序列的距离U b [ t ] − L b [ t ] Ub[t] - Lb[t] U b [ t ] − L b [ t ] 最多缩减O ( log n t ) O(\log n_t) O ( log n t ) 次。聚合所有m m m 个序列,总轮次数为:
T = O ( log ( ∑ t = 1 m n t ) ) T = O\left(\log\left(\sum_{t=1}^m n_t\right)\right) T = O ( log ( ∑ t = 1 m n t ) )
每轮执行常数次索引堆操作(O ( log m ) O(\log m) O ( log m ) 时间),总时间复杂度为:
O ( log ( ∑ t n t ) ⋅ log m ) O\left(\log\left(\sum_t n_t\right) \cdot \log m\right) O ( log ( ∑ t n t ) ⋅ log m )
算法只需存储m m m 个序列的索引和边界信息,空间复杂度为O ( m ) O(m) O ( m ) 。
def multi_way_corank(sequences, K):
m = len(sequences)
# 初始化边界和索引
Lb = [0] * m
Ub = [len(seq) for seq in sequences]
i = water_fill_initialization(K, Ub)
# 构建索引堆
HL = MaxHeap() # 左边界最大堆
HR = MinHeap() # 右边界最小堆
for t in range(m):
HL.insert(t, left_boundary(sequences[t], i[t]))
HR.insert(t, right_boundary(sequences[t], i[t]))
while True:
# 获取捐赠者和接收者
max_left, p = HL.peek()
min_right, q = HR.peek()
# 检查终止条件
if max_left <= min_right:
break
# 计算转移量
donor_slack = ceil((i[p] - Lb[p]) / 2)
receiver_slack = ceil((Ub[q] - i[q]) / 2)
delta = min(donor_slack, receiver_slack)
# 执行转移
i[p] -= delta
i[q] += delta
# 更新边界
Ub[p] = i[p]
Lb[q] = i[q]
# 更新堆
update_heaps(HL, HR, sequences, i, p, q)
return i
采用"水填充"策略初始化可行解:
def water_fill_initialization(K, capacities):
i = [0] * len(capacities)
need = K
for t in range(len(capacities)):
take = min(capacities[t], need)
i[t] = take
need -= take
if need == 0:
break
return i
在多源分数背包问题中,当物品已按密度排序分布在m m m 个分片中时,可以使用协同排名计算全局K K K 前缀分割,无需合并源数据。
为处理器分配不相交的前缀,无需执行预备合并。协同排名向量确定精确的交接点,处理器然后仅对其范围执行局部合并。
在数据库或流处理管道中,在全局排名处分区连接前沿是自然的需求,该方法产生与全局前缀一致的每流游标。
虽然论文主要关注理论分析,但作者提供了实现代码供验证。算法的实际性能可以通过以下方面评估:
时间复杂度 :O ( log ( ∑ t n t ) log m ) O(\log(\sum_t n_t) \log m) O ( log ( ∑ t n t ) log m ) 空间复杂度 :O ( m ) O(m) O ( m ) 独立性 :复杂度独立于目标排名K K K 相比合并方法 :避免了O ( N ) O(N) O ( N ) 的合并开销相比值空间方法 :避免了全局计数操作相比Frederickson-Johnson :在索引空间操作,更加高效Siebert和Träff的工作奠定了协同排名的基础,主要用于并行合并中的工作分区。本文将其从2路扩展到任意m m m 路。
Siebert和Wolf的精确分割器方法在值空间操作,搜索平衡分区的键阈值。相比之下,本文方法在索引空间操作,直接输出协同排名向量。
Frederickson-Johnson的经典工作研究结构化输入(如m m m 个排序列表的并集)上的选择和排名。其算法本质上是值空间过程,而本文提供索引空间原语。
成功将双路协同排名扩展到多路情况,保持了良好的理论性质 索引空间操作避免了值域搜索,提供了确定性的复杂度保证 算法简单易实现,具有良好的实用性 假设条件 :要求输入序列已经排序应用范围 :主要适用于需要精确分区的场景实验验证 :缺乏大规模实验验证性能表现动态序列 :扩展到支持动态更新的序列近似算法 :开发更快的近似版本并行化 :研究算法的并行化可能性实际应用 :在更多实际系统中验证效果理论贡献 :首次提供了多路协同排名的高效算法,填补了理论空白方法创新 :索引空间操作的思路新颖,避免了传统方法的局限分析严谨 :提供了完整的正确性证明和复杂度分析实用价值 :算法简洁,易于实现,有明确的应用场景实验缺失 :论文缺乏实验验证,无法评估实际性能比较有限 :没有与现有方法进行详细的性能比较应用深度 :对应用场景的讨论相对简单,缺乏深入分析学术价值 :为多路协同排名问题提供了理论基础实用潜力 :在分布式计算和并行处理领域有应用前景可复现性 :作者提供了实现代码,便于验证和扩展分布式系统中的数据分区 并行算法中的负载均衡 数据库系统中的查询优化 流处理系统中的多流合并 1 Greg N. Frederickson and Donald B. Johnson. Generalized selection and ranking. STOC 1980.
2 Christian Siebert. Perfectly load-balanced, stable, synchronization-free parallel merge. Parallel Processing Letters, 2014.
3 Christian Siebert. Simple in-place yet comparison-optimal mergesort, arXiv:2509.24540, 2025.
4 Christian Siebert and Felix Wolf. A scalable parallel sorting algorithm using exact splitting. RWTH Aachen University technical report, 2011.
总体评价 :这是一篇理论性较强的算法论文,成功解决了多路协同排名这一重要问题。虽然缺乏实验验证,但理论分析严谨,方法创新性强,为相关领域提供了有价值的理论工具。