Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
by しんぺい a.k.a. 猫型蓄音機 Perlで学ぼう! 文系プログラマのための 知識ゼロからの データ構造と計算量
Slide 2
Slide 2 text
あんただれ • しんぺいとか猫型とかいう名前で呼 ばれています • rerakuという会社で働いてます • 仕事ではScala, Perl, Ruby
Slide 3
Slide 3 text
あんただれ • Github:Shinpeim • process-book • 新潟非在住 Niigata.pm 主催です • 趣味でバンド • 11/14高円寺ペンギンハウス
Slide 4
Slide 4 text
ペンギンハウス
Slide 5
Slide 5 text
ペンギンハウス
Slide 6
Slide 6 text
今日やること • データ構造と計算量について、簡単 に解説します • 基本的なことしかやりません • ハイレベルプログラマ諸氏は今すぐ 別の部屋で有意義な時間を過ごすん だ!!
Slide 7
Slide 7 text
事前準備
Slide 8
Slide 8 text
Cの変数とメモリ
Slide 9
Slide 9 text
何がおきてる?
Slide 10
Slide 10 text
int のメモリを確保 JOUB
Slide 11
Slide 11 text
1を代入 JOUB
Slide 12
Slide 12 text
bも同様に JOUB JOUC
Slide 13
Slide 13 text
c も同様に JOUD JOUB JOUC
Slide 14
Slide 14 text
CPUが足し算してcに代入 JOUD JOUB JOUC
Slide 15
Slide 15 text
ポイント • 変数は箱ではない!!!!!! • メモリです • たくさん用意すれば用意するほどメ モリを消費する
Slide 16
Slide 16 text
メモリとポインタ
Slide 17
Slide 17 text
何がおきてる?
Slide 18
Slide 18 text
実はメモリには番地があります B 10000番
Slide 19
Slide 19 text
番地を取得 B 10000番
Slide 20
Slide 20 text
番地を保存する4byte確保 TIPSU C B 10000番
Slide 21
Slide 21 text
番地を代入 TIPSUC B 10000番
Slide 22
Slide 22 text
bの中身を10進数で表示 TIPSUC B 10000番
Slide 23
Slide 23 text
bの番地の指し示す先を見て 10000番 TIPSUC B
Slide 24
Slide 24 text
short* なので2バイト読む TIPSUC B
Slide 25
Slide 25 text
ポイント • ポインタの中には「メモリ上の位置」を 表す数字が入ってる • その数字の番地から、ポインタが示す型 のバイト数だけ読めばポインタの指す値 を読むことができる • こうやって「値につながる値」を作るこ とができる
Slide 26
Slide 26 text
練習問題 へんな値が出力されるのはなぜ?
Slide 27
Slide 27 text
Perlの場合
Slide 28
Slide 28 text
何がおきてる?
Slide 29
Slide 29 text
SVを確保 47
Slide 30
Slide 30 text
AVを確保 47 "7
Slide 31
Slide 31 text
HVを確保 47 "7 47 )7 B
Slide 32
Slide 32 text
SVを確保してSVの場所を代入 47 "7 47 )7 47 B 47 47 SFG YGEEC 0x7f99d080db78
Slide 33
Slide 33 text
中身を表示 47 "7 47 )7 47 B 47 47 SFG YGEEC
Slide 34
Slide 34 text
中身の指し示すやつを取ってきて表示 47 "7 47 )7 47 B 47 47 SFG YGEEC 0x7f99d080db78
Slide 35
Slide 35 text
ポイント • 値はメモリに確保されてる • リファレンスにはそのメモリの場所 を示すものが入っている • ねっ、CもPerlも変わらないでしょ
Slide 36
Slide 36 text
さまざまな データ構造
Slide 37
Slide 37 text
エントリーナンバー1
Slide 38
Slide 38 text
配列
Slide 39
Slide 39 text
なにがおきてる?
Slide 40
Slide 40 text
short5個分を「連続して」確保 10000番
Slide 41
Slide 41 text
変数名でアクセスすると番地が取れる 10000番
Slide 42
Slide 42 text
添え字付きアクセス 10000 + short(2byte) * 2 番地を読みに行くよ 10000番
Slide 43
Slide 43 text
添え字付きアクセス
Slide 44
Slide 44 text
配列の要素を増やしたい
Slide 45
Slide 45 text
エントリーナンバー2
Slide 46
Slide 46 text
単方向連結リスト
Slide 47
Slide 47 text
単方向連結リストの要素 a next element
Slide 48
Slide 48 text
単方向連結リスト
Slide 49
Slide 49 text
要素一個つくる 要素一個つくる
Slide 50
Slide 50 text
要素一個つくる )7 @WBMVF @OFYU@SFGVOEFG 1
Slide 51
Slide 51 text
要素一個つくる )7 @WBMVF @OFYU@SFGVOEFG FM@ &MFNFOU SFG 1
Slide 52
Slide 52 text
ふたつめの要素作る )7 @WBMVF @OFYU@SFGVOEFG FM@ &MFNFOU SFG )7 @WBMVF @OFYU@SFG&MFNFOU SFG FM@ &MFNFOU SFG 1 2
Slide 53
Slide 53 text
$el_ 1もう出てこないので無視 )7 @WBMVF @OFYU@SFGVOEFG )7 @WBMVF @OFYU@SFG&MFNFOU SFG FM@ &MFNFOU SFG 1 2
Slide 54
Slide 54 text
同様にみっつめの要素 )7 @WBMVF @OFYU@SFGVOEFG )7 @WBMVF @OFYU@SFG&MFNFOU SFG FM@ &MFNFOU SFG )7 @WBMVF @OFYU@SFG&MFNFOU SFG 1 2 3
Slide 55
Slide 55 text
Listの実装 コンストラクタ リストの先頭に 値を追加するメソッド
Slide 56
Slide 56 text
空のリストを作って )7 @pSTU@FMFNFOU VOEFG MJTU -JTU SFG
Slide 57
Slide 57 text
要素をひとつ挿入 )7 @pSTU@FMFNFOU VOEFG MJTU -JTU SFG )7 @WBMVF @OFYU@SFGVOEFG
Slide 58
Slide 58 text
要素をひとつ挿入 )7 @pSTU@FMFNFOU &MFNFOUSFG MJTU -JTU SFG )7 @WBMVF @OFYU@SFGVOEFG
Slide 59
Slide 59 text
2を挿入 MJTU -JTU SFG )7 @WBMVF @OFYU@SFGVOEFG )7 @pSTU@FMFNFOU &MFNFOUSFG )7 @WBMVF @OFYU@SFG &MFNFOUSFG
Slide 60
Slide 60 text
3つめの値を取得したい MJTU -JTU SFG )7 @WBMVF @OFYU@SFG &MFNFOUSFG )7 @pSTU@FMFNFOU &MFNFOUSFG )7 @WBMVF @OFYU@SFG &MFNFOUSFG )7 @WBMVF @OFYU@SFGVOEFG
Slide 61
Slide 61 text
MJTU -JTU SFG )7 @WBMVF @OFYU@SFG &MFNFOUSFG )7 @pSTU@FMFNFOU &MFNFOUSFG )7 @WBMVF @OFYU@SFG &MFNFOUSFG )7 @WBMVF @OFYU@SFGVOEFG 3つめの値を取得したい
Slide 62
Slide 62 text
MJTU -JTU SFG )7 @WBMVF @OFYU@SFG &MFNFOUSFG )7 @pSTU@FMFNFOU &MFNFOUSFG )7 @WBMVF @OFYU@SFG &MFNFOUSFG )7 @WBMVF @OFYU@SFGVOEFG 3つめの値を取得したい
Slide 63
Slide 63 text
MJTU -JTU SFG )7 @WBMVF @OFYU@SFG &MFNFOUSFG )7 @pSTU@FMFNFOU &MFNFOUSFG )7 @WBMVF @OFYU@SFG &MFNFOUSFG )7 @WBMVF @OFYU@SFGVOEFG 3つめの値を取得したい
Slide 64
Slide 64 text
ポイント • メモリアドレスが飛び飛び • 「空いてるところ」にメモリ確保で きる • 先頭からの順々に辿らないといけな いので一発でアクセスできない
Slide 65
Slide 65 text
一発とか順々とか ちょっと ふわっとしてる もうちょっと ちゃんと言いたい
Slide 66
Slide 66 text
ここで ちょっと寄り道 計算量の話
Slide 67
Slide 67 text
オーダー法 • データの数がn個のとき、n回計算を しないといけないとき、O(n)という • 2n回計算しないといけない、とか、 2n + a回計算しないといけないとき もO(n)という • 要するに定数倍とか定数項は考えない
Slide 68
Slide 68 text
連結リストの計算量 • n個めの要素にアクセスしたい • 最初の要素へのアクセス + n - 1回辿 る必要がある = O(n) • リストの最初に値を挿入したい • 後ろにいくつ要素があっても、最初の要 素へのアクセス + 新しい要素を作って つなぐだけ = O(1)
Slide 69
Slide 69 text
配列の計算量 • n個めの要素にアクセスしたい • 計算で一発でメモリ番地が出せて、そこ を読むだけでよい • O(1)
Slide 70
Slide 70 text
いろんな計算量を グラフでみると 特徴がわかる
Slide 71
Slide 71 text
O(n) ԣ࣠ɿσʔλͷݸ ॎ࣠ɿܭࢉͷྔ ԣ࣠ɿσʔλͷݸ ॎ࣠ɿܭࢉͷྔ
Slide 72
Slide 72 text
O(n) ԣ࣠ɿσʔλͷݸ ॎ࣠ɿܭࢉͷྔ ԣ࣠ɿσʔλͷݸ ॎ࣠ɿܭࢉͷྔ
Slide 73
Slide 73 text
O(n^2) ԣ࣠ɿσʔλͷݸ ॎ࣠ɿܭࢉͷྔ
Slide 74
Slide 74 text
O(n^2) ԣ࣠ɿσʔλͷݸ ॎ࣠ɿܭࢉͷྔ
Slide 75
Slide 75 text
O(1) ԣ࣠ɿσʔλͷݸ ॎ࣠ɿܭࢉͷྔ
Slide 76
Slide 76 text
O(log n)
Slide 77
Slide 77 text
O(log n) ԣ࣠ɿσʔλͷݸ ॎ࣠ɿܭࢉͷྔ
Slide 78
Slide 78 text
ポイント • オーダー法は「正確な計算量」を導 かない • データの量に応じて、「データが増 えたときにどれくらい処理量が増え るか」をざっと知るための指標です
Slide 79
Slide 79 text
データ構造の話に 戻ります
Slide 80
Slide 80 text
連結リストの特徴 • 探索の計算量がO(n)だった • 悪くないけどO(log n)だと嬉しい ですよねー
Slide 81
Slide 81 text
エントリーナンバー3
Slide 82
Slide 82 text
2分木
Slide 83
Slide 83 text
2分木のnode a x
Slide 84
Slide 84 text
)7 @SPPUVOEFG USFF 5SFFSFG tree 空の2分木
Slide 85
Slide 85 text
)7 @SPPUVOEFG USFF 5SFFSFG tree 2分木に最初の値:4を追加
Slide 86
Slide 86 text
2分木に最初の値:4を追加 )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG )7 @SPPU/PEF SFG USFF 5SFFSFG tree
Slide 87
Slide 87 text
2分木に2を追加 )7 @WBMVF @TNBMMFS/PEFSFG @MBSHFSVOEFG )7 @SPPU/PEF SFG USFF 5SFFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG tree
Slide 88
Slide 88 text
2分木に2を追加 )7 @WBMVF @TNBMMFS/PEFSFG @MBSHFSVOEFG )7 @SPPU/PEF SFG USFF 5SFFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG tree
Slide 89
Slide 89 text
2分木に2を追加 )7 @WBMVF @TNBMMFS/PEFSFG @MBSHFSVOEFG )7 @SPPU/PEF SFG USFF 5SFFSFG V )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG tree
Slide 90
Slide 90 text
2分木に6を追加 )7 @WBMVF @TNBMMFS/PEFSFG @MBSHFSVOEFG )7 @SPPU/PEF SFG USFF 5SFFSFG V )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG tree
Slide 91
Slide 91 text
2分木に6を追加 )7 @WBMVF @TNBMMFS/PEFSFG @MBSHFSVOEFG )7 @SPPU/PEF SFG USFF 5SFFSFG V )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG tree
Slide 92
Slide 92 text
2分木に6を追加 )7 @WBMVF @TNBMMFS/PEFSFG @MBSHFS/PEFSFG )7 @SPPU/PEF SFG USFF 5SFFSFG V V )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG tree
Slide 93
Slide 93 text
2分木に3を追加 )7 @WBMVF @TNBMMFS/PEFSFG @MBSHFS/PEFSFG )7 @SPPU/PEF SFG USFF 5SFFSFG V V )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG tree
Slide 94
Slide 94 text
2分木に3を追加 )7 @WBMVF @TNBMMFS/PEFSFG @MBSHFS/PEFSFG )7 @SPPU/PEF SFG USFF 5SFFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG V V tree
Slide 95
Slide 95 text
2分木に3を追加 )7 @WBMVF @TNBMMFS/PEFSFG @MBSHFS/PEFSFG )7 @SPPU/PEF SFG USFF 5SFFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFS/PEFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG V V V tree
Slide 96
Slide 96 text
2分木から1を探索 )7 @WBMVF @TNBMMFS/PEFSFG @MBSHFS/PEFSFG )7 @SPPU/PEF SFG USFF 5SFFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFS/PEFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG V V V tree
Slide 97
Slide 97 text
2分木から1を探索 )7 @WBMVF @TNBMMFS/PEFSFG @MBSHFS/PEFSFG )7 @SPPU/PEF SFG USFF 5SFFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFS/PEFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG V V V tree
Slide 98
Slide 98 text
2分木の探索 • 4つ要素があるけど2回で済んだ • こういう風にちゃんと「ばらけた」 木になってるとO(log n)になる
Slide 99
Slide 99 text
2分木から5を探索 )7 @WBMVF @TNBMMFSVOEFG @MBSHFS/PEFSFG )7 @SPPU/PEF SFG USFF 5SFFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFS/PEFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFS/PEFSFG )7 @WBMVF @TNBMMFSVOEFG @MBSHFSVOEFG
Slide 100
Slide 100 text
2分木の探索 • 実質連結リスト • O(n)じゃん
Slide 101
Slide 101 text
エントリーナンバー4
Slide 102
Slide 102 text
B木
Slide 103
Slide 103 text
B木のnode b a x
Slide 104
Slide 104 text
空のB木に7を追加
Slide 105
Slide 105 text
B木に3を追加
Slide 106
Slide 106 text
B木に9を追加 満員じゃん
Slide 107
Slide 107 text
B木に9を追加 全員並べて
Slide 108
Slide 108 text
B木に9を追加 nodeふたつに分けて
Slide 109
Slide 109 text
B木に9を追加 nodeふたつに分けて
Slide 110
Slide 110 text
B木に9を追加 真ん中の値の行き場がない
Slide 111
Slide 111 text
B木に9を追加 新しいnode作る
Slide 112
Slide 112 text
B木に9を追加 枝つなぐ
Slide 113
Slide 113 text
B木に9を追加 見やすいように整列!
Slide 114
Slide 114 text
B木に5を追加
Slide 115
Slide 115 text
B木に6を追加 満員じゃん
Slide 116
Slide 116 text
B木に6を追加 全員並べて
Slide 117
Slide 117 text
B木に6を追加 nodeふたつに分けて
Slide 118
Slide 118 text
B木に6を追加 真ん中は上に空きがあるのでそこに入れる
Slide 119
Slide 119 text
B木に6を追加
Slide 120
Slide 120 text
B木に6を追加 枝つなぎ直す
Slide 121
Slide 121 text
B木に6を追加 見やすいように整列!
Slide 122
Slide 122 text
B木に10を追加
Slide 123
Slide 123 text
B木に16を追加 満員じゃん
Slide 124
Slide 124 text
B木に16を追加 真ん中は上に
Slide 125
Slide 125 text
B木に16を追加 満員じゃん
Slide 126
Slide 126 text
B木に16を追加
Slide 127
Slide 127 text
B木に16を追加 node分割して 枝つなぎ直す
Slide 128
Slide 128 text
B木に16を追加 新しいnode作って 枝つなぐ
Slide 129
Slide 129 text
B木に16を追加
Slide 130
Slide 130 text
B木に16を追加 O(log n) O(m)
Slide 131
Slide 131 text
エントリーナンバー5
Slide 132
Slide 132 text
B+木
Slide 133
Slide 133 text
B+木 • DBのインデックスとかに使われて る • B木の改良版 • 末端のnodeに全部のデータが入っ てる • node同士がlinkされてることが多い
Slide 134
Slide 134 text
B+木
Slide 135
Slide 135 text
B+木から5を探索 select * from table where id > 5
Slide 136
Slide 136 text
まとめ
Slide 137
Slide 137 text
まとめ • データ構造と計算量について簡単に 見てみました • この程度の理解でも、ふだんの業務 に活かせることは増えます • 今後の学習や業務に活かしていただ ければ幸いです
Slide 138
Slide 138 text
最後に • 11/14 高円寺ペンギンハウス • よろしくおねがいします
Slide 139
Slide 139 text
おしまい