SlideShare a Scribd company logo
アルゴリズム+データ構造
    勉強会(1)
   2013-01-28 アロハ)竹腰 彰成
この勉強会について
• 予定回数)全15回
• 参加対象)PHPの文法を理解していること
• 進め方)講義+実習
• 参加資格)初回は自由参加
       2回目からは前回参加分の実習に合格していること
15回の内容
• 第1回. 整列とは             • 第9回. 配列(リスト・スタック・待ち行列)
• 第2回. バブルソート           • 第10回. リングバッファ
• 第3回. 選択ソート            • 第11回. 木構造
• 第4回. クイックソート          • 第12回. 木構造(2)
• 第5回. マージソート           • 第13回. 二分探索木
• 第6回. 分布数え上げソート        • 第14回. バックトラック法
• 第7回. 基数ソート            • 第15回. バックトラック法(2)
• 第8回. usort()を使ったソート
アルゴリズム+データ構造 とは
• ニクラウス・ヴィルトの書籍名
  「アルゴリズム+データ構造=プログラム」
 • アルゴリズム=処理手順
 • データ構造=データの持ち方

• 「PHPを覚えたのにプログラムできない」
 • 「英語覚えたのにコミュニケーションできない」にさも似たり
 • 文法がわかっていても使い方をわかっていない
• アルゴリズムとデータ構造がわかればプログラムを書ける
第1回 整列(ソート)とは
ソートの種類はたくさん
• Wikipediaに記載されているだけでも20種類
• 何が違うか? たとえば……
 • データを持つ場所
 • 汎用的か特殊か
 • 2回並べなおしたときの動作
ソートの種類(1) データを持つ場所
• 内部整列:主記憶(メモリ)上でソートする
 • ランダムアクセスができる
   • =データ構造に自由度がある
   • =速いアルゴリズムを組める
 • メモリ上にある=がんばっても数GBまで(昔は数MBまで)
• 外部整列:外部記憶(ディスク)上でソートする
 • シーケンシャルアクセスになる
   • =データ構造に制限がある
   • =遅いアルゴリズムになりがち
 • ディスク上にある=容量がいっぱい
ソートの種類(2) 汎用性
• 比較による整列
 • 大小を比較して交換をする
   • 汎用的に使える
 • 計算量はO(n log n)が最小
• 比較によらない整列
 • 大小を比較しない整列
   • データの特殊性を利用する
   • 例)テストの点数は0~100点の整数101種類しかなく、件数は生徒数×教科数だけ
 • 計算量はO(n)が可能
計算量とは
• アルゴリズムの速さの指標
• 処理個数が増えた時の処理時間の増え方を示す
ソートの種類(3) 2回並べなおすとき
• 安定なソート:ソート前の順序がソート後にも保たれている
• 不安定なソート:ソート前の順序はソート後に破壊される
• 例)テストの成績順
    名前でソートした後で点数でソートしたとき、
    同じ点数の生徒の順番が名前順になっているかどうか
       安定なソート       不安定なソート
     100点   できすぎ   100点   できすぎ
     85点    みなもと   85点    みなもと
     10点    ごうだ    10点    ごうだ
     10点    のび     10点    ほねかわ
     10点    ほねかわ   10点    のび
ソート関数
• PHPにはすでに用意されている
 • sort()
 • 他言語でも同様
 • Linuxにもsortコマンド
• ほとんどの用途に使えて、自分で作るより高速
 • 中身はクイックソート(最速の汎用ソートアルゴリズム)
 • 普段はこれを使おう
 • これでダメなときはソートの種類を吟味して自作する
• この勉強会の第7回までは「勉強のために」自分で作っていきます
自作するにあたり
• バグがあってはいけません
• コードを書いたら動作検証(単体テスト)をします
実習:ソート前後のデータを表示する
• 次回からsort()を自作するので、その検証ができるようにテストコード
  を作りましょう
 •   ランダムなデータを配列に20個用意する
 •   ソート前データを表示する(ランダムであることを目視できるようにする)
 •   sort()でソートする
 •   ソート後のデータを表示する(整列されたことを目視できるようにする)
• 勉強会の残り時間を使って書いてください。時間のある限り質問を
  受け付けます
• できあがったら提出してください
• 時間に間に合わない場合は宿題にします
今日の単語まとめ
• 主記憶装置、外部記憶装置(補助記憶装置)
• シーケンシャルアクセス、ランダムアクセス
• 計算量
• 安定なソート、不安定なソート

More Related Content

アルゴリズム+データ構造勉強会(1)