-1

C で記述された 2 つのループがあり、最初の実行n時間nは入力文字列の長さです。入力文字列が*& 201 +ACD 3491 AASD 3.

ループは各文字をスキャンし、数字が検出されると、数字の長さを計算し、その距離だけポインターをインクリメントします。したがって、ポインターが整数をp指して読み取ると、数値 ( ) になり、3 ずつインクリメントされます。一方が実行時間で、もう一方が実行時間である 2 つのネストされたループの時間の複雑さはです。2sscanf201pNMO(N * M)

私のアルゴリズムの時間計算量も であると言っても過言ではありません。その特定の反復でスキャンされる桁数はO(N * M)どこでしょうか? Mそうでない場合、全体の時間計算量はどのくらいになるでしょうか?

編集:

ここにいくつかのコードがあります

char c;
while ((c = fgets(fp)) != EOF) {
    // scans characters, if a digit is encountered, get digit_length
    for (int i = 0; i < digit_length; i++)
        p++;
}
4

1 に答える 1

1

次のすべての番号をスキャンしている場合:

201
01
1
3491
491
91
1
3

その場合、時間は(最悪の場合)O(N ^ 2)になります。どういうわけかこれを避けているなら(そしてそうあるべきです)、それはO(N)になります。

于 2012-07-30T18:31:53.250 に答える