戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

基本情報技術者 2014年 秋期 午後 問08


次のプログラムの説明及びプログラムを読んで、設問1,2に答えよ。

 二つの文字列の差異を測る指標に編集距離がある。編集距離の概念は、文書比較や検索キーワードの候補の提示などに用いられている。編集距離とは、1文字の追加操作又は削除操作を繰り返し適用し、ある文字列を別の文字列に変換するのに必要な最小の操作回数である。例えば文字列"abcabba"を文字列"cbabac"に変換する場合、図1に示す操作1〜5によって変換が完了する。図1は、最小の操作回数で変換する一例を示しており、編集距離は5となる。
基本情報技術者試験(平成26年 午後 問8 図1)
 関数CalcEditDistanceは、二つの文字列間の編集距離を返す関数である。
(1) 変換元の文字列をStr1[]、変換先の文字列をStr2[]とする。また、配列の添字は0から始まり、文字列Str1[]のi番目の文字はStr1[i − 1]と表記する。したがって、Str1[] = "abcabba"の場合、1番目の文字 = Str1[0] = "a"、2番目の文字 = Str1[1] = "b"となる。Str2[]についても同様である。 (2) 関数CalcEditDistanceは、エディットグラフと呼ばれるグラフの最短距離取得問題の考え方に基づいて、編集距離を求めている。編集距離の求め方は次のとおりである。  ① 次の手順で、xy平面上にエディットグラフを作成する。ここで、Str1LenはStr1[]の文字数、Str2LenはStr2[]の文字数である。  (a) 0 ≦ X ≦ Str1Lenを満たす全ての整数Xに対して、点(X, 0)から点(X, Str2Len)に線分を引く。  (b) 0 ≦ Y ≦ Str2Lenを満たす全ての整数Yに対して、点(0, Y)から点(Str1Len, Y)に線分を引く。  (c) 0 ≦ X < Str1Len、0 ≦ Y < Str2Lenを満たす全ての整数X、Yの組に対して、Str1[X]とStr2[Y]が同一の文字の場合、点(X, Y)から点(X + 1, Y + 1)に線分を引く。  ② エディットグラフを構成する線分をたどって、点(0, 0)から点(Str1Len, Str2Len)へ移動する経路を考える。点(X, Y)から点(X + 1, Y)又は点(X, Y + 1)への移動距離を1、点(X, Y)から点(X + 1, Y + 1)への移動距離を0としたときの、点(0, 0)から点(Str1Len, Str2Len)までの最短移動距離が編集距離となる。 (3) Str1[] = "abcabba"、Str2[] = "cbabac"の場合のエディットグラフを図2の左に示す。この場合に、最短移動距離となる経路の一つを図2の右に→で示す。
基本情報技術者試験(平成26年 午後 問8 図2)
(4) 関数CalcEditDistanceでは、点(0, 0)から点(X, Y)への最短移動距離をD[X, Y]に求めている。D[X, Y]は、既に算出されているD[X − 1, Y − 1], D[X, Y − 1], D[X − 1, Y]を用いて求めることができる。これによって編集距離を算出している。   〔関数CalcEditDistanceの引数と返却値〕  関数CalcEditDistanceの引数の仕様は、次のとおりである。各配列の添字は、0から始まる。
基本情報技術者試験(平成26年 午後 問8 関数CalcEditDistanceの引数と返却値の仕様)
 関数CalcEditDistanceでは、次の関数Minを使用している。   〔関数Minの仕様〕  引数として与えられた二つ以上の整数値の中で最も小さい値を返却値とする。
〔プログラム〕 基本情報技術者試験(平成26年 午後 問8 プログラム)

設問1:

問題文を見る
 プログラム中のに入れる正しい答えを、解答群の中から選べ。   aに関する解答群  ア:Str1[X - 1] = Str2[Y - 1]  イ:Str1[X - 1] ≠ Str2[Y - 1]  ウ:Str1[X] = Str2[Y]  エ:Str1[X] ≠ Str2[Y]  オ:Str1[X - 1] = Str1[X] and Str2[Y - 1] = Str2[Y]  カ:Str1[X - 1] ≠ Str1[X] and Str2[Y - 1] ≠ Str2[Y]   bに関する解答群  ア:D[0, Str2Len]  イ:D[Str1Len, 0]  ウ:D[Str1Len, Str2Len]  エ:D[Str1Len, Str2Len] + 1  オ:D[Str1Len - 1, Str2Len - 1]  カ:D[Str1Len - 1, Str2Len - 1] + 1

模範解答

a:ア、b:ウ

解説

解答の導き方

まず、 は、点から点までの最短移動距離です。は変換元の文字を何文字分見たか、は変換先の文字を何文字分見たかを表します。
aは、今見ている2文字が同じかどうかを判定する条件です。
配列の添字は0から始まります。そのため、文字目に当たる文字は、文字目に当たる文字はです。例えば、、なら、比べるのはとです。
問題文では、同じ文字どうしなら点から点への斜めの線分を引き、その移動距離を0としています。したがって、2文字が同じときは、斜め移動の距離も候補に含める式を使います。
の候補は、斜めに進む場合の、縦に進む場合の、横に進む場合のです。これらの最小値を求める処理が、斜め移動を含む上側の式です。
よって、aにはが入ります。解答群ではアです。
bは、編集距離として返す値です。
問題文では、編集距離を点から点までの最短移動距離としています。が点から点までの距離なので、返す値はです。
よって、bはウです。

誤りやすいポイント

  • 配列の添字と、見た文字数を混同すること
    文字目の添字はではなくです。そのため、比較するのはとです。
  • 文字が一致しない場合にも、斜め移動を使えると考えること
    斜めの線分は、対応する文字が同じときだけあります。一致しないときは、縦または横の移動だけを候補にします。
  • 返却値の添字を1つ小さくすること
    配列の最後の文字の添字は文字列の長さより1小さいですが、の座標は処理した文字数を表します。終点はなので、返す値はです。

FAQ

Q: やは、なぜ最初に設定するのですか?
A: 片方の文字列を0文字分だけ見た状態から、もう片方の文字をすべて追加または削除する距離が必要だからです。問題文の初期化では、に、にを設定しています。
Q: 文字が一致しないとき、置換するための距離を加えないのですか?
A: この問題の編集距離は、1文字の追加または削除だけを使って変換する場合の距離です。文字を置き換える操作はありません。そのため、一致しない文字どうしを斜めに結ぶ線分もありません。
Q: 「動的計画法」とは何ですか?
A: 小さな範囲の答えを保存し、その答えを使って少し大きな範囲の答えを求める方法です。このプログラムでは、すでに求めたの値を使って、順に次のを計算します。

関連キーワード: 編集距離、動的計画法、最短経路、配列、文字列比較

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

 次の記述中のに入れる正しい答えを、解答群の中から選べ。    Str1[] = "peace", Str2[] = "people"の場合のエディットグラフは、cとなる。  CalcEditDistance("peace", 5, "people", 6)を実行した場合、関数CalcEditDistanceが終了するまでに行αはd回実行され、行βはe回実行される。また、返却値はfとなる。ここで、関数CalcEditDistance中のa、bには正しい答えが入っているものとする。   cに関する解答群 基本情報技術者試験(平成26年 午後 問8 設問2 解答群)
dに関する解答群  ア:2  イ:4  ウ:6  エ:8  オ:10  カ:12  キ:14  ク:16   eに関する解答群  ア:14  イ:16  ウ:18  エ:20  オ:22  カ:24  キ:26  ク:28   fに関する解答群  ア:4  イ:5  ウ:6  エ:7  オ:8  カ:9  キ:10  ク:11

模範解答

c:ウ、d:ウ、e:カ、f:イ

解説

解答の導き方

  1. 同じ文字の組合せから、エディットグラフを選びます。
    問題文では、文字が同じ場合に「点から点に線分を引く」と説明されています。つまり、グラフの斜め線は、変換元と変換先に同じ文字がある組合せを表します。
    「peace」の文字と「people」の文字をそれぞれ比べると、同じ文字の組合せは次のとおりです。
    同じ文字変換元の位置変換先の位置組合せ数
    p11、42
    e2、52、64
    合計は組です。したがって、グラフにはこの組合せに対応する斜め線が6本あります。これに当てはまるのはウです。
  2. αとβが実行される条件を確認します。
    問題文の手順では、文字が同じなら斜め移動ができます。斜め移動の距離は0なので、その場合は、斜め移動を含めた候補から最小値を選ぶαを実行します。
    一方、文字が異なるときは斜め移動ができません。その場合は、縦または横に移動する候補だけから最小値を選ぶβを実行します。
    つまり、aには「とが同じかどうかを判定する条件」が入ります。
  3. αとβの実行回数を数えます。
    外側のループはからまで、内側のループはからまで実行されます。したがって、文字の組合せを調べる回数は回です。
    そのうち、同じ文字の組合せは先ほど数えた6組です。よって、αは6回実行されます。残りの回は文字が異なる組合せなので、βは24回実行されます。
  4. 返却値である編集距離を求めます。
    「peace」から「people」へ変換するとき、共通して順番どおりに残せる文字は「pee」の3文字です。「peace」にはaとcがあり、「people」にはそのどちらもないため、共通部分を4文字にすることはできません。
    共通の3文字を残すには、「peace」からaとcを削除し、「people」にある残りのo、p、lを追加します。1文字ずつ操作するので、合計は削除2回と追加3回で、回です。
    これより少ない回数では変換できないため、返却値は5です。bには、最終地点の値であるが入ります。

誤りやすいポイント

  • 斜め線は、文字が同じ組合せにだけ引きます。同じ文字が複数ある場合は、組合せをすべて数えます。
  • αは、すべての文字の組合せで実行されるわけではありません。文字が同じときだけ実行されます。
  • βの回数は、ループ全体の回数からαの回数を引いて求めます。
  • 編集距離では、文字を置き換える操作は使いません。使えるのは1文字の追加と削除です。

FAQ

Q: 文字が同じときに、斜め移動の距離が0なのはなぜですか?
A: すでにある文字をそのまま残せるため、追加や削除が必要ないからです。
Q: やに、なぜやを設定するのですか?
A: 片方の文字列が空の場合、もう片方の文字をすべて追加または削除する必要があります。操作回数は文字数と同じになるためです。
Q: 同じ文字があるのに、βが実行される場合もありますか?
A: このプログラムでは、同じ文字ならα、異なる文字ならβを実行します。文字が同じ場合の最小値の計算には、斜め移動の候補も含めます。

関連キーワード: 編集距離、エディットグラフ、最短経路、動的計画法、最長共通部分列

解説を読んでも分からないところは、AIに質問できます。 この問題の本文と解説をふまえて答えます。

この設問をAIに質問する

クイズモードで開きます(AIへの質問は無料の会員登録で使えます)

戦国ITクイズ機能

\ せっかくなら /

基本情報技術者を
クイズ形式で学習しませんか?

クイズ画面へ遷移する→

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について