私はコーダミングチャレンジに取り組んでいました:競馬デュアル。目標は、リストの2つの要素間の最小の違いを見つけることです。
私はこの最初のアルゴリズムから始めました。これは私が考えていることですO(nlog(n))
が、大きな配列の実行はタイムアウトしていました。
int array[N];
int min = numeric_limits<int>::max();
for (int i = 0; i < N; i++) {
int value;
cin >> value;
cin.ignore();
array[i] = value;
for (int j = i - 1; j >= 0; --j) {
int diff = abs(array[j] - value);
if (diff < min) {
min = diff;
}
}
}
次に、この他のアルゴリズムも試しましたがO(nlog(n))
、今回は時間内に実行が終了します。
int array[N];
int min = numeric_limits<int>::max();
for (int i = 0; i < N; i++) {
int value;
cin >> value;
cin.ignore();
array[i] = value;
}
sort(array, array + N);
for (int i = 1; i < N; ++i) {
int diff = abs(array[i - 1] - array[i]);
if (diff < min) {
min = diff;
}
}
最初のコードの複雑さは間違っていますか?気づかなかった違いはありますか?
ご協力いただきありがとうございます。
最初のコードの複雑さは間違っていますか?
はい、あなたは間違っています。この複雑さはO(n log n)ではなく、代わりにO(n ^ 2)です。
外側のループはn(N
)回実行され、内側のループは平均でn / 2回実行されます。したがって、複雑さの計算では乗法定数は重要ではないため、複雑さはO(n * n / 2)であり、O(n ^ 2)です。
気づかなかった違いはありますか?
はいあります。O(n log n)のように、非常に同じ複雑さの2つのアルゴリズムがある場合でも、漸近的な複雑さの動作では無視される隠れた定数のため、両方とも非常に異なる時間に実行できます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加