必要なのは、コモディティごとに 2 つの優先キューです。1 つはアクティブな買い入札用 (最大価格で優先)、もう 1 つはアクティブな売り入札 (最小価格で優先) に加えて、入札作成/有効期限イベント (優先価格で優先) 用の全体的なキューです。時間)。(因果関係/オンライン シーケンスではなく、前述のように入札がバッチ ファイルにある場合は、作成/有効期限イベントを並べ替えるだけで済みますが、購入キューと販売キューが必要です)。
プライオリティ キューを使用することが重要です。その後はすべて配管です。
foreach bid creation/expiry event, in chronological order:
if the event is an expiry:
delete the bid from the appropriate queue
else, the event is a creation:
add the bid to the appropriate queue
repeat until no further transaction can be performed:
find max-active-buy and min-active-sell bids for the given commodity
if they match:
execute (and record) the transaction
update partially fulfilled bids, and remove completely fulfilled ones
バッチ操作として実行する場合は、個々の商品を整理して、それぞれを個別に実行することで、物事を少し単純化できます。ただし、市場がなんらかの方法で相互作用する場合 (十分な口座残高の確認など)、これは機能しません。
プライオリティ キュー操作は、アイテム数で O(log N) の漸近的なパフォーマンスを持つことができます。この漸近的な限界を達成する、高速で実用的なプライオリティ キュー データ構造が多数あります。
ファイル全体をバッチとして評価しているので、償却されたパフォーマンス保証で優先度キューを調べたいと思うかもしれませんが、コードをリアルタイム設定で使用することが予想される場合は、厳密な per の優先度キューに固執する必要があります。 -クエリ保証。