問題 #13 ・ 計算量 ・ 難易度 3
次の関数 sort は、整数型の配列 data を昇順に整列する。ここで、配列の要素番号は 1 から始まる。なお、演算子 and は短絡評価を行うため、j ≧ 1 が偽のとき data[j] > tmp は評価されない。 この関数を要素数 5 の配列に対して呼び出すとき、要素間の比較(プログラム中の data[j] > tmp の評価)が行われる回数について考える。比較回数が最大となる場合のその回数を a、要素数が一般の n のときの最悪の場合の比較回数のオーダーを b とする。a と b の適切な組合せを、解答群の中から選べ。
○sort(整数型の配列: data)整数型: n ← dataの要素数整数型: i, j, tmpfor (i を 2 から n まで 1 ずつ増やす)tmp ← data[i]j ← i - 1while (j ≧ 1 and data[j] > tmp)data[j + 1] ← data[j]j ← j - 1endwhiledata[j + 1] ← tmpendfor
この関数は挿入ソートである。外側の for ループで i = 2 から n まで繰り返し、各回で data[i] を適切な位置に挿入する。 【n = 5、最悪の場合のトレース】 配列が降順 {5, 4, 3, 2, 1} のとき、毎回 while ループが最後まで回る。 ・i = 2: tmp = 4、j は 1 → 0 まで動く。data[1] > tmp の比較 1 回。 ・i = 3: tmp = 3、j は 2 → 0 まで動く。比較 2 回。 ・i = 4: tmp = 2、j は 3 → 0 まで動く。比較 3 回。 ・i = 5: tmp = 1、j は 4 → 0 まで動く。比較 4 回。 合計: 1 + 2 + 3 + 4 = 10 回(a = 10)。 【一般の n での最悪オーダー】 最悪の場合の比較回数は Σ(i − 1)(i = 2 から n)= 1 + 2 + … + (n − 1) = n(n − 1)/2 である。 これは n² に比例するため、オーダーは O(n²)(b = O(n²))。 【誤答の解説】 ・ア、イ: 比較回数 4 は外側ループの繰返し回数 n − 1 であり、内側ループの比較を数えていない。 ・ウ: 比較回数 10 は正しいが、O(n) は誤り。n(n − 1)/2 は O(n²) である。 ・エ: O(n log n) はマージソート等の計算量であり、この挿入ソートには当てはまらない。 ・カ: 比較回数 16 は (n − 1)² の値で、内側ループが常に n − 1 回回ると誤解した結果。実際は i − 1 回である。
登録すると解いた結果が残り、間違えた問題は日をおいて復習に出ます。
この問題は AI が作り、別の AI に解かせて検証し、人が確認したうえで公開しています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。
記号の意味に迷ったら擬似言語の記法で確かめられます。