Slide 1

Slide 1 text

SPLから始める「データ構造」入門 PHPカンファレンス福岡2024 Hideki Kinjyo GitHub: o0h / X: @o0h_ [公開用]

Slide 2

Slide 2 text

こんな事を話します・こんな疑問に答えていきます • SPLって何?聞いたこと無いな・・ 
 => かる〜く説明します(スライド1枚程度) • データ構造ってなんじゃいな? 
 => どんな存在なのか、知るチャンスになるはず!

Slide 3

Slide 3 text

こんな人に向けて話します • アルゴリズムとか計算量とか難しいよね、苦手・怖い・・ 
 => そんな人にこそお届けしたい! • PHPのプログラミング上手くなりたい、コードを読みやすくしたい 
 => ちょっとしたヒントになるかも?視点を提供します

Slide 4

Slide 4 text

自己紹介 • 金城秀樹 / きんじょうひでき • GitHub: @o0h / 𝕏 : @o0h_ • 好きなFWはCakePHP • アイコンは美味しい鮭親子丼の写真です • 初めて参加したカンファレンスは#phpconfuk.2017 • Thanks #phpconfuk !!

Slide 5

Slide 5 text

今回の話は、こういう「構造」ではなく 

Slide 6

Slide 6 text

こういうのです!  https://visualgo.net https://ja.wikipedia.org/wiki/データ構造

Slide 7

Slide 7 text

データ構造? • データをメモリー上で配置・表現する際の形式 
 (鈴木 一史『データ構造の基礎 (放送大学教材 6784) 』) • 通常データへの効率的なアクセスのため用いられるデータ構成と保存形式 
 (https://en.wikipedia.org/wiki/Data_structure Wikipedia英語版「データ構造」をDeepLにより翻訳) • コンピューターがデータ処理や計算を行う際に、あらかじめデータを扱い やすいように加工しておき、計算速度が速くなるようにする、というもの 
 (https://research.nii.ac.jp/~uno/struct.htm 宇野毅明先生のホームページ「データ構造」のページ)

Slide 8

Slide 8 text

データ構造? プログラムは、 
 決して「論理の世界」のものではなく 「物理・電気」の上で動かされるもの

Slide 9

Slide 9 text

データ構造? プログラムの動作性能を高めるために、 
 「メモリ上の配置」「読み書きの数」が無視できない ⇓ そこで出てくるのが、 
 「アルゴリズム」や「データ構造」

Slide 10

Slide 10 text

データ構造? 「こういうデータ(の集まり)」は、 
 「メモリ上にはこういう風に並べて置こう」 
 が効いてくる ⇓ これをやっていくのがデータ構造の世界

Slide 11

Slide 11 text

この発表の目論見 / What 聴いているみなさんが、 
 データ構造について「ふ〜ん」ってなる! ⇓ あわよくば、ちょっと「知りたい」と興味を持つ!

Slide 12

Slide 12 text

この発表の試み / How 「計算量」の側面以外から、 
 データ構造についての便利・面白さを伝える

Slide 13

Slide 13 text

おしながき 1.データ構造って何者だ? 2.生活の中にみるデータ構造 3.データ構造(一般)の話・頻出構造 4.SPL > データ構造 5.締め会 

Slide 14

Slide 14 text

1. データ構造って何者だ? 2. 生活の中にみるデータ構造 3. データ構造(一般)の話・頻出構造 4. SPL > データ構造 5. 締め会

Slide 15

Slide 15 text

データ構造・・・って何をするんだ?

Slide 16

Slide 16 text

データ構造・・・って何をするんだ? 機能 データ構造 形状 構造は単なる「形」ではない。 何かしらの機能や質をもち、 
 「その形である意味」がある

Slide 17

Slide 17 text

データ構造・・・って何をするんだ? 機能 データ構造 形状 課題 動機・目的

Slide 18

Slide 18 text

データ構造・・・って何をするんだ? 機能 データ構造 形状 課題 ここを学習すると・・

Slide 19

Slide 19 text

データ構造・・・って何をするんだ? 機能 データ構造 形状 課題 形状から 
 課題を 
 想起するように

Slide 20

Slide 20 text

形状から課題が想起される • 「何をするか」が分かるはず • どんなタスクをこなしたいか • どんな特性を持っているか • どう使うのが適切か

Slide 21

Slide 21 text

つまり何が嬉しい? コードの中に上手く現れる「◯◯構造」は、 
 ソレだけで「何をしたいのか」のヒントに

Slide 22

Slide 22 text

形状から課題が想起される、一方で・・ • 形状自体に機能はない • 物理制約の範疇で、活用できる • 「本来の用途」と合致せずとも可

Slide 23

Slide 23 text

形状から課題が想起される、一方で・・ • ただし、適切な用途は存在する • 目的(=意味)があり、機能を提供す るのに即した形状となっている • 不適切に当てはめると、「無理」 「違和感」につながったり、無駄 なコストが発生することも 見て! それって、何か変くね??

Slide 24

Slide 24 text

つまり何が悲しい? より良い「構造」を知らないがゆえに、 
 決してベターではない問題解決を誘発してしまう

Slide 25

Slide 25 text

データ構造・・・って何を提供しているんだ?

Slide 26

Slide 26 text

プログラミングにおける構造の価値 プログラムの仕事(目的)は 
 「データを良い感じにする」

Slide 27

Slide 27 text

プログラミングにおける構造の価値 プログラムの仕事(目的)は 
 「データを良い感じにする」 入れる・取り出す 加工する

Slide 28

Slide 28 text

計算がんばる プログラムの仕事(目的)は 
 「データを良い感じにする」 入れる・取り出す 加工する プログラミングにおける構造の価値 入れる・取り出す データ構造はココを良い感じにする

Slide 29

Slide 29 text

データ構造 良い感じにする・・・ってどうやって? 実装 名前 API

Slide 30

Slide 30 text

データ構造 良い感じにする・・・ってどうやって? 実装 名前 API どんな操作を 
 提供するか/しないか メモリの使い方etc 型(Class、Interface) 
 デザインパターン

Slide 31

Slide 31 text

データ構造 良い感じにする・・・ってどうやって? 実装 名前 API どんな操作を 
 提供するか/しないか メモリの使い方etc 型(Class、Interface) 
 デザインパターン ここの話は今日はナシ

Slide 32

Slide 32 text

1. データ構造って何者だ? 2. 生活の中にみるデータ構造 3. データ構造(一般)の話・頻出構造 4. SPL > データ構造 5. 締め会

Slide 33

Slide 33 text

データ構造 データ構造の構造 実装 名前 API どんな操作を 
 提供するか/しないか メモリの使い方etc 型(Class、Interface) 
 デザインパターン

Slide 34

Slide 34 text

データ構造 データ構造の構造 実装 名前 API どんな操作を 
 提供するか/しないか メモリの使い方etc 型(Class、Interface) 
 デザインパターン まずはコチラの話から 
 (形状→操作→機能)

Slide 35

Slide 35 text

どんな構造・どんな機能?の話 データ構造 = 複数の要素を扱うためのもの

Slide 36

Slide 36 text

どんな構造・どんな機能?の話 良いデータ構造 = 入れやすい 出しやすい

Slide 37

Slide 37 text

どんな構造・どんな機能?の話 良いデータ構造 = (使いやすいように)入れやすい (欲しいものを)出しやすい

Slide 38

Slide 38 text

みなさん「つまり・・どういうこと??」 わたくし「ちょっと待ってね」

Slide 39

Slide 39 text

日常生活の中にあるデータ構造

Slide 40

Slide 40 text

販売窓口 • 要素は自由に追加できる • 最初に追加された要素から順 番に処理(取り出す)をする • 関連ワード: 先入れ先出し

Slide 41

Slide 41 text

病院の受付(会計) • 名前付き要素を任意の時点で取 り出す • 順番は臨機応変に決定される • 要素の追加(受付)時に、呼び出 し方が付与された状態で保存さ れる • 関連ワード: ランダムアクセス

Slide 42

Slide 42 text

次々と発生するミッション • 要素が柔軟に追加される • 要素同士には順番関係がある • 最後に追加された要素から順 番に処理(取り出す)をする • 関連ワード: 後入れ先出し この商品ください!! 購入には会員登録が 
 必要です メールアドレスを 
 認証してください 受信メールを 
 確認してください

Slide 43

Slide 43 text

計画的なミッション • 要素が柔軟に追加される • 要素は全体の計画に従って順 番を設定される • 設定された順番に従って処理 (取り出す)をする • 関連ワード: 優先度付け ΋͠࢓ࣄʹߦ͖ͨ͘ͳ͘ͳͬͨΒɺͦͷ··൓ରͷిंʹ৐ͬͯɺ ւΛݟʹߦ͘ͱ͍͍Αɻ ւลͷञ԰ͰϏʔϧͱϐʔφπങͬͯɺւ؛ʹ࠲ͬͯ ཅʹ౰ͨΓͳ͕ΒҿΉͱ͍͍Αɻ Ϗʔϧ͕ແ͘ͳͬͨΒɺͦͷ··ڼ޲͚ʹ৸͜ΖΜͰɺ ྲྀΕΔӢΛͣͬͱோΊΔͱ͍͍Αɻ ͦΜͳԺ΍͔ͳ͕࣌ؒΩϛΛ଴ͬͯΔͷʹɺԿ΋ແཧͯ͠ ࢓ࣄʹͳΜ͔ߦ͘ඞཁͳ͍Αɻ 反対の電車に乗って 海を見に行って 海辺の酒屋で ビールとピーナツ買って 海岸に座って

Slide 44

Slide 44 text

「課題」に応じた構造を選択している ⇓ 不似合いな構造だとどうなる?

Slide 45

Slide 45 text

もし、この「箱」が 
 「入れた順に取り出す」つくり 
 だったら・・? ΋͠࢓ࣄʹߦ͖ͨ͘ͳ͘ͳͬͨΒɺͦͷ··൓ରͷిंʹ৐ͬͯɺ ւΛݟʹߦ͘ͱ͍͍Αɻ ւลͷञ԰ͰϏʔϧͱϐʔφπങͬͯɺւ؛ʹ࠲ͬͯ ཅʹ౰ͨΓͳ͕ΒҿΉͱ͍͍Αɻ Ϗʔϧ͕ແ͘ͳͬͨΒɺͦͷ··ڼ޲͚ʹ৸͜ΖΜͰɺ ྲྀΕΔӢΛͣͬͱோΊΔͱ͍͍Αɻ ͦΜͳԺ΍͔ͳ͕࣌ؒΩϛΛ଴ͬͯΔͷʹɺԿ΋ແཧͯ͠ ࢓ࣄʹͳΜ͔ߦ͘ඞཁͳ͍Αɻ 反対の電車に乗って 海を見に行って 海辺の酒屋で ビールとピーナツ買って 海岸に座って

Slide 46

Slide 46 text

• 思いついた順に入れました 1. 違う電車に乗ってみよう 2. それで海の近くの駅まで行こう 3. 海岸に座って酒でも飲もう 4. ビールとつまみでも買うか 5. 行く途中に店を探そう 6. ちょっと飲んだら、仰向けに寝 ころんで・・・

Slide 47

Slide 47 text

ラウンド1 • 電車に乗る 1. 違う電車に乗ってみよう 2. それで海の近くの駅まで行こう 3. 海岸に座って酒でも飲もう 4. ビールとつまみでも買うか 5. 行く途中に店を探そう 6. ちょっと飲んだら、仰向けに寝 ころんで・・・

Slide 48

Slide 48 text

ラウンド2 • 海の最寄り駅まで行く 1. それで海の近くの駅まで行こう 2. 海岸に座って酒でも飲もう 3. ビールとつまみでも買うか 4. 行く途中に店を探そう 5. ちょっと飲んだら、仰向けに寝 ころんで・・・

Slide 49

Slide 49 text

ラウンド3 • 酒・・・え、持ってないね? • => スキップ 1. 海岸に座って酒でも飲もう 2. ビールとつまみでも買うか 3. 行く途中に店を探そう 4. ちょっと飲んだら、仰向けに寝 ころんで・・・

Slide 50

Slide 50 text

ラウンド3.1 • 買おう、といっても 
 まだ店じゃないぞ • => スキップ 1. 海岸に座って酒でも飲もう 2. ビールとつまみでも買うか 3. 行く途中に店を探そう 4. ちょっと飲んだら、仰向けに寝 ころんで・・・

Slide 51

Slide 51 text

ラウンド3.2 • まずは店を探さないとな 1. 海岸に座って酒でも飲もう 2. ビールとつまみでも買うか 3. 行く途中に店を探そう 4. ちょっと飲んだら、仰向けに寝 ころんで・・・

Slide 52

Slide 52 text

ラウンド4 • 1に戻る 1. 海岸に座って酒でも飲もう 2. ビールとつまみでも買うか 3. ちょっと飲んだら、仰向けに寝 ころんで・・・

Slide 53

Slide 53 text

ラウンド4.1 • まだ・・ • スキップ 1. 海岸に座って酒でも飲もう 2. ビールとつまみでも買うか 3. ちょっと飲んだら、仰向けに寝 ころんで・・・

Slide 54

Slide 54 text

ラウンド4.2 • お店でやりたかったのは 
 コレ! 1. 海岸に座って酒でも飲もう 2. ビールとつまみでも買うか 3. ちょっと飲んだら、仰向けに寝 ころんで・・・

Slide 55

Slide 55 text

ラウンド4.2 
 〜スキップしすぎで今何してるか忘れそう〜

Slide 56

Slide 56 text

不似合いな構造は使い勝手が悪い 「煩雑な処理」「直感的でないコード」 ⇓ 本質に辿り着きづらい、 
 読み手に優しくないコード

Slide 57

Slide 57 text

• 「入れた順」とは別に、 
 「意味的な順番」を扱える構 造を用いる • 「次の要素を取り出す」とい う操作だけで、工夫や計算を せずとも即座に活用し得るも のがでてくる 1) 違う電車に乗ってみよう 2) それで海の近くの駅まで行こう 5) 海岸に座って酒でも飲もう 4) ビールとつまみでも買うか 3) 行く途中に店を探そう 6) ちょっと飲んだら、仰向けに寝 ころんで・・・

Slide 58

Slide 58 text

• 逆に言えば、 
 この「要素に順番が付いてい る箱」を見た時に、 
 「入れた順が重要である」 
 「入れた順に先に取り出しな がら使う」 
 という誤解は起きにくいはず 1) 違う電車に乗ってみよう 2) それで海の近くの駅まで行こう 5) 海岸に座って酒でも飲もう 4) ビールとつまみでも買うか 3) 行く途中に店を探そう 6) ちょっと飲んだら、仰向けに寝 ころんで・・・

Slide 59

Slide 59 text

適切な構造は扱い易さを生む 「簡潔な処理」「直感的なコード」 ⇓ 本質を示し、それ以外を除外する 
 読み手を支援するコード

Slide 60

Slide 60 text

1. データ構造って何者だ? 2. 生活の中にみるデータ構造 3. データ構造(一般)の話・頻出構造 4. SPL > データ構造 5. 締め会

Slide 61

Slide 61 text

データ構造 良い感じにする・・・ってどうやって? 実装 名前 API どんな操作を 
 提供するか/しないか メモリの使い方etc 型(Class、Interface) 
 デザインパターン 次はコチラの話を

Slide 62

Slide 62 text

名前重要 ⇓ 「何をしたいのか」に「何をするのか」を合致させる 
 && 
 「何をするのか」に「何であるのか」を合致させる ここが名前

Slide 63

Slide 63 text

• 「形状」から、使い方が補完 的に理解(想起)される • 例: 受け付け+その正面に整列し ているソファーという形状 1. 何かしらの手続きをする 2. 名前、もしくは受付番号の付 与を受ける 3. 適切な処理順の決定のあと に、その`id(キー)`にて呼び 出される

Slide 64

Slide 64 text

• 概念の抽出・凝集をして 
 ラベルを付けたのが「名前」 • 名前には、形状と同様に 
 「機能」とそこから派生して 「用途」を想起させる効果が ある 待合室

Slide 65

Slide 65 text

よく出てくるデータ構造 ※ SPLと関連付けて

Slide 66

Slide 66 text

連結リスト • 「端から順番に辿る」に強い • 最初の要素を取り出して、その次の要素を取り出して・・ • 要素の追加や削除に強い • 決め打ちでの選択に弱い • 「4番目を取り出して」が苦手 自由自在に繋ぐ形なので 
 いじりやすい・手繰りやすい

Slide 67

Slide 67 text

スタック/キュー • 先頭の操作・末尾の操作(取り出し・削除)に強い • スタックは「末尾に追加・取り出し・削除」 • 「次々と発生するミッション」はスタック • キューは「末尾に追加、先頭から取り出 し・削除」 • 「販売窓口」はキュー 「次の1個を足す・取り出す」のに 
 全振りする感じで

Slide 68

Slide 68 text

配列(固定長) • 決め打ちでの選択に強い • 要素の変更操作(追加・削除)に弱い • 要素数の上限を超えた追加は受け付けない サイズや内容を 
 予め決定できるものと相性が良い

Slide 69

Slide 69 text

• 最大ないし最小の要素の取得に強い • 同じく、大きい順・小さい順の整列に強い • 優先度付きキューは、ヒープ構造で実現されることが多い(他でも可) • 決め打ちでの選択・削除に弱い • 「計画的なミッション」は 
 優先度付きキュー ヒープ/優先度付きキュー 意味のある順番を重視して 
 整合性を維持し続ける

Slide 70

Slide 70 text

BREAKING NEWS!!! みなさんがよく見るやつ、一応貼っておきますね^^ 

Slide 71

Slide 71 text

1. データ構造って何者だ? 2. 生活の中にみるデータ構造 3. データ構造(一般)の話・頻出構造 4. SPL > データ構造 5. 締め会

Slide 72

Slide 72 text

SPLとは • https://php.net/spl • プログラミングにおける「よく出てくる問題」を 
 いい感じにやっていくクラスやインターフェイス、関数が入っている • オートロードとか、例外の分類とか、イテレータ周りの強化とかとか • PHPの標準としてついてくるので、意識しなくてもそのまま使える • この中でデータ構造についても提供されている

Slide 73

Slide 73 text

SPL > データ構造 配列 SplFixedArray セット マップ SplObjectStorage ヒープ SplMaxHeap SplHeap SplPriorityQueue SplMinHeap 連結リスト SplStack SplDoublyLinkedList SplQueue • https://php.net/spl.datastructures • 4カテゴリ、9クラスが提供されている • このうち、SplHeapは抽象クラス

Slide 74

Slide 74 text

これらの利用で 
 「コードの記述がいかに簡潔になるか」 
 「どんな面白い処理ができるか」 
 を見ていきます

Slide 75

Slide 75 text

各SPLデータ構造の解説と実例 〜"便利さ"推しでいこ!〜

Slide 76

Slide 76 text

連結リスト系 • 任意の要素を付け足す・取り出すのに強み • SplDoublyLinkedListは取り出し順についてのモードを持つ • 要素を取り出す際に、先頭から出すか?末尾から出すか? • SplStack、SplQueueはモードの違う子クラス • SplStack: スタック=後入れ先出し • SplQueue: キュー=先入れ先出し 連結リスト SplStack SplDoublyLinkedList SplQueue

Slide 77

Slide 77 text

お題 データを1個ずつ、 
 入れた順番に取り出して、 
 取り出したものは削除したい!

Slide 78

Slide 78 text

arrayによる実装 • array_push + 
 array_shiftで簡単 出力結果

Slide 79

Slide 79 text

SplQueueによる実装 • enqueue + dequeue 
 で実現 • shift, pushの 
 エイリアス • $data[] = $itemでも 同じ

Slide 80

Slide 80 text

• 「キュー」 
 「エンキュー」 
 「デキュー」 
 という言葉、「どう いう操作を想定した データか」の側面が 際立ちません?

Slide 81

Slide 81 text

• 他にも、 「IteratorMode」を 変更すると 
 「foreachで順番が来 た要素を自動削除」 する機能も • 未処理件数の把握や、 誤った二重処理の防止 に便利 出力結果

Slide 82

Slide 82 text

[余談]この発表のス コープ外ですが… 
 追加・取り出し削除 すると、 
 取り出しのコストが 大きく変わる

Slide 83

Slide 83 text

お題 データを1個ずつ、 
 入れた順番と逆順に取り出したい!

Slide 84

Slide 84 text

arrayによる実装 • array_push + 
 array_reverseで簡単 出力結果

Slide 85

Slide 85 text

SplStackによる実装 • pushによる実装 • $data[] = $itemでも 同じ

Slide 86

Slide 86 text

• QueueとStackは、 
 何も考えずとも順番 が入れ替わることに なる • これまた誤った使い方 を防いでくれるはず?

Slide 87

Slide 87 text

ヒープ系 • 比較条件を指定し、正しい順序を保持し続けるのに有効 • 抽象クラスであるSplHeapと、その具象SplMaxHeap/SplMinHeapがある • 似た目的で利用されるSplPriorityQueueもある ヒープ SplMaxHeap SplHeap SplPriorityQueue SplMinHeap

Slide 88

Slide 88 text

お題 データを小さい順に取り出したい!

Slide 89

Slide 89 text

arrayによる実装 • array_push + 
 sortで簡単 出力結果

Slide 90

Slide 90 text

SplMinHeapによる実装 • insert()のみで実現 • データの並べかえを意 識する必要が無くなる • 「小さいデータから欲 しい」という場面で、 安心して利用できる

Slide 91

Slide 91 text

お題 データを希望通りの位置に入れたい、 
 順番に取り出したい! 〜敵キャラを攻略順に並べてみる〜

Slide 92

Slide 92 text

arrayによる実装 • 同位置のデータにも 対応できるように、 良い感じにkeyを生 成 + ksortで実現 出力結果

Slide 93

Slide 93 text

SplPriorityQueue 
 による実装 • insert()のみで実現 • 挿入したいデータと、 優先度(大きい順)を引 数に渡せば並び替えて くれる • 今回は「出番」と「優 先度」が逆になるの で、`-1 * $deban` を渡している

Slide 94

Slide 94 text

配列(固定長配列)系 • あらかじめサイズを指定して、それ以上は入らないようにできる • 添字配列(0以上のint)でのみ利用可能で、 
 stringをキーにした要素の追加・アクセスはできない 配列 SplFixedArray

Slide 95

Slide 95 text

お題 サイズ上限を設定した 
 コレクションを作りたい!

Slide 96

Slide 96 text

arrayによる実装 • 要素の追加前に、 
 既存のサイズを確認 して上限に達してい たら拒否する 出力結果

Slide 97

Slide 97 text

SplFixedArray 
 による実装 • 初期化時に 
 サイズを指定 • 決めたサイズを超えた 操作を行うと、例外が throwされる • 抽象的にいえば、 
 生成者に「どう使われ て良いか」の判断を委 ねることで、使用者の 責任から分離される

Slide 98

Slide 98 text

セット・マップ系 • セット: 
 重複したオブジェクトが存在しない集合を作れる • マップ: 
 オブジェクトをキーとした{key=>value}を作れる セット マップ SplObjectStorage

Slide 99

Slide 99 text

お題 同一オブジェクトが 
 同時に存在しない世界をつくりたい! (SingletonとかObjectPoolにも便利)

Slide 100

Slide 100 text

arrayによる実装 • spl_object_idをキー にした連想配列で実 現 出力結果

Slide 101

Slide 101 text

SplObjectStorage 
 による実装 • attach()のみで実現 • キーとなるハッシュの 自力生成や、重複判定 を行う手間がない

Slide 102

Slide 102 text

1. データ構造って何者だ? 2. 生活の中にみるデータ構造 3. データ構造(一般)の話・頻出構造 4. SPL > データ構造 5. 締め会

Slide 103

Slide 103 text

データ構造とは何だったのか データ構造は、 
 効率的なコードを実現するための 
 強力な手段。

Slide 104

Slide 104 text

データ構造とは何だったのか 解きたい課題があり、 
 それに対しての「機能美」たる形状のアイディア 機能 データ構造 形状 課題

Slide 105

Slide 105 text

データ構造とPHPer その反面、 
 PHPにおいてはコレらを知らなくても 
 今まで通り困らずに過ごせる

Slide 106

Slide 106 text

データ構造とPHPer PHPerがデータ構造を学ぶ意味? ⇓ 単なる「処理効率を上げる」を超えて、 
 「問題をどう捉え、表現するか」にメスを入れる

Slide 107

Slide 107 text

データ構造とPHPer PHPerがデータ構造を学ぶ意味? ⇓ 単なる「array」を超えて、 
 「どんなデータであるか」「どんな集合でないか」 
 を語る語彙が身に付いた世界に入門する

Slide 108

Slide 108 text

いかに学びを得るか 「知らなくても困らない」ことにこそ、 物事を違った形で捉えるための 
 チャンスが眠っているかも

Slide 109

Slide 109 text

(再)この発表の目論見 / What 聴いているみなさんが、 
 データ構造について「ふ〜ん」ってなる! ⇓ あわよくば、ちょっと「知りたい」と興味を持つ!

Slide 110

Slide 110 text

〆 「データ構造ってのがあるんだな」 
 「SPLってやつで提供されている実装もあるんだな」 
 と知ったのをキッカケに、 
 身近な存在になってくれたら幸いです!

Slide 111

Slide 111 text

おしまい! お付き合いいただき ありがとうございました!!

Slide 112

Slide 112 text

Appendix: 
 (個人的に)データ構造に興味を持てるまでに 
 助けになった情報リソース・書籍

Slide 113

Slide 113 text

今回の発表をキッカケに、 
 「自分でも学んでみたい」と思った人に向けて 
 とても助けになった書籍等を紹介します

Slide 114

Slide 114 text

データ構造について入門できそうなリソース • アルゴリズム図鑑 増補改訂版 絵で見てわかる33のアルゴリズム 
 https://www.shoeisha.co.jp/book/detail/9784798172439 • 名前の通り、絵が豊富でフレンドリーな雰囲気。とっつきやすかったです • 基本と言われるアルゴリズムやデータ構造について紹介 • 放送大学科目「データ構造とプログラミング」 
 ※自分が受講したのは、旧「データ構造の基礎」 
 https://bangumi.ouj.ac.jp/v4/bslife/detail/15794524.html • 内容は基礎的。コードも出てくるが、そこがメインではなくサブ的な位置づけ • 大学の授業なので真面目で落ち着いた雰囲気 
 視聴手段があれば(テキストのみより)授業動画で学習するのがオススメ

Slide 115

Slide 115 text

実用目線で威力に触れていく • SQLパフォーマンス詳解 
 https://sql-performance-explained.jp/ • 「パフォーマンス改善をしたくて、データベースがボトルネックになっている ことに気づいた」という場面は日常の中で覚えがあるはず • インデックスや計算量の観点で、「なぜ」「どうすれば」を解説した本 • インデックスについて学ぶと、正にデータ構造の有り難さを実感できる

Slide 116

Slide 116 text

ガッツリとPHP寄りの教材 • PHP 7 Data Structures and Algorithms 
 https://www.packtpub.com/en-us/product/php-7-data-structures- and-algorithms-9781786463890 
 ※ Kindle: https://www.amazon.co.jp/dp/B01IF7NLDW • PHPユーザーに向けたデータ構造&アルゴリズム本 • 単に「実装例がPHPで書かれている」というだけでなく、 
 「Understanding PHP Arrays」や「PHP Built-In Support for Data Structures and Algorithms」といった話題に章を割いている様に、PHPの事情 とリンクさせながら書かれているのが特徴

Slide 117

Slide 117 text

Appendix: 
 データ構造に親しむ・見識を広げる 
 助けになるツール等

Slide 118

Slide 118 text

理屈が分かった後に「定着」させていくには 
 視覚的に理解したり、 
 自分の手でインタラクティブに動かすのが 
 効果的ではないでしょうか! というのを出来るツールの紹介です

Slide 119

Slide 119 text

• VisuAlgo 
 https://visualgo.net/en • 色々なデータ構造を、ポップなUIとアニメーションで学べる 
 要素の追加や探索といった操作をした時に、どう動くの?を視覚的に • Data Structure Visualization 
 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html • よりシンプルですが、知名度ならコチラのほうが上?かも

Slide 120

Slide 120 text

Appendix: 
 最近のPHPコミュニティにおける 
 データ構造・アルゴリズム関連の発表資料 
 (自分が見たことのある範囲で)

Slide 121

Slide 121 text

アルゴリズムやデータ構造について、 
 PHP関連の勉強会やカンファレンスで 
 先達が発信していた資料です。 今回の発表では触れていない、 
 「計算量」や「アルゴリズム」といった話に 
 踏み込んだもの

Slide 122

Slide 122 text

データ構造について、優しい図と説明で触れやすく • PHPerのための計算量入門 
 https://speakerdeck.com/hanhan1978/basic-knowledge-of-time- complexity • 空間計算量入門 
 https://speakerdeck.com/hanhan1978/basic-knowledge-of-space- complexity • PHPの配列とデータ構造 
 https://speakerdeck.com/meihei3/phperkaigi-2023