これは、平面スイープアルゴリズムを使用して効率的に解決できます。これは、重なり合う長方形の総面積を見つけるためにここで提案されているラインスイープアルゴリズムの単純な拡張です。
直方体ごとに、イベントキューの左右のx座標を追加し、キューを並べ替えます。次に、直方体を介してyz平面(一定のx値を持つ)をスイープし、イベントキュー内の任意の2つの連続するイベント間のボリュームを記録します。これを行うには、任意の段階で平面と交差する長方形のリストを維持します。
飛行機を掃引すると、次の2種類のイベントが発生します。
(1)掃引平面と交差し始める新しい直方体の始まりがわかります。この場合、新しい長方形が平面と交差し、スイープ平面と交差する長方形の領域を更新します。
(2)平面と交差していた既存の直方体の端。この場合、現在平面と交差している長方形のリストから対応する長方形を削除し、結果の長方形の新しい領域を更新する必要があります。
任意の2つの連続するイベントqiとqi + 1の間の直方体の体積は、 2つのイベント間の水平距離にqiでスイープラインと交差する長方形の面積を掛けたものに等しくなります。
長方形の面積を計算するためのO(nlogn)アルゴリズムをサブルーチンとして使用することにより、直方体の総体積を計算するためのO(n 2 logn)アルゴリズムを取得できます。ただし、(どの段階でも長方形を追加または削除するだけなので)より効率的な長方形を維持するためのより良い方法があるかもしれません。