You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

双拍卖匹配系统中数组快速匹配与出清价格高效计算咨询

双向拍卖出清价格高效计算方案

核心优化思路

你原有实现的时间复杂度为O(N*M),N为价格档位总数,M为订单总数量,当价格档位粒度极细时性能会大幅退化。我们可以通过同价订单聚合、前缀/后缀和计算、二分查找的组合方案,将整体时间复杂度降至O(M + logK)(K为存在有效订单的价格档位数量,远小于总价格档位数量),完全不需要遍历所有价格档位。

具体实现步骤

  • 聚合同价格档位的订单量:将同一价格的所有买单、卖单分别合并,得到每个价格对应的总买量、总卖量,避免重复计算
  • 计算累计供需数组:
    • 累计需求(后缀和):按价格从低到高排序,每个价格对应的值为所有报价≥该价格的买单总数量,该数组随价格上升单调递减
    • 累计供给(前缀和):按价格从低到高排序,每个价格对应的值为所有报价≤该价格的卖单总数量,该数组随价格上升单调递增
  • 二分查找出清价格:利用累计供需数组的单调性,直接二分查找第一个满足「累计需求 < 累计供给」的价格,即可得到出清价,对应出清量为该价格下两个累计值的较小值

优化后Python示例代码

import numpy as np

MAX_QTY = 100
MIN_QTY = 0
MIN_PX = 1
MAX_PX = 10001 # 模拟10000个细粒度价格档位
TICK_SIZE = 1

price_grid = np.arange(MIN_PX, MAX_PX, TICK_SIZE)

def gen_orders(num, price_grid):
    qty = np.random.randint(MIN_QTY, MAX_QTY, num)
    px = np.random.choice(price_grid, num)
    return np.array((px, qty)).T

buy = gen_orders(100, price_grid)
sell = gen_orders(100, price_grid)

# 1. 按价格聚合买单、卖单
buy_agg = np.zeros(MAX_PX, dtype=np.int64)
for px, qty in buy:
    buy_agg[px] += qty
sell_agg = np.zeros(MAX_PX, dtype=np.int64)
for px, qty in sell:
    sell_agg[px] += qty

# 2. 计算累计需求(后缀和)、累计供给(前缀和)
cum_demand = np.cumsum(buy_agg[::-1])[::-1]
cum_supply = np.cumsum(sell_agg)

# 3. 二分查找出清价,10000个档位仅需最多14次迭代
low, high = MIN_PX, MAX_PX - 1
cleared_px = MAX_PX - 1
while low <= high:
    mid = (low + high) // 2
    if cum_demand[mid] < cum_supply[mid]:
        cleared_px = mid
        high = mid - 1
    else:
        low = mid + 1

cleared_qty = min(cum_demand[cleared_px], cum_supply[cleared_px])

额外优化提示

如果价格档位总数超过10万级,还可以仅收集存在有效订单的价格档位,排序后再计算前缀/后缀和、做二分查找,不需要初始化全量价格数组,进一步降低内存开销和计算量。

低级别语言迁移说明

迁移到C/C++/Rust等语言时,可直接用栈/堆数组存储各价格档位的买卖总量,前缀和、后缀和遍历数组即可完成,二分逻辑和上述代码完全一致,不需要依赖任何第三方库,执行效率会更高。

内容的提问来源于stack exchange,提问作者apocalypsis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 07:24:04