2016-12-08 1 views
0

この関数はO(n)かO(log(n))時間の複雑さですか?このインプレース配列反転の時間複雑度はどのくらいですか?

function reverse(array) { 
    for (var i = 0, j = array.length - 1; i < j; i++, j--) { 
    var temp = array[i]; 
    array[i] = array[j]; 
    array[j] = temp; 
    } 

    return array; 
} 

一見して、入力に対してn/2回の反復を行っているようです。しかし、それについて考えると、実際の下位レベル操作の数は2nに近くなります。ですから、長さn の文字列を持っている

+4

を扱う場合は、操作(i++j--)を維持ループは些細であると仮定している一般的な方法であるどちらもありませんn/2も2nもO(log(n))です。 – user2357112

+1

まだO(n)です。 (それはnと線形に成長します) –

+0

なぜ回答クレジット – Eric

答えて

1

を想定して、あなたが指標i=0、およびj = n-1 を持っているループはこれがあなたにn/2反復の合計を与える1 によって1とiずつjデクリメントでi>=jまで続きます。 ループの内部には合計3文があり、ループは合計で3(n/2)となります。それに伴い、あなたが

f(n) = 3(n/2)+1 which is O(n) 

EDITで私たちを残してループの外側1つの動作を持っている:ビッグああ表記

+0

私はなぜi ++(またはi = i - 1)が "自明"だと仮定しているのですか?data [i] = data [j]は "cost"この説明はまだ私には意味をなさない。 – Eric

+1

これらの操作のたびに同じ時間がかかる限り、時間はかかりません。それは私たちがここで「些細なこと」を意味するものです。ループ演算のコストを含めることを選択した場合、定数値(3、/ 2、および+1)が変更されます。これは定義上、最終的な解には影響しません。 –

関連する問題