列が時間順に表示されていると仮定すると、最初の行(たとえば)は、各期間の全体の建設が完了したことを示します
0, 0+45 = 45, 45+135 = 180, 180+405 = 585, 585+1010 = 1595, ..., 2230+0 = 2230.
建設は2230/2 = 1115で途中で終了しました。これは、期間3の終わりに合計が585、期間4の終わりに合計が1595、および585 <= 1115 <1595だったため、期間4中に発生しました。
これは、期間のインデックスを示す[中央値]列によって報告された結果のようです(左側の1から開始)。
これを好きな言語でコーディングできます。ただし、テーブルは非常に小さい(100行)ので、Pythonなどで正式に何を行うかを確認する場合にのみ、スプレッドシートが便利です。これは次のようになります。
最初の3つのデータ行の値は同じです。次の2つのデータ行(空白行で囲まれている)は、テーブルのさらに下で選択されます。最後の5つのデータ行は、アルゴリズムを少し実行します。
(スプレッドシートの最後の2行に示されているように、中央が2つの期間のちょうど真ん中にある場合に Excelが後の期間を選択する方法に注意してください。これは必ずしも「正しい」答えではありませんが、有効な答えです。)
H:R列の数式は次のとおりです。
すべてを入力する必要はありません。必要な唯一の入力は次のとおりです。
=H2+A2
I2で。これをO2にドラッグします。これは、累積合計を計算します。列A:Gが時系列であることが必要です。
=O2/2
P2で。これは合計の半分を見つけます。
=Match(P2,H2:O2,1)
Q2。これは、構築が半分完了した列にインデックスを付けます。
=Offset($A$1:$G$1,0 0, Q2-1, 1, 1)
R2で。これにより、インデックスに対応する列見出しが取得されます。
次に0
、列Hのすべてに貼り付け、I2:R2を必要な数の行までドラッグします。
これは事実上、アルゴリズムの疑似コードとして機能します。最もトリッキーな部分は、ExcelのMATCH
機能を実装するための検索です。しかし、これには工夫は必要ありません。これらの配列は非常に短いため、累積合計の各配列を(推奨されるバイナリ検索アルゴリズムではなく)順次検索することは非効率的ではありません。