東京工業大学 情報理工学院 数理・計算科学系 2018年8月実施 午前 問C
Author
祭音Myyura
Description
配列 d[0], d[1], ... , d[n−1] には n 個の相異なる整数が昇順で入っているとする. 探索アルゴリズムを記述した次の擬似コードを BinSearch と呼ぶ.
def search(k, a, b) # a ≦ i ≦ b かつ d[i] = k となる i を返す.
# そのような i が無い場合は -1 を返す.
i := a + ((b - a) / 2) # ☆
if (d[i] == k)
return i
else if ((k < d[i]) && (a < i))
return search(k, a, i-1)
else if ((d[i] < k) && (i < b))
return search(k, i+1, b)
else
return -1
end
end
ただし ☆ の行中の / は切り捨てで商を求める演算である.
与えられた整数 k に対して search(k,0,n−1) を実行すると,d[i] = k となる i が存在する場合はその i が返され,存在しない場合は −1 が返される.
search(k,0,n−1) の計算の中で ☆ の行が実行される総回数(つまり search が呼び出される総回数)を steps(k, n) と表記する.
たとえば配列 d が {30,50} のとき steps(30, 2) = 1 であり(なぜなら search(30,0,1) だけが呼び出される)steps(40, 2) = 2 である(なぜなら search(40,0,1) と search(40,1,1) が呼び出される).
max_steps(n) =
(1) max_steps(15) の値を書け.
(2) ☆ の行の代入文を
i := a + ((b - a) / 1)
(これは i := b に等しい)に変更した擬似コードを UniSearch と呼ぶ.UniSearch における max_steps(10) の値を書け. さらに配列 d が {0,2,4,6,8,10,12,14,16,18} のとき,steps(k, 10) = max_steps(10) となる k の値をひとつ書け.
(3) ☆ の行の代入文を
i := a + ((b - a) / 10)
に変更した擬似コードを DecSearch と呼ぶ. DecSearch における max_steps(10) の値を書け. さらに配列 d が上記と同じとき,steps(k, 10) = max_steps(10) となる k の値をひとつ書け.
(4) 3つの関数 bin, uni, dec を次のように定義する.
- bin(n) = BinSearch における max_steps(n).
- uni(n) = UniSearch における max_steps(n).
- dec(n) = DecSearch における max_steps(n).
これらそれぞれの関数をオーダー記法
(5) 次の
- bin(n) のオーダーは uni(n) のオーダー
. - bin(n) のオーダーは dec(n) のオーダー
. - uni(n) のオーダーは dec(n) のオーダー
.
Kai
(1)
- max_steps(15) = 4
(2)
最悪の場合、要素を大きい順に1つ残らず調べる。
- max_steps(10) = 10
- k = 0
(3)
よって、(2) と同じに、最悪の場合、要素を小さい順に1つ残らず調べる。
- max_steps(10) = 10
- k = 18
(4)
(5)
- bin(n) のオーダーは uni(n) のオーダー よりも真に小さい.
- bin(n) のオーダーは dec(n) のオーダー と等しい.
- uni(n) のオーダーは dec(n) のオーダー よりも真に大きい.