PJ-Build Class: Data Structure2

783718ebd2faaa896d4cb347835c07fb?s=47 tarotaro0
August 06, 2020

PJ-Build Class: Data Structure2

This is a class material related to PJ-Build.
This class's main target is a programming beginner and Japanese.

783718ebd2faaa896d4cb347835c07fb?s=128

tarotaro0

August 06, 2020
Tweet

Transcript

  1. Data Structure 2 PJ-Build Week3

  2. Hash Table Contents Tree Graph Group Work 02 03 04

    01
  3. Goal Not Goal: • 各データ構造の基礎 • 具体的な実装方法やハンズオン 質問は積極的にしましょう! (生徒同士で議論し合えたり、優しいメンターが教えてくれたりします) 各データ構造の特性を理解し、設計の議論が出来るようになること

  4. 1. Hash Table

  5. Hash Table ってなに? • keyとそれに対応するvalueのペ アの集合 • 言語ごとに呼び方は様々 ◦ Dictionary

    ◦ Hash Table ◦ Hash Map ◦ (Hash Set) Key Value hide Git hunter データ構造1 tarotaro0 データ構造2 wakanapo アルゴリズム ... ... 講師-内容のペア
  6. • 内部で使われているのは配列 • 配列:数値のIndexを頼りに値を 取得する ◦ array[0], array[100],... • Hash

    Table:与えられたkeyを ハッシュ関数によって数値に変換 してIndexとする配列のようなもの ◦ hash[“john”], hash[“sam”] Hash Table の内部構造 from wikipedia
  7. ハッシュ関数 from wikipedia • 任意のkeyを入力 • 同じkeyを入力したら、一意に Indexが定まる関数を用いる ◦ Indexにアクセス出来なくなってし

    まう • 配列のサイズに合わせたIndexを 出力 ◦ 配列の要素数を素数にするケー スが多い • Indexが被ったらどうする...?
  8. • 配列の要素数には限りがあるの で、Indexが衝突するケースがあ る • 配列の要素を連結リストにするこ とで解決 ◦ 同じIndexでもリストを辿れば見 つけられる

    • (adv) 空いてるIndexを探して埋 める方法もある: Open Addressing (Advance) Indexの衝突 from hunter
  9. Hash Tableの良いところ • 探索が非常に効率的 ◦ 要素数がNの時、値の探索 速度が約1/N倍 • 値の追加・削除が簡単 例:”tarotaro0”の講義は何か探し

    たい 0 hide Git 1 hunter DS1 2 tarotaro0 DS2 3 wakana Alg ・・・ ・配列 順番に走査しないといけない ... ・Hash Table hide Git hunter DS1 tarotaro0 DS2 wakana Alg ・・・ keyだけでIndexが分かる!
  10. どんなところで使われてると思いますか?

  11. Hash Tableの使用例 ~Cache~ • CDN • DBキャッシュ DB Application Cache ①

    Cacheがあるか確認 Key: “SELECT * FROM table …”, “select-table-xxx”, …. ② あったら返す 無かったらDBへ ③ 問い合わせ xxx.com/yyy の結果をキャッシュ
  12. Hash Tableの使用例 ~Key-Value Store~ • NoSQLの一種 ◦ Not only SQL

    • Example ◦ Memcached ◦ Redis ◦ AWS DynamoDB • SQLよりも明確なKeyで検索する用 途が多い場合に選択 ID Name Week Class 0 hide 1 Git 1 tarotaro0 3 DS2 Key Value hide Week: 1 Class: Git tarotaro0 Week: 3 Class: DS2 RDBMS Key-Value Store
  13. 2. Tree

  14. • 1個以上のノード(節点)によって構 成されるデータ構造 • 各ノードは0個以上の子ノードを 持っている • 子は唯一の親を持つ • 親子関係の事をエッジと言う

    • 特別なノード ◦ 根:親がない ◦ 葉:子がない Tree ってなに? from wikipedia : ノード : エッジ 根(root) 葉(leaf)
  15. • 二分木 ◦ 子の数が高々2つの木 色んな Tree • 二分探索木 ◦ 左の子<親<右の子な二分木

  16. • ヒープ木 ◦ 親子の大小が一律 (Advance) 色んな Tree • 赤黒木 ◦

    赤黒で色分けされた二分探索木
  17. • 階層構造の表現 • 分岐のある構造の表現 • 人間にとって解釈しやすい • データを整理しやすい Tree の良いところ

    Mercari Mercari JP Mercari US Merpay Holdings Product
  18. どんなところで使われてると思いますか?

  19. • lsd コマンド ◦ https://github.com/Peltoche/lsd • --tree オプション • alias

    ls=’lsd’ オススメ ◦ カラフルになる Tree の使用例 ~フォルダ(ディレクトリ)~
  20. • Document Object Model • DOMツリー:HTMLやXMLの各 ObjectをTreeで表現したもの • Treeとして扱うことで各Objectに対す る操作・解釈がしやすい

    Tree の使用例 ~Webページ / DOMツリー~ html head body meta script h1 div p div
  21. Tree の使用例 ~メルカリ / カテゴリ~ 大 中 小 レディース メンズ その他

    トップス アウター スカート 靴 バッグ スーツ Tシャツ ブラウス パーカー ベスト ポンチョ コート ミニ ひざ丈 ロング サンダル ブーツ モカシン ビジネス ボストン リュック ジャケット ベスト スラックス
  22. • MySQL等の有名DBでも使われ ているインデックスのデータ構造 • ディスク読み込み回数を出来るだ け減らしつつ効率的な検索を行え る • B+木やB*木のような亜種もある Tree

    の使用例 ~DB Index / B-Tree~
  23. 3. Graph

  24. • 1つ以上のノードと0個以上のエッ ジの集合 • TreeはGraphの一部 ◦ 紹介したTreeは、正確には有向 根付き木 • 隣接リスト・隣接行列の2通りで表

    現される ◦ 隣接リスト:ノードが隣接ノードの リストを持つ ◦ 隣接行列:グラフ全体を行列で定 義する Graph ってなに? 隣接リスト 1 2 3 4 1 0 1 1 0 2 1 0 1 0 3 1 1 0 1 4 0 0 1 0 隣接行列
  25. • 有向/無向グラフ • 重み付きグラフ • 単純/多重グラフ • 正則グラフ • 連結グラフ

    • 巡回グラフ • オイラーグラフ • ハミルトングラフ 色んな Graph
  26. 色んな Graph ~有向/無向グラフ~ 無向グラフ 有向グラフ

  27. • エッジに重みが付く • 重みをコストと言うこともある ◦ 移動コスト • 物理的な距離や時間などの 情報を重さとしてエッジに加え る事が出来る

    • (Adv)ダイクストラ法 色んな Graph ~重み付きグラフ~
  28. • ノード同士の関係性の表現 • Treeは階層(親子)を表現しやすいの に対し、グラフはより広範な関係性を 定義出来る Graph の良いところ メルカリのマイクロサービス ref:https://tech.mercari.com/entry/2019/12/01/microservic

    es-migration-progress
  29. どんなところで使われてると思いますか?

  30. • 構造:無向グラフ ◦ ノード:人 ◦ エッジ:友達関係 • TwitterとかInstagramとかはフォロー をエッジとした有向グラフ Graph

    の使用例 ~Facebookの友達関係~
  31. Graph の使用例 ~PageRankアルゴリズム~ • Google検索で用いられている アルゴリズム • 構造:有向グラフ ◦ ノード:ウェブページ ◦

    エッジ:リンク • 基本的な考え方 ◦ 被リンクが多いサイトは良い ◦ 良いサイトからのリンクは良い
  32. • 構造:重み付きグラフ ◦ ノード:駅 ◦ エッジ:線路 ◦ 重み:所要時間・運賃等 • 2駅間の最短経路や最安経路を解い

    た結果が乗換案内アプリ • バスや飛行機なども同様 Graph の使用例 ~鉄道路線~
  33. • NoSQLの一種 • 各ノードと各エッジがそれぞれObject ◦ ノード:属性を持つ ◦ エッジ:ノードを指定して、関係を定 義する •

    例 ◦ Neo4j ◦ Amazon Neptune Graph の使用例 ~グラフ型データベース~ Person Name: taro Person Name: jiro Game Name: Switch Game Name: PS4 FRIEND FRIEND HAVE HAVE HAVE ノード:Person, Game エッジ:(Person→Person) FRIEND (Person→Game) HAVE
  34. Break(10mくらい)

  35. 4. Group Work

  36. 「Cウイルスの感染経路を特定しよう」 • 条件 ◦ Cウイルスは感染者と接触した人に一定確率で感染する ◦ 過去の感染者のリストと、その感染者が接触した人、更に再帰的に接触した人のリ ストは分かっている • 問題

    ◦ ある新規感染者Xの感染経路を特定するシステムを考えて下さい ◦ より現実的に考えて、様々なパターンを想像してみて下さい ◦ 考える上で必要な条件は自由に追加して構いません Group Work
  37. • 発表はGoogle Hangoutで行います • 代表者を決めて、画面共有or資料を送って共有して発表して下さい ◦ 気持ちが伝わる程度のラフさで OK • 内容

    ◦ 考えたシステム ◦ 設計理由 ◦ こだわりポイント ◦ etc... 発表
  38. 発表

  39. • データ構造 ◦ 人をノード、接触をエッジとする無向グラ フ ◦ ノード: Person ▪ 接触関係の配列:

    contacts ▪ 感染者かどうか: infected ▪ 探索済みかどうか: marked ◦ エッジ: Contact ▪ N密: weight ▪ 接触者: people 解答例 Contact ・weight: int ・people: Person[] Person ・contacts: Contact[] ・infected: boolean ・marked: boolean X D E B A G I H F J C 3 3 1 2 3 2 2 0 1 3 0
  40. • アルゴリズム ◦ Xに隣接する未探索のノードを、エッジ の重みを優先度とした優先度付き キューに入れる ◦ 優先度の高いものから取り出し以下の 操作を行う ▪

    markedをtrueにする ▪ infected=true → 終了 ▪ falseならそのノードから更に探索を開 始する 解答例 X D E B A G I H F J C 3 3 1 2 3 2 2 0 1 3 0 Person ・contacts: Contact[] ・infected: boolean ・marked: boolean Contact ・weight: int ・person: Person
  41. • データ構造の設計は難しい ◦ 現実の問題は複雑で、様々な設計が出来る ◦ 各データ構造の特性を知り、トレードオフを理解しながら設計を議論するのが大事 (そして楽しい) ◦ 何故そのデータ構造なのか説明出来るようになれば一人前 •

    データ構造はアルゴリズムと深く関係する ◦ データ構造が決まればアルゴリズムが決まることが多い ◦ 来週のアルゴリズムの講義が楽しみですね! Group Work まとめ
  42. Home Work

  43. • CLI(Command Line Interface)で実 行できる英和辞書プログラムを作 ろう! • 提出 ◦ /HomeWork/Week3/{名前}

    ◦ 実行出来るプログラムと説明を書い たREADMEをpush ◦ README ▪ 実行方法 ▪ 考えたこと ▪ こだわりポイント $ go run dictionary.go search Loading… Input search word: tarotaro0 tarotaro0 はweek3のインスト ラクターです! Input search word: aaaaa aaaaa は登録されてません Input search word: Thank you $ Home Work
  44. • 大体2時間〜くらいで無理しない範囲で • 単語と意味のペアを用意しています ◦ /HomeWork/Week3/dataset/words.txt ◦ これを自分のディレクトリにコピーして使って下さい • 言語や仕様は自由

    ◦ 言語ごとにbuilt-inで使えるAPI等は使ってOK ◦ OSSライブラリ等も使っていいが、使いすぎると課題の意味が無いのであまりオス スメはしません Home Work
  45. • どういう機能が考えられる?(下はあくまで例です) ◦ 検索 ▪ 【Easy】完全一致検索 (“man” → “man: 人”)

    ← まずココ ▪ 【Hard】前方一致検索 (“man” → “man”, “many”, …) ◦ 単語の操作 ▪ 【Normal】追加 ▪ 【Normal】更新 ▪ 【Normal】削除 ◦ 【???】オリジナル機能 Home Work
  46. お疲れさまでした! (このスライドは公開します)

  47. Home Work 解答例

  48. Key Value @ 単価…で/…につき 104 通信で用いられる『了解』の 意を表す語 A answer /

    ampere a. about / acre[s] / adjective ... ... • データセットの単語-意味ペアをHash Tableに格納 • 検索ワードをkeyとしてHash Tableに 問い合わせ • Valueを返す 解答例 ~完全一致検索~ dataset Hash Table
  49. • データセットの単語-意味ペアをTrie Treeに格納 • 1文字ずつ入力を受ける • 出力 ◦ マッチしたノードの意味 ◦

    子ノードの一覧 解答例 ~前方一致検索~ Trie Tree(トライ木)
  50. • データ構造に依存 ◦ Hash Table: keyの追加・削除 & valueの変更 ◦ Tree:

    ノードの追加・削除 & 情報の変更 • 変更は永続的or一時的 ◦ 一時的: 使ってるデータ構造のみ変更すれば OK ◦ 永続的: 参照しているデータセット自体を変更しないといけない 解答例 ~単語の操作~
  51. • 関連ワード ◦ 関連ワードをGraphで表現 ◦ Hash TableのValueをGraphのノー ドにする ◦ 検索単語の意味と関連ワードを同時

    に出力 ◦ 関連の定義が難しい ▪ WordNetという同義語を定義した データセット 解答例 ~オリジナル機能~ Key Value @ • 104 • A • a. • ... • @ w1 w2 w2
  52. • もしかして:機能 ◦ 単語をタイポした時に1文字違いの 単語をサジェストする ◦ 予めtypo用のデータ構造を作って おく ◦ もしくは、入力単語ごとに1文字変

    えた単語が辞書にあるか算出 解答例 ~オリジナル機能~ もしかして? • “w”が違う: bird / gird • “i”が違う: ward / word • “r”が違う: wild / wind • “d”が違う: wire / wiry Search: “wird”