HOME»基本情報技術者試験掲示板»大滝本4.14自己再編成探索 具体例ありきの解き方でOK?
投稿する
»[6131] 再受験までの勉強期間について 投稿数:5
»[6130] 基本情報技術者試験 受験予定/過去問道場の正答率と不安点につ 投稿数:2
大滝本4.14自己再編成探索 具体例ありきの解き方でOK? [6133]
タケダさん(No.1)
大滝本をお持ちの方、お力をお貸しください。
「応用問題 4.14 リストを自己再編成探索する」 にて、
図と選択肢ありきの解法しかできず、不安に思っています。
IT未経験で、プログラミング開発の予定もないのですが、合格のためには下記の解法で十分でしょうか?
関数organizingSearchをorganizingSearch("C")として実行した際に、
変数currentとtempは、次のように変化します。
current:①first → ②current.next(first.next) → ③curent.next.next(first.next.next)
temp:①current(first) →②current(first.next.next)
そして、key("C")がcurrent.key(first.next.next.key)のCと等しくなり、if文の条件を満たします。
その後なのですが、
Ⅰ. [a] ← current.next
Ⅱ. current.next ← [b]
Ⅲ. first ← [c]
と穴埋め問題が設けられており、私はそれぞれ、
Ⅰ. 良くわからないけど、何かの宛て先を、current.next(first.next.next.next)、つまり"D"のキーがあるノード宛て変更しようとしているな...
図2を見ると、Bのキーがあるノードのnext(宛て先)をこれ(D宛て)に変えたい!
選択肢から無理矢理これを表現するには、temp(first.next.next)しかないな!
これなら、図1(再編前)のBのキーがあるノードのnextを指しているな!
Ⅱ. 良くわからないけど、current.next(first.next.next.next)を何か別の宛て先に変更しようとしているな...
current.next(first.next.next.next)は、"C"があるノードのnext(宛て先)のことか...
選択肢を見ると、firstもしくはfirst.nextの二択か...
図2を見ると、"C"のノードが先頭にきていて、"A"のキーがあるノードを参照するように"C"のノード内のnextを変更しなければいけないから、ここはfirstだ!
これなら、図1(再編前)のAのキーがあるノードを指しているな!
Ⅲ. 良くわからないけど、firstを何か別の宛て先に変更しようとしているな...
選択肢を見ると、temp.nextもしくはcurrentの二択か...
図2を見ると、firstは"C"のノードを参照しているから、"C"のノードを参照するように変えたい!
選択肢から無理矢理これを表現するには、current(first.next.next)しかないな!
これなら、図1(再編前)のCのキーがあるノードを指しているな!
どのようなkeyの検索値でも機能するようにcurrentやtempを宣言し、プログラミングが作り込まれているのだと思いますが、未経験者には「こう作りたくなるのが当然だよね!」という感覚がないので、開発側の意図に沿って問題を解くことができません。
「応用問題 4.14 リストを自己再編成探索する」 にて、
図と選択肢ありきの解法しかできず、不安に思っています。
IT未経験で、プログラミング開発の予定もないのですが、合格のためには下記の解法で十分でしょうか?
関数organizingSearchをorganizingSearch("C")として実行した際に、
変数currentとtempは、次のように変化します。
current:①first → ②current.next(first.next) → ③curent.next.next(first.next.next)
temp:①current(first) →②current(first.next.next)
そして、key("C")がcurrent.key(first.next.next.key)のCと等しくなり、if文の条件を満たします。
その後なのですが、
Ⅰ. [a] ← current.next
Ⅱ. current.next ← [b]
Ⅲ. first ← [c]
と穴埋め問題が設けられており、私はそれぞれ、
Ⅰ. 良くわからないけど、何かの宛て先を、current.next(first.next.next.next)、つまり"D"のキーがあるノード宛て変更しようとしているな...
図2を見ると、Bのキーがあるノードのnext(宛て先)をこれ(D宛て)に変えたい!
選択肢から無理矢理これを表現するには、temp(first.next.next)しかないな!
これなら、図1(再編前)のBのキーがあるノードのnextを指しているな!
Ⅱ. 良くわからないけど、current.next(first.next.next.next)を何か別の宛て先に変更しようとしているな...
current.next(first.next.next.next)は、"C"があるノードのnext(宛て先)のことか...
選択肢を見ると、firstもしくはfirst.nextの二択か...
図2を見ると、"C"のノードが先頭にきていて、"A"のキーがあるノードを参照するように"C"のノード内のnextを変更しなければいけないから、ここはfirstだ!
これなら、図1(再編前)のAのキーがあるノードを指しているな!
Ⅲ. 良くわからないけど、firstを何か別の宛て先に変更しようとしているな...
選択肢を見ると、temp.nextもしくはcurrentの二択か...
図2を見ると、firstは"C"のノードを参照しているから、"C"のノードを参照するように変えたい!
選択肢から無理矢理これを表現するには、current(first.next.next)しかないな!
これなら、図1(再編前)のCのキーがあるノードを指しているな!
どのようなkeyの検索値でも機能するようにcurrentやtempを宣言し、プログラミングが作り込まれているのだと思いますが、未経験者には「こう作りたくなるのが当然だよね!」という感覚がないので、開発側の意図に沿って問題を解くことができません。
2025.11.09 16:54
lemmiwinksさん(No.2)
大前提として問題文に記されている通りの処理を選択肢から選ぶので問題文(図を含む)と選択肢ありきになるのは当然です。
虫食いは、まず何の処理をしているコード(関数)なのかを把握する
関数内の処理は「引数のkeyと一致する要素(ノード)を先頭に移動する」
keyが要素から見つからなければ-1を返す
単方向リストをクラスNodeと変数firstを用いて表す
コードの流れは先頭要素から順にキーと一致しているかどうか探索し、
一致した要素を先頭要素に移動する命令を実行した後に合致した要素の値を返している
虫食い部分の3つの命令は
探索条件(if文2つ)が示されている
1つ目がkeyが探索した要素と一致し、2つ目が一致した要素が先頭要素ではない分岐
1.〜3.の命令は「引数のkeyと一致する要素(ノード)を先頭に移動する」
1.要素"C"をリストから外す (要素"B"の変数nextに要素"D"を代入)
2.要素"C"を先頭に追加する (要素"C"の変数nextに要素"A"を代入)
3.要素"C"を先頭要素に設定する (変数firstに要素"C"を代入)
コード中の変数は、
変数firstが先頭要素の参照
変数currentが基準となる要素
変数tempがcurrentの一つ前の要素
をそれぞれ表している
first並びにcurrentとtempの変数を用いてリストの各要素の参照を格納することで探索とリストの要素を移動する処理を実現している
tempは①の時は宣言のみで、まだ初期化していないので
temp:②current(first) →③current(first.next.next)です。
要素数が少ないリストでも(first.next...)のような記述をしていたら無駄に長く解りにくくなりミスの元なので認識を改めたほうがいい
具体的に何がわからないのかクラス・リスト・探索等を分野別に細分化して自己分析し、足りない部分を見つけて理解を深めてみてはどうだろう
虫食いは、まず何の処理をしているコード(関数)なのかを把握する
関数内の処理は「引数のkeyと一致する要素(ノード)を先頭に移動する」
keyが要素から見つからなければ-1を返す
単方向リストをクラスNodeと変数firstを用いて表す
コードの流れは先頭要素から順にキーと一致しているかどうか探索し、
一致した要素を先頭要素に移動する命令を実行した後に合致した要素の値を返している
虫食い部分の3つの命令は
探索条件(if文2つ)が示されている
1つ目がkeyが探索した要素と一致し、2つ目が一致した要素が先頭要素ではない分岐
1.〜3.の命令は「引数のkeyと一致する要素(ノード)を先頭に移動する」
1.要素"C"をリストから外す (要素"B"の変数nextに要素"D"を代入)
2.要素"C"を先頭に追加する (要素"C"の変数nextに要素"A"を代入)
3.要素"C"を先頭要素に設定する (変数firstに要素"C"を代入)
コード中の変数は、
変数firstが先頭要素の参照
変数currentが基準となる要素
変数tempがcurrentの一つ前の要素
をそれぞれ表している
first並びにcurrentとtempの変数を用いてリストの各要素の参照を格納することで探索とリストの要素を移動する処理を実現している
>current:①first → ②current.next(first.next) → ③curent.next.next(first.nex
>t.next)
>temp:①current(first) →②current(first.next.next)
tempは①の時は宣言のみで、まだ初期化していないので
temp:②current(first) →③current(first.next.next)です。
要素数が少ないリストでも(first.next...)のような記述をしていたら無駄に長く解りにくくなりミスの元なので認識を改めたほうがいい
具体的に何がわからないのかクラス・リスト・探索等を分野別に細分化して自己分析し、足りない部分を見つけて理解を深めてみてはどうだろう
2025.11.10 22:27
タケダさん(No.3)
lemmiwinksさん
ご回答ありがとうございます。
とありますが、これは、
変数firstが先頭要素の参照
変数currentが基準となる要素
変数tempがcurrentの一つ前の要素
各変数の機能(わざわざ設けたねらい)に着眼してみたいと思います。
ご回答ありがとうございます。
>要素数が少ないリストでも(first.next...)のような記述をしていたら無駄に長く解りにくくなりミスの元なので認識を改めたほうがいい
とありますが、これは、
変数firstが先頭要素の参照
変数currentが基準となる要素
変数tempがcurrentの一つ前の要素
各変数の機能(わざわざ設けたねらい)に着眼してみたいと思います。
2025.11.10 23:18
その他のスレッド
»[6132] 科目B試験3回落ちました。どのように勉強すれば良いですか? 投稿数:10»[6131] 再受験までの勉強期間について 投稿数:5
»[6130] 基本情報技術者試験 受験予定/過去問道場の正答率と不安点につ 投稿数:2
