Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

2分木の演習問題[アルゴリズムとデータ構造]

502 views

Published on

アルゴリズムとデータ構造の授業で使った発表資料です。
2分木にまつわる課題の解答および解説

Published in: Technology
  • Be the first to comment

  • Be the first to like this

2分木の演習問題[アルゴリズムとデータ構造]

  1. 1. レポート7 〜2分⽊〜 2016.10.24 アルゴリズムとデータ構造 @清⽔寺(2016.05.22)
  2. 2. 課題1 X = A + B (C + D) を2分⽊で表現せよ。 さらに,この2分⽊をpost order で巡回した時 逆ポーランド記法になっていることを⽰せ @KEK(2016.09.04)
  3. 3. X = A+B(C+D)を2分⽊で表現 A B(C+D) +
  4. 4. X = A+B(C+D)を2分⽊で表現 A B(C+D) + A B(C+D) +
  5. 5. X = A+B(C+D)を2分⽊で表現 B (C+D)× A + A B(C+D) +
  6. 6. X = A+B(C+D)を2分⽊で表現 B (C+D)× A + A + B (C+D) ×
  7. 7. X = A+B(C+D)を2分⽊で表現 B × A + A + B (C+D) × C + D
  8. 8. X = A+B(C+D)を2分⽊で表現 B × A + A + B × C + D C + D
  9. 9. Post orderで巡回 A + B × C + D
  10. 10. Post orderで巡回 A + B × C + D{A, B, C, D, +, ×, +}
  11. 11. 逆ポーランド記法? 演算⼦を,被演算⼦の後ろに書く⽅式 後置記法とも呼ぶ ⽇本語に近い表現 中置記法: 1+2 後置記法: 1 2 + (「1と2を⾜す」) 前置記法: + 1 2 ※Lispはこんな感じの⽂法 (* 1 (+ 2 3))
  12. 12. {A, B, C, D, +, ×, +} 逆ポーランド記法をプログラムで使うときは スタックを考える場合もあるので, それで検算してみる B ×A +C +D
  13. 13. {A, B, C, D, +, ×, +} 演算⼦が⼊ったら, その前の2つの値の演算を⾏ってpushする BA C +D × +
  14. 14. {A, B, C, D, +, ×, +} BA (C+D) × + 演算⼦が⼊ったら, その前の2つの値の演算を⾏ってpushする
  15. 15. {A, B, C, D, +, ×, +} BA (C+D) × + 演算⼦が⼊ったら, その前の2つの値の演算を⾏ってpushする
  16. 16. {A, B, C, D, +, ×, +} A +B(C+D) 演算⼦が⼊ったら, その前の2つの値の演算を⾏ってpushする
  17. 17. {A, B, C, D, +, ×, +} A +B(C+D) 演算⼦が⼊ったら, その前の2つの値の演算を⾏ってpushする
  18. 18. {A, B, C, D, +, ×, +} A+B(C+D) 演算⼦が⼊ったら, その前の2つの値の演算を⾏ってpushする
  19. 19. 課題2 {7, 4, 2, 1, 9, 10, 5, 3, 8, 6}で並んだデータを その並んでいる順番に2 分探索⽊を作成せよ。 @春夏秋冬(渋⾕)(2016.08.30)
  20. 20. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7
  21. 21. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7
  22. 22. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4
  23. 23. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4
  24. 24. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2
  25. 25. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2
  26. 26. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1
  27. 27. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1
  28. 28. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9
  29. 29. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9
  30. 30. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9 10
  31. 31. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9 10
  32. 32. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9 10 5
  33. 33. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9 105
  34. 34. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9 105 3
  35. 35. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9 105 3
  36. 36. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9 105 3 8
  37. 37. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9 105 3 8
  38. 38. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9 105 3 8 6
  39. 39. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9 105 3 8 6
  40. 40. {7, 4, 2, 1, 9, 10, 5, 3, 8, 6} 7 4 2 1 9 105 3 8 6
  41. 41. 課題3 課題2で作成した⽊について, 根 (root), 4の親,5 の⼦,9 の兄弟,⽊の⾼さを答えよ。 @コメダ珈琲(2016.04.19)
  42. 42. 根(root) 7 4 2 1 9 105 3 8 6
  43. 43. 根(root) 7 4 2 1 9 105 3 8 6 頂点が「根」(root)
  44. 44. 4の親 7 4 2 1 9 105 3 8 6
  45. 45. 4の親 7 4 2 1 9 105 3 8 6 上位に位置するのが親
  46. 46. 5の⼦ 7 4 2 1 9 105 3 8 6
  47. 47. 5の⼦ 7 4 2 1 9 105 3 8 6 下位に位置するのが⼦
  48. 48. 9の兄弟 7 4 2 1 9 105 3 8 6
  49. 49. 9の兄弟 7 4 2 1 9 105 3 8 6 同位に位置するのが兄弟
  50. 50. ⽊の⾼さ 根から⼀番遠い葉までの枝の数
  51. 51. 根(root) 7 4 2 1 9 105 3 8 6 根から ⼀番遠い葉 までの
  52. 52. 根(root) 7 4 2 1 9 105 3 8 6 根から ⼀番遠い葉 までの 枝の数 = 3
  53. 53. 課題4 2 で作成した⽊を preoder, postorder, inorder, level order で巡回したときに 巡ったノードを順番にそれぞれ答えよ @おかげ横町(伊勢)(2016.10.10)
  54. 54. pre-order (⾏きがけ順) 7 4 2 1 9 105 3 8 6 根から順に, 左のノード→右のノードを 上から順⾒ていく {7, 4, 2, 1, 3, 5, 6, 9, 8, 10}
  55. 55. post-order (帰りがけ順) 7 4 2 1 9 105 3 8 6 ⼀番左の葉から 葉に近い⽅から順に ⾛査していく {1, 3, 2, 6, 5, 4, 8, 10, 9, 7}
  56. 56. in-order (通りがけ順) 7 4 2 1 9 105 3 8 6 ⼀番左の葉から 右に辿りながら ⾏き着いた順に⾛査する {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  57. 57. level-order (レベル順) 7 4 2 1 9 105 3 8 6 根から順に 同じ深さのノードを探索していく {7, 4, 9, 2, 5, 8, 10, 1, 3, 6}
  58. 58. 課題5 2 で作成した 2 分探索⽊から要素 4 を削除した。 このとき,その位置に別の要素を移動するだけで 2 分探索⽊を再構成したい。 どの要素を移動すればよいか答えよ。 @JR博多駅シティ(2016.03.15)
  59. 59. 元の⽊から要素4を削除 7 4 2 1 9 105 3 8 6
  60. 60. 元の⽊から要素4を削除 7 2 1 9 105 3 8 6
  61. 61. 持っていっても⼤丈夫そうな要素 7 2 1 9 105 3 8 6
  62. 62. 持っていっても⼤丈夫そうな要素 7 2 1 9 105 3 8 6 削除したノードの 左側の⽊(?)の最⼤のノードなら 持っていっても⼤丈夫そう
  63. 63. 持っていっても⼤丈夫そうな要素 7 2 1 9 105 3 8 6 削除したノードの 左側の⽊(?)の最⼤のノードなら 持っていっても⼤丈夫そう ⇒場所を移しても他に影響なし
  64. 64. 課題6 {8, 6, 9, 10, 7, 4, 2, 5, 1, 3} で並んでいる順番に2分探索⽊を作成したが, その⽊はバランスが悪いものであった。 作成された⽊を回転操作することでバランスの良い⽊を作れ。 @おかげ横町(伊勢)(2016.10.10)
  65. 65. {8, 6, 9, 10, 7, 4, 2, 5, 1, 3} 8 6 4 2 9 107 5 1 3
  66. 66. {8, 6, 9, 10, 7, 4, 2, 5, 1, 3} 8 6 4 2 9 107 5 1 3 左に偏っていて, 右のノードが少ない ⇒ 右に回転してみる
  67. 67. {8, 6, 9, 10, 7, 4, 2, 5, 1, 3} 8 6 4 2 9 107 5 1 3
  68. 68. {8, 6, 9, 10, 7, 4, 2, 5, 1, 3} 8 6 4 2 9 10 75 1 3 ノードの構造を 変えないように! (8, 9, 10のところとか)
  69. 69. {8, 6, 9, 10, 7, 4, 2, 5, 1, 3} 8 6 4 2 9 10 75 1 3
  70. 70. 課題7 N個のデータで構成される2分探索⽊では ⽊の深さが log2N であることが理想的であるとされる。 なぜlog2Nなのか答えよ。 @JAXA(筑波)(2016.09.04)
  71. 71. 理想的な⽊(完全⽊) 抜け落ちなく,綺麗に三⾓形を描いている2分⽊が完全⽊ (全ての葉が同じ「深さ(=2)」を持つ2分⽊)
  72. 72. ⽊の深さとノードの数の関係 深さ(d) ノードの数(N) 0 1 1 3 2 7 3 15
  73. 73. ⽊の深さとノードの数の関係 深さ(d) ノードの数(N) 0 1 1 3 2 7 3 15 ノードの数をN, 深さをdとする 𝑁 = 2$%& − 1
  74. 74. 式変形しまくる ここでNが⼗分⼤きいとすると,log2(N+1) ≈ log2N log2N -1 ≈ log2N に近似してもよい(∵log2N>>1) 𝑁 = 2$%& − 1 𝑑 ≈ log/ 𝑁 − 1 𝑑 ≈ log/ 𝑁 log/ 𝑁 + 1 = 𝑑 + 1
  75. 75. したがって… N個のデータで構成される2分探索⽊では ⽊の深さdがlog2Nであることが理想的である 𝑑 ≈ log/ 𝑁

×