1

私はこのコードがspeedで実行されることを期待していましたが、5000個の要素のリストでは、それを強制終了する前に20分を超えて実行されました。

list.contains()が原因ですか?

何か案は?

     public static int PNum(int N)
     {
        List<int> result = new List<int>();
        for (int i = 1; i <= N; i++)
            result.Add(i * (3 * i - 1) / 2);

        int len = result.Count;
        int minDiff = 10000;
        int sum = 0, diff = 0;
        for (int i = 0; i <= len - 1; i++)
        {
            for (int j = i + 1; j <= len - 1; j++)
            {
                diff = result[j] - result[i];
                if (result.Contains(diff))
                {
                    sum = result[i] + result[j];
                    if (result.Contains(sum))
                    {
                        if (diff < minDiff)
                            diff = minDiff;
                    }
                }
            }
        }
        return minDiff;
    }
4

1 に答える 1

6

Nは 5000 です。したがって、外側のループは 5000 回の反復で実行され、内側のループは 5000 回の反復で実行され、List<T>.Containsすべての要素を反復するため、5000 回の反復に相当する作業も実行されます。

したがって、あなたのループは最低でも約 5000 3 = 125,000,000,000 回の操作を行っており、これにはかなりの時間がかかります。

問題は確かにの使用ですList.ContainsHashSetO(1)Containsテストを取得するには、代わりに (または追加で) a を使用します。

于 2013-03-09T20:09:00.670 に答える