SlideShare a Scribd company logo
セキュリティ&プログラミングキャンプ
          2008
      プログラミング入門2
     アルゴリズムとデータ構造
                                                   ミラクル・リナックス株式会社
                                                         よしおかひろたか




Copyright 2008 Hiro Yoshioka All rights reserved
                                                         1
Contents
• はじめに
• アルゴリズムとは
はじめに
  • アルゴリズムとは
   – 問題を解くための手
     順を定式化して表現
     したもの
   – コンピュータにアルゴ
     リズムを指示するた
     めの命令をプログラ
     ムという
アルゴリズムの例
• ユークリッドの互除法
  二つの自然数の最大公約数を求める
 – 入力をm,n (m ≧ n)
 – n =0 なら、 m を出力して終了
 – n が m を割り切るなら、 n を出力して終了
 – m を n で割った余りを新たに m とし、更に m と n
   を取り替えて、一つ前に戻る。
プログラムの例
#include<stdio.h>
int main(void)
{
    int m, n, tmp;

    scanf("%d %d", &m, &n);
    if(m < 0 || n < 0){
        puts("Error");
        return 1;
    }
    while(n){
        tmp = m % n;
        m = n;
        n = tmp;
    }
    printf("%dn", m);
    return 0;
}
なぜアルゴリズムを学ぶのか
• 優れた先達の知恵がある
 – 優れたアルゴリズムはシンプルで美しい
• 優れたアルゴリズムとは何かを学ぶため
 – 優れたアルゴリズムもそうでないアルゴリズムもあ
   る??
 – アルゴリズムの解析
アルゴリズムとデータ構造
• 優れたアルゴリズムやデータ構造を利用すれ
  ば、問題をあっという間に解けてしまう場合が
  ある。
 – どんなことが解明されているかを調べてみなけれ
   ばならない。
 – さもないと、優れた手法が存在するのに、自己流
   の下手なやり方を考案するのに時間を無駄にする
   。
 – 自己流のアルゴリズムは
  • 開発に時間がかかって
  • 実行時間も遅くて
  • バグも多く、拡張性も低い
アルゴリズムとデータ構造
• アルゴリズムとデータ構造をまったく新たに考
  案しなければならないということはめったにな
  い。
• 基本的なアルゴリズムとデータ構造の組み合
  わせで、多くの問題は解ける。
基本的なアルゴリズムとデータ構造
•   検索
•   ソーティング(並べ替え)
•   O記法
•   リスト
•   ツリー
•   ハッシュテーブル

    参考文献:プログラミング作法、Kernighan &
    Pike
検索
• 配列:静的な表形式のデータを格納する
• 逐次検索:個々の要素を順番に調べていって
  希望の要素かどうか調べる
/* lookup: 配列中の単語を逐次検索する */
int lookup(char *word, char *array[])
{
    int i;
    for (i = 0; array[i] != NULL; i++)
        if (strcmp(word, array[i]) == 0)
            return i;
    return ­1;
}
検索
• 逐次検索:特徴
 – データ量が少ないときには十分高速
 – 実装例:strchr, strstr
 – 作業量(実行時間):データ量に比例
  • データ量が倍になれば検索時間も倍
検索
• 二分検索
 – 表のデータがソート(小さい順に並んでいる)され
   ていると仮定する。
 – まず真ん中の要素を調べて、その値が自分が探し
   ている値より大きかったら前半を調べ、小さければ
   後半を調べる。
 – 辞書を引くようなもの。justはquiteより前にあって、
   actuallyより後ろにある。


  actually, ... , just, ... , quite, ... , really, ... , zeta
二分検索
int binary_lookup(char *name, char *array[], int ntab)
{
    int low, high, mid, cmp;
    low = 0;
    high = ntab ­ 1;
    while (low <= high) {
      mid = (low + high) / 2;
      cmp = strcmp(name, array[mid]);
      if (cmp < 0)
     high = mid ­1;
      else if (cmp > 0)
     low = mid + 1;
      else
     return mid;
    }
    return ­1;
}
検索
• 二分検索
 – 作業量:データ量のlog2(n)に比例
• 作業量の比較
 – 1000個のデータの比較
  • 逐次検索:最大1000回
  • 二分検索:最大約10回
 – 100万個のデータの比較
  • 逐次検索:最大100万回
  • 二分検索:最大約20回
ソーティング
• ソーティング:レコードの集まりをキーの値の大
  小関係によって並べ替えること。
• アルゴリズムの例
 – 配列の要素を1個選択する(ピボット)
 – その他の要素を2つのグループに分割する
  • ピボット値より小さい「チビ」
  • ピボット値より大きいか等しい「デカ」
 – 個々のグループを上記のアルゴリズムでソートす
   る
ソーティング
void quicksort(int v[], int n)
{
    int i, last;
    if (n <= 1)
        return;
    swap(v, 0, rand() % n);
    last = 0;
    for (i = 1; i < n; i++)
        if (v[i] < v[0])
            swap(v, ++last, i);
    swap(v, 0, last);
    quicksort(v, last);
    quicksort(v+last+1, n­last­1);
}

void swap(int v[], int i, int j)
{
    int temp;
    temp = v[i];
    v[i] = v[j];
    v[j] = temp;
}
O記法
• O記法:計算量(実行時間)を入力のサイズnの
  関数で表現する。
• 例:入力に含まれる要素数nによって、特定の
  アルゴリズムによって処理される作業量を表
  す。例えば、逐次検索の作業量はnに比例す
  るし、二分検索の作業量はlog2(n)に比例する。
  この時、逐次検索はO(n)のアルゴリズムであ
  ると言う。二分検索はO(log2(n))のアルゴリズム
  である。
O記法
•   記法           名称        アルゴリズム例
•   O(1)         定数        配列インデックス
•   O(log(n))    対数        二分検索
•   O(n)         1次        文字列比較
•   O(nlog(n))   nlog(n)   クイックソート
•   O(n²)        2次        単純なソート
•   O(n³)        3次        行列乗算
•       n
    O(2 )        指数        集合分割問題
リスト
 • 単一リンクリスト:データと次の項目へのポイン
   タを含んでいる項目の集合
 • サイズ:
      – 配列:固定長
      – リスト:可変長
             ポインタ

ヘッド
                                       NULL

       データ          データ    データ   データ   データ
配列とリスト
 • 順序の変更
      – 配列:ブロック移動
      – リスト:ポインタのつけかえ
 • 項目の追加(サイズの変更)
      – 配列:通常は静的なサイズなのでできない
      – リスト:項目の追加、削除は容易

             ポインタ

ヘッド
                                      NULL

       データ          データ   データ   データ   データ
リスト
typedef struct Name Name;
struct Name {
    Name *next;             next: NULL

    char *name;             name: データ
};

Name *newitem(char *name)
{
    Name *newp;

    newp = (Name *) malloc(sizeof(Name));
    if (newp == NULL)
        exit(2);
    newp­>next = NULL;
    newp­>name = name;
    return newp;
}
リスト:先頭に追加
Name *addfront(Name *listp, Name *newp)
{
    newp­>next = listp;
    return newp;
}
/* 使用例 */
nvlist = addfront(nvlist, newitem("smiley"));

①   nvlist     NULL


②              next: NULL      nvlist   NULL
               name:”smiley”


③   nvlist     next: NULL

               name:”smiley”
リストの検索
Name *lookup(Name *listp, char *name)
{
    for ( ; listp != NULL; listp = listp­>next)
      if (strcmp(name, listp­>name) == 0)
          return listp;
    return NULL;
}
ツリー
• 二分木
ハッシュテーブル
• 要素数Nの配列を用意し、キーの値を元に、0
  からN-1までの値を取る関数(ハッシュ関数)に
  よってレコード(キーと値のペア)を格納する。




 出典:Wikipedia:ハッシュテーブル
まとめ
• 様々なアルゴリズムがある。
• 使えそうなアルゴリズムとデータ構造を選択し
  よう。
• 配列、リスト、ツリー、ハッシュテーブルが基本
  だ。
参考文献
• プログラミング作法、Braian W. Kernighan, Rob
  Pike, ISBN 4-7561-3649-4

More Related Content

PDF
すごいHaskell読書会 第六章 発表資料
PDF
Rubyによるデータ解析
PDF
Pythonデータ分析 第4回勉強会資料 12章
PDF
数式をnumpyに落としこむコツ
PDF
Pythonデータ分析 第3回勉強会資料 8章
PPTX
HashMapとは?
PDF
NumPy闇入門
PDF
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
すごいHaskell読書会 第六章 発表資料
Rubyによるデータ解析
Pythonデータ分析 第4回勉強会資料 12章
数式をnumpyに落としこむコツ
Pythonデータ分析 第3回勉強会資料 8章
HashMapとは?
NumPy闇入門
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築

What's hot (20)

PDF
Hash mapとは
PDF
Rustで始める競技プログラミング
PDF
Intoroduction of Pandas with Python
PDF
200319 eash python_shareslide_functions
PDF
MP Joinを使った類似データ抽出
PDF
R による文書分類入門
PPT
Tokyo r#10 Rによるデータサイエンス 第五章:クラスター分析
PDF
パターン認識 08 09 k-近傍法 lvq
PDF
パターン認識02 k平均法ver2.0
PPTX
Analyze by StatsModels or Numpy
PDF
プログラミングコンテストでの動的計画法
PDF
プログラミングコンテストでのデータ構造 2 ~動的木編~
PDF
SVM実践ガイド (A Practical Guide to Support Vector Classification)
PPTX
Vanishing Component Analysis
PDF
PPTX
LINQ概要
PPTX
LINQ の概要とかもろもろ
PDF
BASEでデータ処理の幅を広げよう
PDF
Infer.NETを使ってLDAを実装してみた
PDF
Divisor
Hash mapとは
Rustで始める競技プログラミング
Intoroduction of Pandas with Python
200319 eash python_shareslide_functions
MP Joinを使った類似データ抽出
R による文書分類入門
Tokyo r#10 Rによるデータサイエンス 第五章:クラスター分析
パターン認識 08 09 k-近傍法 lvq
パターン認識02 k平均法ver2.0
Analyze by StatsModels or Numpy
プログラミングコンテストでの動的計画法
プログラミングコンテストでのデータ構造 2 ~動的木編~
SVM実践ガイド (A Practical Guide to Support Vector Classification)
Vanishing Component Analysis
LINQ概要
LINQ の概要とかもろもろ
BASEでデータ処理の幅を広げよう
Infer.NETを使ってLDAを実装してみた
Divisor
Ad

Viewers also liked (20)

PPT
[12-D-7]デブサミ2009コミュニティLT勉強会勉強会
PDF
Internet and Opensource at Security and Programming camp 2011
PDF
Code Reading at Security and Programming camp 2011
PDF
勉強会カンファレンス2011、企業と勉強会
PDF
History of IT industry, Internet and Hacker Culture
PDF
Introduction to Git and GitHub #git_nyan
PDF
1000 speakers conference in English, 2nd, 1/20/2013
PDF
Rakuten Corporate profile
PDF
CUI -- How to Analyze History command
ODP
Sourcecode Reading Workshop2010
PDF
Hacker centric culture @devlove 110423
PDF
Jslinux
PDF
Security and Programming Camp 2011, Programming Course 2011/12/17
PDF
ハッカー中心の企業文化を日本で根付かせるには。TechLION vol.5 12/14/2011
ODP
Programming camp 共通科目オープンソース
PDF
Progcamp studygroup 100814
PDF
Progcamp internet 100801
PDF
HTC Welding Supervisor
PDF
consoliddated edison 2006 EIX Fin Stat-a
POT
Plantilla Power XL
[12-D-7]デブサミ2009コミュニティLT勉強会勉強会
Internet and Opensource at Security and Programming camp 2011
Code Reading at Security and Programming camp 2011
勉強会カンファレンス2011、企業と勉強会
History of IT industry, Internet and Hacker Culture
Introduction to Git and GitHub #git_nyan
1000 speakers conference in English, 2nd, 1/20/2013
Rakuten Corporate profile
CUI -- How to Analyze History command
Sourcecode Reading Workshop2010
Hacker centric culture @devlove 110423
Jslinux
Security and Programming Camp 2011, Programming Course 2011/12/17
ハッカー中心の企業文化を日本で根付かせるには。TechLION vol.5 12/14/2011
Programming camp 共通科目オープンソース
Progcamp studygroup 100814
Progcamp internet 100801
HTC Welding Supervisor
consoliddated edison 2006 EIX Fin Stat-a
Plantilla Power XL
Ad

Similar to programming camp 2008, introduction of programming, algorithm (20)

PPT
アルゴリズムとデータ構造1
PPT
アルゴリズムとデータ構造2
PPT
アルゴリズムとデータ構造10
PPT
アルゴリズムとデータ構造6
PPT
Pythonintro
PPT
Algorithm 速いアルゴリズムを書くための基礎
PPT
アルゴリズムとデータ構造15
PDF
Processing
PDF
アルゴリズムを楽しく!@PiyogrammerConference
PPTX
プログラミング模擬授業20180724
PDF
プログラミング入門
PPTX
純粋関数型アルゴリズム入門
PDF
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
PDF
データ構造と全探索
PDF
関数型プログラミング入門 with OCaml
PPT
アルゴリズムとデータ構造3
PPT
アルゴリズムとデータ構造11
PDF
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
PDF
アルゴリズム+データ構造勉強会(1)
アルゴリズムとデータ構造1
アルゴリズムとデータ構造2
アルゴリズムとデータ構造10
アルゴリズムとデータ構造6
Pythonintro
Algorithm 速いアルゴリズムを書くための基礎
アルゴリズムとデータ構造15
Processing
アルゴリズムを楽しく!@PiyogrammerConference
プログラミング模擬授業20180724
プログラミング入門
純粋関数型アルゴリズム入門
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
データ構造と全探索
関数型プログラミング入門 with OCaml
アルゴリズムとデータ構造3
アルゴリズムとデータ構造11
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
アルゴリズム+データ構造勉強会(1)

More from Hiro Yoshioka (20)

PDF
Infra study 2nd #1 人生100年時代の学び方,定年後の大学院生活
PDF
Infra study 2nd #1「インフラ技術者・研究者としてのキャリア」
PDF
不揮発性メモリ(NVM)とはなにか
PDF
続・人生100年時代の学び方
PDF
人生100年時代における学び方 定年後の学生生活
PDF
Thesis introduction "RECIPE : Converting Concurrent DRAM Indexes to Persisten...
PDF
人生100年時代の学び方、脳には可塑性がある
PDF
エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、「私のような仕事につく方法」、2019/06/23 DevLOVE X Day 1 D-7
PDF
OSSとの付き合い方。OSSから学んだこと。OSS貢献者賞受賞講演
PDF
エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、デブサミ 2019 【15-A-8】
PDF
未経験プログラマがコボルコンパイラを作った話 #compiler_study
PDF
Godel, Escher, Bach: an Eternal Golden Braid, reading club, Chapter 12
PDF
海外から見た東京 〜人生100年時代の働き方〜 #efsta56
PDF
理科系の作文技術
PDF
Agile Software Development advanced course (PBL) at AIIT, 2015
PDF
質問される力 #TechGirls
PDF
Oracle vs Google API 著作権裁判を考える
PDF
Using oss at an internet company and hacker culture
PDF
Be Hacker
PDF
Project Based Learning using by PaaS
Infra study 2nd #1 人生100年時代の学び方,定年後の大学院生活
Infra study 2nd #1「インフラ技術者・研究者としてのキャリア」
不揮発性メモリ(NVM)とはなにか
続・人生100年時代の学び方
人生100年時代における学び方 定年後の学生生活
Thesis introduction "RECIPE : Converting Concurrent DRAM Indexes to Persisten...
人生100年時代の学び方、脳には可塑性がある
エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、「私のような仕事につく方法」、2019/06/23 DevLOVE X Day 1 D-7
OSSとの付き合い方。OSSから学んだこと。OSS貢献者賞受賞講演
エンジニア人生と定年退職、人生100年時代のエンジニアの生き方、デブサミ 2019 【15-A-8】
未経験プログラマがコボルコンパイラを作った話 #compiler_study
Godel, Escher, Bach: an Eternal Golden Braid, reading club, Chapter 12
海外から見た東京 〜人生100年時代の働き方〜 #efsta56
理科系の作文技術
Agile Software Development advanced course (PBL) at AIIT, 2015
質問される力 #TechGirls
Oracle vs Google API 著作権裁判を考える
Using oss at an internet company and hacker culture
Be Hacker
Project Based Learning using by PaaS

programming camp 2008, introduction of programming, algorithm