━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ データ構造・アルゴリズム論 確認問題7 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
●問 (2分探索) 整数集合 S の要素 1, 2, 4, 6, 7, 9, 11, 14, 16, 18, 19, 22, 24 を 配列にこの順に格納し,2分探索で要素の所属判定をする. 次の各整数が集合 S に属すか否かを判定する際に,どの要素との比較が起こるかを, 比較した要素の系列として (例えば 1→4→7→11 のように) 示せ. (1) 2 (2) 12 なお,中央値の位置(配列の添え字)は,探索範囲の開始位置が l で 終了位置が r のとき,整数の除算の商 div を使って次式で求めること. (l+r) div 2 ────────────────────────────────────── ●答 (2分探索) (1) 11→4→1→2 (2) 11→18→14 [解説] 集合の要素を,次の表の通りに,配列 a[0..12] に格納する. i | 0 1 2 3 4 5 6 7 8 9 10 11 12 -----+-------------------------------------- a[i] | 1 2 4 6 7 9 11 14 16 18 19 22 24 この場合,まず,探索の開始位置を l=0,終了位置を r=12 とおく. 比較位置は m = (l + r) div 2 = (0 + 12) div 2 = 6 なので,a[6] つまり 11 と比較する. (1) の探索では,探索する値が中央値未満 (2<11) なので,2度目には,中央位置の 左側の要素と比べればよい.次の探索の開始位置は l=0,終了位置は r=5 となる. 探索する値が中央値と一致せずに探索を続けるとき,直前に比較した要素は, 次の探索範囲から除くことに注意する.2度目の比較位置は m = (l + r) div 2 = (0 + 5) div 2 = 2 なので,a[2] つまり 4 と比較する. (2) の探索では,探索する値が中央値を超える (11<12) ので,2度目には, 中央位置の右側の要素と比べる.よって,次の探索の開始位置は l=7,終了位置は r=12 となる.以降,同様の考え方で,値が見付かるか,探索区間が空になるまで 探索を続ける. なお,配列の添え字を 0 以外から始めても,同じ結果になる. ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 授業のホームページ 山田 俊行 https://www.cs.info.mie-u.ac.jp/~toshi/