ITパスポート 2015年 秋期 問48
問題文
表に示す構成のデータを、流れ図の手順で処理する場合について考える。流れ図中のx, y, zをそれぞれデータ区分A, B, Cと適切に対応させれば、比較(“xか?”、 “yか?”、 “zか?”)の回数の合計は、最低何回で済むか。

選択肢
ア:170(正解)
イ:190
ウ:230
エ:250
🔒 解説は解答すると表示されます
表のデータを流れ図で処理する問題【ITパスポート 解説】
正解の理由
流れ図は「xか? → yか? → zか? → その他」の順で比較を行います。各データは、最初に当てはまる項目で比較を止めるため、比較回数はその項目が流れ図のどの位置(x,y,z)に割り当てられるかで変わります。
頻度(件数)が大きいデータほど、比較回数が少ない(先にチェックする)位置に割り当てると合計比較回数が小さくなります。表の頻度は C:50、B:30、A:10、その他:10 なので、最小にするには最も頻度の多い C を x(1回で判定)に、次に多い B を y(2回で判定)に、A を z(3回で判定)に割り当てます。
この割り当てにより、比較回数の合計は 170 回になり、選択肢では ア が該当します。
頻度(件数)が大きいデータほど、比較回数が少ない(先にチェックする)位置に割り当てると合計比較回数が小さくなります。表の頻度は C:50、B:30、A:10、その他:10 なので、最小にするには最も頻度の多い C を x(1回で判定)に、次に多い B を y(2回で判定)に、A を z(3回で判定)に割り当てます。
この割り当てにより、比較回数の合計は 170 回になり、選択肢では ア が該当します。
解法ステップ
- 流れ図の各分岐での比較回数を確認する。
- x に該当するデータ:比較 1 回で判定(x? が Yes)
- y に該当するデータ:比較 2 回で判定(x? No → y? Yes)
- z に該当するデータ:比較 3 回で判定(x? No → y? No → z? Yes)
- その他のデータ:x,y,z 全て No → 比較 3 回で「その他の処理」へ
- 各データ区分の件数に応じた重み付き和を考える。比較回数の合計は次の式で表せる。 ここで は各区分の件数。
- 右辺の定数部分 は固定(今回 10 件で 30 回)なので、可変部分 を最小化する。
大きい件数には小さい係数(先にチェックする位置)を割り当てるのが最適(貪欲法的な直感)。 - 頻度順に並べると C(50) > B(30) > A(10)。したがって x=C, y=B, z=A とすると、
可変部分 = 。
その他の固定分 30 を足して合計 170 回になる。
選択肢別の誤答解説
- ア: 170
上述の割り当て(x=C, y=B, z=A)で得られる値。最小値であり正解です(ア)。 - イ: 190
これは例えば不適切な割り当て(例:x=B, y=C, z=A)などで計算すると出る値です。頻度の高い C を先にチェックしないため余分な比較が発生します。 - ウ: 230
さらに悪い順序(例:x=A, y=B, z=C)で、高頻度の C が最後に回るため比較回数が大きくなります。 - エ: 250
最も非効率な割り当ての一つで、頻度の大小をまったく考慮していない結果です。
(各選択肢がどの割り当てでどの合計になるかは、下の補足の簡単な計算例で確認できます。)
よくある誤解
- 「その他は比較回数に入らない」と考える誤り
→ 「その他」に分類されるデータは x,y,z のいずれにも該当しないため、x?、y?、z? の3回の比較が必要になります。今回の「その他」10件は必ず3回ずつ比較されます。 - 「順番を変えても合計は同じ」と思う誤り
→ 順序によって各カテゴリが受ける比較回数(1回・2回・3回)が変わるため合計は変わります。高頻度の項目を前に持ってくるほど合計は小さくなります。
補足コラム
- 最適な順序決定は「頻度の高いものを先にチェックする」という単純なルールで決まります。これは「期待比較回数の最小化」という観点で直感的に正しい方法です。
- この考え方は、検索や条件分岐での効率化全般に使えます。例えばよく使うメニュー項目をメニューの上位に置く、検索フィルタを頻度順に適用するなど、日常の設計にも応用できます。
簡単な計算例(すべての順序を試す Python スクリプト例)
import itertools
freq = {'A':10, 'B':30, 'C':50, 'その他':10}
best = None
for perm in itertools.permutations(['A','B','C']): # perm = (x,y,z)
total = 1*freq[perm[0]] + 2*freq[perm[1]] + 3*freq[perm[2]] + 3*freq['その他']
if best is None or total < best[0]:
best = (total, perm)
best # (170, ('C','B','A'))
FAQ
Q. 「終わりか?」の判断は比較回数に含めないのですか?
A. 問題は x, y, z の比較回数について問われています。「終わりか?」は別の判断であり、設問の比較回数の対象外です。
A. 問題は x, y, z の比較回数について問われています。「終わりか?」は別の判断であり、設問の比較回数の対象外です。
Q. 頻度が同じ場合はどうする?
A. 頻度が同じなら、どちらを先にしても可変部分の合計は変わりません(しかし実装上は判断順が微妙に影響することはあります)。
A. 頻度が同じなら、どちらを先にしても可変部分の合計は変わりません(しかし実装上は判断順が微妙に影響することはあります)。
Q. なぜ3回目の比較で「その他」も確定するのですか?
A. 流れ図では z? の後に No の場合に「その他の処理」へ進むため、x,y,z の3つをすべて否定してはじめて「その他」と判断されます。したがって「その他」は常に 3 回の比較を受けます。
A. 流れ図では z? の後に No の場合に「その他の処理」へ進むため、x,y,z の3つをすべて否定してはじめて「その他」と判断されます。したがって「その他」は常に 3 回の比較を受けます。
関連キーワード: データ分類、流れ図、比較回数、頻度最適化、貪欲法、条件分岐最適化

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

