次のプログラム中の  a  c  に入れる正しい答えの組合せを、解答群の中から選べ。ここで、配列の要素番号は1から始まる。

一度の注文で購入された商品のリストを、注文ごとに記録した注文データがある。
表に、注文データの例を示す。

表 注文データの例

注文番号

購入された商品のリスト

1

A、B、D

2

A、D

3

A

4

A、B、E

5

B

6

C,E

注文データから、商品xと商品yとが同一の注文で購入されやすい傾向を示す関連度 LxyL_{xy} を、次の式で計算する。

Lxy=Mxy×全注文数Kx×KyL_{xy} = \frac{M_{xy} \times \text{全注文数}}{K_x \times K_y}

ここで、 MxyM_{xy} は商品xと商品yとが同一の注文で購入された注文数、 KxK_x は商品xが購入された注文数、 KyK_y は商品yが購入された注文数を表す。

表の例では、MABM_{AB}が2、全注文数が6、KAK_Aが3であるので、商品Aと商品Bの関連度LABL_{AB}は、(2×6)/(4×3)= 1.0である。

手続 putRelatedItem は、大域変数 orders に格納された注文データを基に、引数で与えられた商品との関連度が最も大きい商品のうちの一つと、その関連度を出力する。

プログラムでは、商品は文字列で表し、注文は購入された商品の配列、注文データは注文のは配列で表している。注文データには2種類以上の商品が含まれるものとする。また、注文データにある商品以外の商品が、日キスとして与えられることはないものとする。

[プログラム]
// 注文データ(ここでは表の例を与えている)
大域: 文字列型配列の配列: orders ← {{"A", "B", "D"}, {"A", "D"}, {"A"},{"A", "B", "E"}, {"B"}, {"C", "E"}}


○putRelatedItem(文字列型: item)
文字列型の配列: allItems ← ordersに含まれる文字列を重複なく辞書順に格納した配列
// 表の例では {"A", "B", "C", "D", "E"}


文字列型の配列: otherItems ← allItemsの複製から値がitemである要素を除いた配列


整数型: i, itemCount ← 0
整数型の配列: arrayK ← {otherItemsの要素数個の0}
整数型の配列: arrayM ← {otherItemsの要素数個の0}
実数型: valueL, maxL ← -∞
文字列型の配列: order
文字列型: relatedItem

for (orderにordersの要素を順に代入する)
if (orderのいずれかの要素の値がitemの値と等しい)
itemCountの値を1増やす
endif
for (iを1からotherItemsの要素数まで1ずつ増やす)
if (orderのいずれかの要素の値がotherItems[i]の値と等しい)
if (orderのいずれかの要素の値がitemの値と等しい)
  a  の値を1増やす
endif
 b  の値を1増やす
endif
endfor
endfor
for (iを1からotherItemsの要素数まで1ずつ増やす)
valueL ← (arrayM[i] ×  c  ) / (itemCount × arrayK[i])
if (valueLがmaxLより大きい)
maxL ← valueL
relatedItem ← otherItems[i]
endif
endfor
relatedItemの値とmaxLの値をこの順にコンマ区切りで出力する

出典令和6年度 公開問題 基本情報技術者試験 科目B 問5

a

b

c

arrayK[i]

arrayM[i]

allItemsの要素数

arrayK[i]

arrayM[i]

ordersの要素数

arrayK[i]

arrayM[i]

otherItemsの要素数

arrayM[i]

arrayK[i]

allItemsの要素数

arrayM[i]

arrayK[i]

ordersの要素数

arrayM[i]

arrayK[i]

otherItemsの要素数