-1

for ループ内にネストされた if ステートメントで構成されるメソッドがあります。

for (int i = 0; i < val; i=i+2)
{
    for (int j = i+1; j < val; j=j+1)
    {
        actualDistance = actualDistance + (ulong)Math.Max(revenue[i], revenue[j]) * (ulong)Math.Abs(point[j] - point[i]);

        if (j + 1 < val)
        {
            actualDistance = actualDistance + (ulong)Math.Max(revenue[i+1], revenue[j+1]) * (ulong)Math.Abs(point[j+1] - point[i+1]);
        }
    }
}

ただし、val が数千万以内の数値を表す場合、このメソッドは for ループと if ループの両方で使用されるため、実行時に非常に長い時間がかかります。

これを行うためのより良い、より効率的な方法はありますか? 現在のコードは時間効率が悪いです。

4

1 に答える 1

2

私は何かが欠けているか、あなたのコードは次と同等です:

for (int j = i+1; j < val; j=j+1)
{
    actualDistance = actualDistance + (ulong)Math.Max(revenue[i], revenue[j]) * (ulong)Math.Abs(point[j] - point[i]);

    actualDistance = actualDistance + (ulong)Math.Max(revenue[i+1], revenue[j+1]) * (ulong)Math.Abs(point[j+1] - point[i+1]);
}

actualDistance = actualDistance - (ulong)Math.Max(revenue[i+1], revenue[val]) * (ulong)Math.Abs(point[val] - point[i+1])

ステートメントifはほとんどの場合 true であり、 false の場合は when のみj == val - 1であるため、常にステートメント内でコードを実行し、最後のケースをループifの外で減算することができます。for

于 2015-03-29T05:19:42.840 に答える