Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Perlで学ぼう!文系プログラマのための、知識ゼロからのデータ構造と計算量

 Perlで学ぼう!文系プログラマのための、知識ゼロからのデータ構造と計算量

Shinpei Maruyama

August 21, 2015
Tweet

More Decks by Shinpei Maruyama

Other Decks in Programming

Transcript

  1. by しんぺい a.k.a. 猫型蓄音機
    Perlで学ぼう!
    文系プログラマのための
    知識ゼロからの
    データ構造と計算量

    View Slide

  2. あんただれ
    • しんぺいとか猫型とかいう名前で呼
    ばれています
    • rerakuという会社で働いてます
    • 仕事ではScala, Perl, Ruby

    View Slide

  3. あんただれ
    • Github:Shinpeim
    • process-book
    • 新潟非在住 Niigata.pm 主催です
    • 趣味でバンド
    • 11/14高円寺ペンギンハウス

    View Slide

  4. ペンギンハウス

    View Slide

  5. ペンギンハウス

    View Slide

  6. 今日やること
    • データ構造と計算量について、簡単
    に解説します
    • 基本的なことしかやりません
    • ハイレベルプログラマ諸氏は今すぐ
    別の部屋で有意義な時間を過ごすん
    だ!!

    View Slide

  7. 事前準備

    View Slide

  8. Cの変数とメモリ

    View Slide

  9. 何がおきてる?

    View Slide

  10. int のメモリを確保
    JOUB

    View Slide

  11. 1を代入
    JOUB

    View Slide

  12. bも同様に
    JOUB

    JOUC

    View Slide

  13. c も同様に
    JOUD

    JOUB

    JOUC

    View Slide

  14. CPUが足し算してcに代入
    JOUD

    JOUB

    JOUC

    View Slide

  15. ポイント
    • 変数は箱ではない!!!!!!
    • メモリです
    • たくさん用意すれば用意するほどメ
    モリを消費する

    View Slide

  16. メモリとポインタ

    View Slide

  17. 何がおきてる?

    View Slide

  18. 実はメモリには番地があります
    B

    10000番

    View Slide

  19. 番地を取得
    B

    10000番

    View Slide

  20. 番地を保存する4byte確保
    TIPSU
    C
    B

    10000番

    View Slide

  21. 番地を代入
    TIPSUC

    B

    10000番

    View Slide

  22. bの中身を10進数で表示
    TIPSUC

    B

    10000番

    View Slide

  23. bの番地の指し示す先を見て
    10000番
    TIPSUC

    B

    View Slide

  24. short* なので2バイト読む
    TIPSUC

    B

    View Slide

  25. ポイント
    • ポインタの中には「メモリ上の位置」を
    表す数字が入ってる
    • その数字の番地から、ポインタが示す型
    のバイト数だけ読めばポインタの指す値
    を読むことができる
    • こうやって「値につながる値」を作るこ
    とができる

    View Slide

  26. 練習問題
    へんな値が出力されるのはなぜ?

    View Slide

  27. Perlの場合

    View Slide

  28. 何がおきてる?

    View Slide

  29. SVを確保
    47

    View Slide

  30. AVを確保
    47

    "7

    View Slide

  31. HVを確保
    47

    "7 47


    )7
    B


    View Slide

  32. SVを確保してSVの場所を代入
    47

    "7 47


    )7
    47 B
    47



    47
    SFG YGEEC




    0x7f99d080db78

    View Slide

  33. 中身を表示
    47

    "7 47


    )7
    47 B
    47



    47
    SFG YGEEC




    View Slide

  34. 中身の指し示すやつを取ってきて表示
    47

    "7 47


    )7
    47 B
    47



    47
    SFG YGEEC




    0x7f99d080db78

    View Slide

  35. ポイント
    • 値はメモリに確保されてる
    • リファレンスにはそのメモリの場所
    を示すものが入っている
    • ねっ、CもPerlも変わらないでしょ

    View Slide

  36. さまざまな
    データ構造

    View Slide

  37. エントリーナンバー1

    View Slide

  38. 配列

    View Slide

  39. なにがおきてる?

    View Slide

  40. short5個分を「連続して」確保

    10000番


    View Slide

  41. 変数名でアクセスすると番地が取れる

    10000番


    View Slide

  42. 添え字付きアクセス



    10000 + short(2byte) * 2 番地を読みに行くよ

    10000番


    View Slide

  43. 添え字付きアクセス



    View Slide

  44. 配列の要素を増やしたい



    View Slide

  45. エントリーナンバー2

    View Slide

  46. 単方向連結リスト

    View Slide

  47. 単方向連結リストの要素
    a next element

    View Slide

  48. 単方向連結リスト

    View Slide

  49. 要素一個つくる
    要素一個つくる

    View Slide

  50. 要素一個つくる
    )7
    @WBMVF
    @[email protected]

    1

    View Slide

  51. 要素一個つくる
    )7
    @WBMVF
    @[email protected]


    [email protected]
    &MFNFOU
    SFG

    1

    View Slide

  52. ふたつめの要素作る
    )7
    @WBMVF
    @[email protected]


    [email protected]
    &MFNFOU
    SFG

    )7
    @WBMVF
    @[email protected]&MFNFOU
    SFG



    [email protected]
    &MFNFOU
    SFG

    1
    2

    View Slide

  53. $el_ 1もう出てこないので無視
    )7
    @WBMVF
    @[email protected]


    )7
    @WBMVF
    @[email protected]&MFNFOU
    SFG



    [email protected]
    &MFNFOU
    SFG

    1
    2

    View Slide

  54. 同様にみっつめの要素
    )7
    @WBMVF
    @[email protected]


    )7
    @WBMVF
    @[email protected]&MFNFOU
    SFG



    [email protected]
    &MFNFOU
    SFG

    )7
    @WBMVF
    @[email protected]&MFNFOU
    SFG


    1
    2
    3

    View Slide

  55. Listの実装
    コンストラクタ
    リストの先頭に
    値を追加するメソッド

    View Slide

  56. 空のリストを作って
    )7
    @[email protected]
    VOEFG


    MJTU
    -JTU
    SFG

    View Slide

  57. 要素をひとつ挿入
    )7
    @[email protected]
    VOEFG


    MJTU
    -JTU
    SFG

    )7
    @WBMVF
    @[email protected]


    View Slide

  58. 要素をひとつ挿入
    )7
    @[email protected]
    &MFNFOUSFG



    MJTU
    -JTU
    SFG

    )7
    @WBMVF
    @[email protected]


    View Slide

  59. 2を挿入
    MJTU
    -JTU
    SFG

    )7
    @WBMVF
    @[email protected]


    )7
    @[email protected]
    &MFNFOUSFG



    )7
    @WBMVF
    @[email protected]
    &MFNFOUSFG



    View Slide

  60. 3つめの値を取得したい
    MJTU
    -JTU
    SFG

    )7
    @WBMVF
    @[email protected]
    &MFNFOUSFG



    )7
    @[email protected]
    &MFNFOUSFG



    )7
    @WBMVF
    @[email protected]
    &MFNFOUSFG



    )7
    @WBMVF
    @[email protected]


    View Slide

  61. MJTU
    -JTU
    SFG

    )7
    @WBMVF
    @[email protected]
    &MFNFOUSFG



    )7
    @[email protected]
    &MFNFOUSFG



    )7
    @WBMVF
    @[email protected]
    &MFNFOUSFG



    )7
    @WBMVF
    @[email protected]


    3つめの値を取得したい

    View Slide

  62. MJTU
    -JTU
    SFG

    )7
    @WBMVF
    @[email protected]
    &MFNFOUSFG



    )7
    @[email protected]
    &MFNFOUSFG



    )7
    @WBMVF
    @[email protected]
    &MFNFOUSFG



    )7
    @WBMVF
    @[email protected]


    3つめの値を取得したい

    View Slide

  63. MJTU
    -JTU
    SFG

    )7
    @WBMVF
    @[email protected]
    &MFNFOUSFG



    )7
    @[email protected]
    &MFNFOUSFG



    )7
    @WBMVF
    @[email protected]
    &MFNFOUSFG



    )7
    @WBMVF
    @[email protected]


    3つめの値を取得したい

    View Slide

  64. ポイント
    • メモリアドレスが飛び飛び
    • 「空いてるところ」にメモリ確保で
    きる
    • 先頭からの順々に辿らないといけな
    いので一発でアクセスできない

    View Slide

  65. 一発とか順々とか
    ちょっと
    ふわっとしてる
    もうちょっと
    ちゃんと言いたい

    View Slide

  66. ここで
    ちょっと寄り道
    計算量の話

    View Slide

  67. オーダー法
    • データの数がn個のとき、n回計算を
    しないといけないとき、O(n)という
    • 2n回計算しないといけない、とか、
    2n + a回計算しないといけないとき
    もO(n)という
    • 要するに定数倍とか定数項は考えない

    View Slide

  68. 連結リストの計算量
    • n個めの要素にアクセスしたい
    • 最初の要素へのアクセス + n - 1回辿
    る必要がある = O(n)
    • リストの最初に値を挿入したい
    • 後ろにいくつ要素があっても、最初の要
    素へのアクセス + 新しい要素を作って
    つなぐだけ = O(1)

    View Slide

  69. 配列の計算量
    • n個めの要素にアクセスしたい
    • 計算で一発でメモリ番地が出せて、そこ
    を読むだけでよい
    • O(1)

    View Slide

  70. いろんな計算量を
    グラフでみると
    特徴がわかる

    View Slide

  71. O(n)
    ԣ࣠ɿσʔλͷݸ਺
    ॎ࣠ɿܭࢉͷྔ
    ԣ࣠ɿσʔλͷݸ਺
    ॎ࣠ɿܭࢉͷྔ

    View Slide

  72. O(n)
    ԣ࣠ɿσʔλͷݸ਺
    ॎ࣠ɿܭࢉͷྔ
    ԣ࣠ɿσʔλͷݸ਺
    ॎ࣠ɿܭࢉͷྔ

    View Slide

  73. O(n^2)
    ԣ࣠ɿσʔλͷݸ਺
    ॎ࣠ɿܭࢉͷྔ

    View Slide

  74. O(n^2)
    ԣ࣠ɿσʔλͷݸ਺
    ॎ࣠ɿܭࢉͷྔ

    View Slide

  75. O(1)
    ԣ࣠ɿσʔλͷݸ਺
    ॎ࣠ɿܭࢉͷྔ

    View Slide

  76. O(log n)

    View Slide

  77. O(log n)
    ԣ࣠ɿσʔλͷݸ਺
    ॎ࣠ɿܭࢉͷྔ

    View Slide

  78. ポイント
    • オーダー法は「正確な計算量」を導
    かない
    • データの量に応じて、「データが増
    えたときにどれくらい処理量が増え
    るか」をざっと知るための指標です

    View Slide

  79. データ構造の話に
    戻ります

    View Slide

  80. 連結リストの特徴
    • 探索の計算量がO(n)だった
    • 悪くないけどO(log n)だと嬉しい
    ですよねー

    View Slide

  81. エントリーナンバー3

    View Slide

  82. 2分木

    View Slide

  83. 2分木のnode
    a
    x

    View Slide

  84. )7
    @SPPUVOEFG


    USFF
    5SFFSFG

    tree
    空の2分木

    View Slide

  85. )7
    @SPPUVOEFG


    USFF
    5SFFSFG

    tree
    2分木に最初の値:4を追加

    View Slide

  86. 2分木に最初の値:4を追加
    )7
    @WBMVF
    @TNBMMFSVOEFG
    @MBSHFSVOEFG


    )7
    @SPPU/PEF
    SFG



    USFF
    5SFFSFG


    tree

    View Slide

  87. 2分木に2を追加
    )7
    @WBMVF
    @TNBMMFS/PEFSFG

    @MBSHFSVOEFG


    )7
    @SPPU/PEF
    SFG



    USFF
    5SFFSFG


    )7
    @WBMVF
    @TNBMMFSVOEFG
    @MBSHFSVOEFG


    tree

    View Slide

  88. 2分木に2を追加
    )7
    @WBMVF
    @TNBMMFS/PEFSFG

    @MBSHFSVOEFG


    )7
    @SPPU/PEF
    SFG



    USFF
    5SFFSFG


    )7
    @WBMVF
    @TNBMMFSVOEFG
    @MBSHFSVOEFG


    tree

    View Slide

  89. 2分木に2を追加
    )7
    @WBMVF
    @TNBMMFS/PEFSFG

    @MBSHFSVOEFG


    )7
    @SPPU/PEF
    SFG



    USFF
    5SFFSFG


    V

    )7
    @WBMVF
    @TNBMMFSVOEFG
    @MBSHFSVOEFG


    tree

    View Slide

  90. 2分木に6を追加
    )7
    @WBMVF
    @TNBMMFS/PEFSFG

    @MBSHFSVOEFG


    )7
    @SPPU/PEF
    SFG



    USFF
    5SFFSFG


    V

    )7
    @WBMVF
    @TNBMMFSVOEFG
    @MBSHFSVOEFG


    tree

    View Slide

  91. 2分木に6を追加
    )7
    @WBMVF
    @TNBMMFS/PEFSFG

    @MBSHFSVOEFG


    )7
    @SPPU/PEF
    SFG



    USFF
    5SFFSFG


    V

    )7
    @WBMVF
    @TNBMMFSVOEFG
    @MBSHFSVOEFG


    tree

    View Slide

  92. 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

    View Slide

  93. 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

    View Slide

  94. 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

    View Slide

  95. 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

    View Slide

  96. 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

    View Slide

  97. 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

    View Slide

  98. 2分木の探索
    • 4つ要素があるけど2回で済んだ
    • こういう風にちゃんと「ばらけた」
    木になってるとO(log n)になる

    View Slide

  99. 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





    View Slide

  100. 2分木の探索
    • 実質連結リスト
    • O(n)じゃん

    View Slide

  101. エントリーナンバー4

    View Slide

  102. B木

    View Slide

  103. B木のnode
    b
    a
    x

    View Slide

  104. 空のB木に7を追加

    View Slide

  105. B木に3を追加

    View Slide

  106. B木に9を追加


    満員じゃん

    View Slide

  107. B木に9を追加


    全員並べて

    View Slide

  108. B木に9を追加


    nodeふたつに分けて

    View Slide

  109. B木に9を追加



    nodeふたつに分けて

    View Slide

  110. B木に9を追加



    真ん中の値の行き場がない

    View Slide

  111. B木に9を追加


    新しいnode作る

    View Slide

  112. B木に9を追加


    枝つなぐ

    View Slide

  113. B木に9を追加


    見やすいように整列!

    View Slide

  114. B木に5を追加


    View Slide

  115. B木に6を追加


    満員じゃん

    View Slide

  116. B木に6を追加




    全員並べて

    View Slide

  117. B木に6を追加




    nodeふたつに分けて

    View Slide

  118. B木に6を追加




    真ん中は上に空きがあるのでそこに入れる

    View Slide

  119. B木に6を追加



    View Slide

  120. B木に6を追加



    枝つなぎ直す

    View Slide

  121. B木に6を追加



    見やすいように整列!

    View Slide




  122. B木に10を追加

    View Slide




  123. B木に16を追加

    満員じゃん

    View Slide




  124. B木に16を追加


    真ん中は上に

    View Slide




  125. B木に16を追加


    満員じゃん

    View Slide



  126. B木に16を追加




    View Slide




  127. B木に16を追加



    node分割して
    枝つなぎ直す

    View Slide




  128. B木に16を追加



    新しいnode作って
    枝つなぐ

    View Slide




  129. B木に16を追加



    View Slide




  130. B木に16を追加



    O(log n)
    O(m)

    View Slide

  131. エントリーナンバー5

    View Slide

  132. B+木

    View Slide

  133. B+木
    • DBのインデックスとかに使われて

    • B木の改良版
    • 末端のnodeに全部のデータが入っ
    てる
    • node同士がlinkされてることが多い

    View Slide




  134. B+木



    View Slide




  135. B+木から5を探索


    select * from table where id > 5


    View Slide

  136. まとめ

    View Slide

  137. まとめ
    • データ構造と計算量について簡単に
    見てみました
    • この程度の理解でも、ふだんの業務
    に活かせることは増えます
    • 今後の学習や業務に活かしていただ
    ければ幸いです

    View Slide

  138. 最後に
    • 11/14 高円寺ペンギンハウス
    • よろしくおねがいします

    View Slide

  139. おしまい

    View Slide