午後問でわからないところがあります。助けて下さい。
広告
勉強中女子さん
(No.1)
すみません、過去問を解いていてどうにも納得できない部分がありましたのでこちらにて質問させて頂きます。
どなたか詳しく解説できる方いらっしゃいましたらどうかコメントして頂けたらと思います。
============以下、納得できない部分についての詳細============
応用情報技術者試験(H21秋・午後問2)
の文字列照合処理について
「図3 効率的な照合方法」のパターン「HIJ」に対して、
「表1 パターンHIJに対するスキップ数」には、
以下の様になるよう表の内容が記載されています
判定文字 = {"H", "I", "J", "その他の文字"}
スキップ数 =v{2, 1, 3, 3}
その一方、
「図4 効率的な照合方法のアルゴリズム」の
図4の冒頭から「// (1):表の作成」部分までで示されている処理内容を見ると
「for jを1からP.length-1まで1づつ増やす」となっているので、
この処理内容を図3のパターン「HIJ」に対してトレースしてみると
判定文字 = {"H", "I", ""}
スキップ数 =v{2, 1, 3}
となってしまうように思えます。
P.length-1は「HIJ」の場合は3-1=2なので、表の作成の外側ループは全部で2回しかループしないからです。
これって問題の図4で示される処理ロジック不具合なのでしょうか?
それとも私のトレース解析に問題があるのでしょうか?
どなたか、詳細に解説などして頂ける方はいらっしゃいませんでしょうか、モヤモヤしてしまっています。
どうかどなたかご助力お願い致します。
============================================================
どなたか詳しく解説できる方いらっしゃいましたらどうかコメントして頂けたらと思います。
============以下、納得できない部分についての詳細============
応用情報技術者試験(H21秋・午後問2)
の文字列照合処理について
「図3 効率的な照合方法」のパターン「HIJ」に対して、
「表1 パターンHIJに対するスキップ数」には、
以下の様になるよう表の内容が記載されています
判定文字 = {"H", "I", "J", "その他の文字"}
スキップ数 =v{2, 1, 3, 3}
その一方、
「図4 効率的な照合方法のアルゴリズム」の
図4の冒頭から「// (1):表の作成」部分までで示されている処理内容を見ると
「for jを1からP.length-1まで1づつ増やす」となっているので、
この処理内容を図3のパターン「HIJ」に対してトレースしてみると
判定文字 = {"H", "I", ""}
スキップ数 =v{2, 1, 3}
となってしまうように思えます。
P.length-1は「HIJ」の場合は3-1=2なので、表の作成の外側ループは全部で2回しかループしないからです。
これって問題の図4で示される処理ロジック不具合なのでしょうか?
それとも私のトレース解析に問題があるのでしょうか?
どなたか、詳細に解説などして頂ける方はいらっしゃいませんでしょうか、モヤモヤしてしまっています。
どうかどなたかご助力お願い致します。
============================================================
2015.12.27 00:26
確かにさん
(No.2)
仰るとおり、ループが2回しか回らない以上、C[3] = ""ですね。
ただし、元々配列Cを初期化する際には、
for i = 1..P.length
としているので、
// (1):表の作成
の過程で生成されるスキップ数の表は、
C = {"H", "I", "", ""}
D = {2, 1, 3, 3}
となります。
末尾の文字"J"が配列Cに格納されているかどうかは問題にはなりません。
なぜなら、パターン一致判定過程は
// (2):文字の比較
で行われており、ここでは配列Cは使用しません。
一方、スキップする文字数を決定する際には、"J"であっても""であってもスキップする文字数が3であることに変わりはないからです。
ただし、元々配列Cを初期化する際には、
for i = 1..P.length
としているので、
// (1):表の作成
の過程で生成されるスキップ数の表は、
C = {"H", "I", "", ""}
D = {2, 1, 3, 3}
となります。
末尾の文字"J"が配列Cに格納されているかどうかは問題にはなりません。
なぜなら、パターン一致判定過程は
// (2):文字の比較
で行われており、ここでは配列Cは使用しません。
一方、スキップする文字数を決定する際には、"J"であっても""であってもスキップする文字数が3であることに変わりはないからです。
2015.12.27 15:00
勉強中女子さん
(No.3)
この投稿は削除されました。(2015.12.28 21:59)
2015.12.28 21:59
勉強中女子さん
(No.4)
(誤字脱字訂正のために一度コメント削除して再投稿です)
コメントありがとうございます。
きっと問題を探してくれて、考えてくれた上でコメント頂いていると想像しています。
そんな[確かに]さんの恩に仇で返すようですが、掲示板上での不特定多数の方が見ている場所という事も考慮して
[確かに]さんのコメントの内容に誤りがある事をここで指摘させていただきます。すみません。
指摘①:
の部分について、配列初期化の部分のループ条件
「for xを1からP.lengthまで1づつ増やす」は
P={"H", "I", "J"}の場合で考えると、丁寧にトレースしてみると
P.length=3となるので
x=1
C[1]←" "
D[1]←3
x=2
C[2]←" "
D[2]←3
x=3
C[3]←" "
D[3]←3
初期化ループ結果:
C = {"", "", ""}
D =v{3, 3, 3}
までのループ処理結果となるので、C[4]やD[4]の初期化はしない筈なので
[確かに]さんのトレース結果に誤りがあるのではないでしょうか?
指摘②:
の部分についても、配列CやDはスキップ数の判定に用いるための配列なので
「// (2):文字の比較」で出てこないのは当然だと思います、ここで"J"が
配列Cに格納されているかどうかに言及している[確かに]さんはそもそも
処理内容の意味を間違えて理解しているのではないでしょうか?
文字の比較は配列Tと配列Pを比較するので配列CやDを参照しないのは当然ですよね。
=======以下、自己解決結果======
・・・とここまで記載して、最初の自分のコメントの質問の回答を自己解決できました。
配列Cの内容が
C = {"H", "I", ""}
となる理由は、恐らく「その他の文字」と「表1 パターンHIJに対するスキップ数」の
判定文字の最後の1文字である"J"は必ずスキップ数が同じになるという結果を考慮して、
最終文字とその他文字の配列要素を同じになるようにして無駄を省きたかったんだろうな、
ということが理解できました。
設問3の場合のように"PEP"でCを処理に当てはめて「// (1):表の作成」をトレースしてみると
C={"P", "E", " "}
D={2, 1, 3]
となり、やはりパターン3文字目の"P"を処理しないで1文字目の"P"は正しくスキップ数判定していました。
先日、そこまで考えが及ばずに出題側のミスなのでは?とまで考えてしまいこの場を利用してお騒がせしてしまいました。
無事に自己解決して納得できましたので質問は解決となりました、ありがとうございました。
> [確かに]さん
コメントありがとうございます。
きっと問題を探してくれて、考えてくれた上でコメント頂いていると想像しています。
そんな[確かに]さんの恩に仇で返すようですが、掲示板上での不特定多数の方が見ている場所という事も考慮して
[確かに]さんのコメントの内容に誤りがある事をここで指摘させていただきます。すみません。
指摘①:
> ただし、元々配列Cを初期化する際には、
> for i = 1..P.length
> としているので、
> // (1):表の作成
> の過程で生成されるスキップ数の表は、
> C = {"H", "I", "", ""}
> D = {2, 1, 3, 3}
> となります。
の部分について、配列初期化の部分のループ条件
「for xを1からP.lengthまで1づつ増やす」は
P={"H", "I", "J"}の場合で考えると、丁寧にトレースしてみると
P.length=3となるので
x=1
C[1]←" "
D[1]←3
x=2
C[2]←" "
D[2]←3
x=3
C[3]←" "
D[3]←3
初期化ループ結果:
C = {"", "", ""}
D =v{3, 3, 3}
までのループ処理結果となるので、C[4]やD[4]の初期化はしない筈なので
[確かに]さんのトレース結果に誤りがあるのではないでしょうか?
指摘②:
> 末尾の文字"J"が配列Cに格納されているかどうかは問題にはなりません。
> なぜなら、パターン一致判定過程は
> // (2):文字の比較
> で行われており、ここでは配列Cは使用しません。
の部分についても、配列CやDはスキップ数の判定に用いるための配列なので
「// (2):文字の比較」で出てこないのは当然だと思います、ここで"J"が
配列Cに格納されているかどうかに言及している[確かに]さんはそもそも
処理内容の意味を間違えて理解しているのではないでしょうか?
文字の比較は配列Tと配列Pを比較するので配列CやDを参照しないのは当然ですよね。
=======以下、自己解決結果======
・・・とここまで記載して、最初の自分のコメントの質問の回答を自己解決できました。
配列Cの内容が
C = {"H", "I", ""}
となる理由は、恐らく「その他の文字」と「表1 パターンHIJに対するスキップ数」の
判定文字の最後の1文字である"J"は必ずスキップ数が同じになるという結果を考慮して、
最終文字とその他文字の配列要素を同じになるようにして無駄を省きたかったんだろうな、
ということが理解できました。
設問3の場合のように"PEP"でCを処理に当てはめて「// (1):表の作成」をトレースしてみると
C={"P", "E", " "}
D={2, 1, 3]
となり、やはりパターン3文字目の"P"を処理しないで1文字目の"P"は正しくスキップ数判定していました。
先日、そこまで考えが及ばずに出題側のミスなのでは?とまで考えてしまいこの場を利用してお騒がせしてしまいました。
無事に自己解決して納得できましたので質問は解決となりました、ありがとうございました。
2015.12.28 22:01
確かにさん
(No.5)
解決されているようなのでコメントは不要かと思ったのですが、1点だけ気になったことがあったので。
仰るとおりなのですが、回答の趣旨としては、"J"と"その他の文字"を区別する必要性はない、というところでした。
と仰られていますよね。
配列Cが他で参照されている場合には、"J"と"その他の文字"が区別できるようになっていないとまずいことが起きるかもしれない、という可能性を考えた結果の回答だったのですが、実際には不要でしたね。
なお、指摘1については私の勘違いでした(配列の添字の始まりが1と0がごちゃごちゃになっていました)。ご指摘および修正、ありがとうございました。
> 配列CやDはスキップ数の判定に用いるための配列なので
>「// (2):文字の比較」で出てこないのは当然だと思います、ここで"J"が
> 配列Cに格納されているかどうかに言及している[確かに]さんはそもそも
> 処理内容の意味を間違えて理解しているのではないでしょうか?
> 文字の比較は配列Tと配列Pを比較するので配列CやDを参照しないのは当然ですよね> 。
仰るとおりなのですが、回答の趣旨としては、"J"と"その他の文字"を区別する必要性はない、というところでした。
> 判定文字の最後の1文字である"J"は必ずスキップ数が同じになるという結果を考> 慮して
と仰られていますよね。
配列Cが他で参照されている場合には、"J"と"その他の文字"が区別できるようになっていないとまずいことが起きるかもしれない、という可能性を考えた結果の回答だったのですが、実際には不要でしたね。
なお、指摘1については私の勘違いでした(配列の添字の始まりが1と0がごちゃごちゃになっていました)。ご指摘および修正、ありがとうございました。
2015.12.31 17:11
返信投稿用フォーム
スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。