データ構造と全探索

2,799 views

Published on

競技プログラミング練習会2014 Normalで使ったスライドです。データ構造とは何か、という話と基本的な全探索(深さ優先探索、幅優先探索)について扱っています。

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,799
On SlideShare
0
From Embeds
0
Number of Embeds
669
Actions
Shares
0
Downloads
6
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

データ構造と全探索

  1. 1. データ構造と全探索
  2. 2. データ構造とは ●データの集まりを効率良く扱うために一定の形 式にデータを格納するときの形式 ●それぞれのデータ構造に得意・不得意・不可能 な操作がある ●配列は最も単純なデータ構造の一つ ●添字を指定して要素にアクセスできる a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 3 1 4 1 5 9 2 6 5 3
  3. 3. 配列 ●配列の得意な操作 ●添字を指定して要素の読み書き: ●ランダムアクセスという ●先頭から順番に要素の読み書き: ●シーケンシャルアクセスという ●配列の苦手な操作 ●要素の挿入・削除: ●最大値・最小値を求める: O(1) O(1) O(n) O(n)
  4. 4. 全探索 ●コンピューターは(人間に比べて)計算が速い ●  通りくらいなら虱潰しに調べれば間に合う ●例) 3×3の魔法陣 ●3×3のマス目に1〜9の数字を一つずつ入れたものの 中で魔法陣になっている物の数を求めよ ●      通りすべてを試せば良い ●魔法陣かどうか確かめるには縦横各3列、対角線2列をそ れぞれ足す(8*3=24、9!*24 = 8709120で間に合う) 106 9!=362880
  5. 5. 全探索 ●全探索にもいろいろな方法がある ●幅優先探索 ●深さ優先探索 ●反復深化深さ優先探索
  6. 6. 全探索 ●調べる状態を木に対応させることが多い ●魔法陣の例 1 2 9…… 2 3 4… …… 3 4 …… …
  7. 7. 全探索 ●調べる状態を木に対応させることが多い
  8. 8. 深さ優先探索 ●まず一番最初の要素の子要素を全部調べてから 次に行く 1 2 11 17 3 6 9 4 5 7 8 10 13 16 1915 20 12 14 18
  9. 9. スタック ●スタックでできる操作 ●末尾に要素を追加 ●末尾の値を読み書き ●末尾の値を削除 ●積み上げられた本のイメージ ●本を積んだり取ったりするときは常に山の一番上 ●十分な長さの配列とスタックの長さを表す変数 で実現できる push pop
  10. 10. スタックで解ける問題 ●再帰函数のエミュレート、深さ優先探索 ●調べる頂点を見つかった順にスタックに積むことで 実現できる ●動的計画法の利用も検討しよう ●構文解析 ●逆ポーランド記法の数式
  11. 11. 深さ優先探索 ●まず一番最初の要素の子要素を全部調べてから 次に行く 1 2 11 17 3 6 9 4 5 7 8 10 13 16 1915 20 12 14 18
  12. 12. スタックで解ける問題 ●逆ポーランド記法(後置記法) ●式 := (式) (式) (演算子) | (数値) ●普通の式は中置記法という ●例) 中置記法 → 逆ポーランド記法 ●1 + 2 →1 2 + ●3 * 5 + 4 * 2 → 3 5 * 4 2 * +
  13. 13. スタックで解ける問題 ●逆ポーランド記法の構文解析 ●数値が出てきたらスタックに積む ●演算子が出てきたらスタックから2つ値を取り出し て演算し、その結果をスタックに積む ●最後にスタックに残った数値が計算結果
  14. 14. 幅優先探索 ●深さの浅いところから順番に調べていく 1 2 3 4 5 6 7 11 12 13 14 15 16 18 1917 20 8 9 10
  15. 15. キュー ●キューでできる操作 ●末尾に要素を追加 ●先頭の要素を読み書き ●先頭の要素を削除 ●レジの行列のイメージ ●先に並んだ人が先に抜ける push pop
  16. 16. キューで解ける問題 ●幅優先探索 ●調べる頂点を見つかった順にキューに入れることで 実現できる
  17. 17. 幅優先探索 ●深さの浅いところから順番に調べていく 1 2 3 4 5 6 7 11 12 13 14 15 16 18 1917 20 8 9 10
  18. 18. プライオリティーキュー ●キューに積んだ順番でなく、それぞれの要素に ついている優先度の大きさの順に出てくる キュー ●今日は詳しくはやりません
  19. 19. C++におけるスタックとキュー ●スタック ●#include <stack> ●std::stack<T> s; ●キュー ●#include <queue> ●std::queue<T> q; ●std::priority_queue<T>;

×