私の同僚は、小さなコンサルタント会社のすべての従業員の毎週 (日曜日から土曜日まで) の進歩を表示するレポートに取り組んでいます。対象の週の日に対応する列を表示する、彼が書いたコードがあります。彼のアルゴリズムは次のとおりです。
- 月の最初の日が何曜日であるかを取得します。日曜日の場合は、フラグをゼロに設定します。それ以外の場合は、1 に設定します。
- 月のすべての日を繰り返します。日曜日の場合、フラグをインクリメントします。次に、フラグの値が表示される週と等しい場合、現在の日に対応する列を表示します。それ以外の場合は、列を非表示にします。
もちろん、フラグは現在の週が何であるかを示します。
別のアルゴリズムを提案しました:
- 指定された週の最初 (F) と最後の (L) 日が月のどの日であるかを取得します。たとえば、2009 年 10 月の第 1 週は、1 日の火曜日に始まり、3 日の土曜日に終わります。
- 1 日目から F-1 日目に対応する列を反復処理し、それらを非表示にします。
- 日 F から L に対応する列を反復して表示します。
- 日 L+1 から DaysOfMonth に対応する列を繰り返し処理し、それらを非表示にします。
私のアルゴリズムの「難しい」部分はパート 1 です。それを行うアルゴリズムの複雑さは一定であるため、「理解しにくい」のように「難しい」という意味です。そして、私のアルゴリズムには、よりタイトなループを持つという利点があります。私のピアのループは、毎月の比較を行います。私はしません。
これはほんの一例であり、ここで過度に最適化するのは少し偏執的すぎると言うかもしれません。しかし、パフォーマンスが重要な実際のコードを書くとき、彼のプログラミング スタイルは少しも変わりません。
彼のコードには、次のテストも含まれています。
/* doSomething() doesn't change the state of the relevant variables. */
if (condition)
{
flag++;
if (flag > test)
doSomething();
}
else
if (flag >= test)
doSomething();
もちろん、次のように実行できる場合:
if (flag >= test);
doSomething();
if (condition)
flag++;
私は何をしますか?!?!?!
編集: コード サンプルの比較を修正しました。