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読書会 第六章 発表資料
Hiromasa Ohashi
 
PDF
Rubyによるデータ解析
Shugo Maeda
 
PDF
Pythonデータ分析 第4回勉強会資料 12章
Makoto Kawano
 
PDF
数式をnumpyに落としこむコツ
Shuyo Nakatani
 
PDF
Pythonデータ分析 第3回勉強会資料 8章
Makoto Kawano
 
PPTX
HashMapとは?
Trash Briefing ,Ltd
 
PDF
NumPy闇入門
Ryosuke Okuta
 
PDF
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tatsuya Tojima
 
すごいHaskell読書会 第六章 発表資料
Hiromasa Ohashi
 
Rubyによるデータ解析
Shugo Maeda
 
Pythonデータ分析 第4回勉強会資料 12章
Makoto Kawano
 
数式をnumpyに落としこむコツ
Shuyo Nakatani
 
Pythonデータ分析 第3回勉強会資料 8章
Makoto Kawano
 
HashMapとは?
Trash Briefing ,Ltd
 
NumPy闇入門
Ryosuke Okuta
 
Tokyo.R 41 サポートベクターマシンで眼鏡っ娘分類システム構築
Tatsuya Tojima
 

What's hot (20)

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

Viewers also liked (20)

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

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

PPT
アルゴリズムとデータ構造1
Kenta Hattori
 
PPT
アルゴリズムとデータ構造2
Kenta Hattori
 
PPT
アルゴリズムとデータ構造10
Kenta Hattori
 
PPT
アルゴリズムとデータ構造6
Kenta Hattori
 
PPT
Pythonintro
Mikio Kubo
 
PPT
Algorithm 速いアルゴリズムを書くための基礎
Kenji Otsuka
 
PPT
アルゴリズムとデータ構造15
Kenta Hattori
 
PDF
Processing
Akifumi Nambu
 
PDF
アルゴリズムを楽しく!@PiyogrammerConference
Kensuke Otsuki
 
PPTX
プログラミング模擬授業20180724
義広 河野
 
PDF
プログラミング入門
Kenji Azami
 
PPTX
純粋関数型アルゴリズム入門
Kimikazu Kato
 
PDF
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
hixi365
 
PDF
データ構造と全探索
京大 マイコンクラブ
 
PDF
関数型プログラミング入門 with OCaml
Haruka Oikawa
 
PPT
アルゴリズムとデータ構造3
Kenta Hattori
 
PPT
アルゴリズムとデータ構造11
Kenta Hattori
 
PDF
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
Ryota Nakamura
 
PDF
アルゴリズム+データ構造勉強会(1)
noldor
 
アルゴリズムとデータ構造1
Kenta Hattori
 
アルゴリズムとデータ構造2
Kenta Hattori
 
アルゴリズムとデータ構造10
Kenta Hattori
 
アルゴリズムとデータ構造6
Kenta Hattori
 
Pythonintro
Mikio Kubo
 
Algorithm 速いアルゴリズムを書くための基礎
Kenji Otsuka
 
アルゴリズムとデータ構造15
Kenta Hattori
 
Processing
Akifumi Nambu
 
アルゴリズムを楽しく!@PiyogrammerConference
Kensuke Otsuki
 
プログラミング模擬授業20180724
義広 河野
 
プログラミング入門
Kenji Azami
 
純粋関数型アルゴリズム入門
Kimikazu Kato
 
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
hixi365
 
データ構造と全探索
京大 マイコンクラブ
 
関数型プログラミング入門 with OCaml
Haruka Oikawa
 
アルゴリズムとデータ構造3
Kenta Hattori
 
アルゴリズムとデータ構造11
Kenta Hattori
 
[CE94] 高等学校での「プログラミング」教育の導入– PEN を用いて (発表資料)
Ryota Nakamura
 
アルゴリズム+データ構造勉強会(1)
noldor
 

More from Hiro Yoshioka (20)

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

Recently uploaded (6)

PDF
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
PDF
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
PDF
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
PDF
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
PPTX
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
PDF
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 
20250730_QiitaBash_LT登壇資料_PDC_Kurashina.pdf
pdckurashina
 
20250729_Devin-for-Enterprise
Masaki Yamakawa
 
【学会聴講報告】CVPR2025からみるVision最先端トレンド / CVPR2025 report
Sony - Neural Network Libraries
 
TaketoFujikawa_ComicComputing12th_inKumamoto
Matsushita Laboratory
 
baserCMS『カスタムコンテンツ』徹底活用術〜あなただけの管理画面を自由自在に〜
Ryuji Egashira
 
MahiroYoshida_セリフに着目したキャラクタロール推定に関する基礎検討_sigcc12th2025
Matsushita Laboratory
 

programming camp 2008, introduction of programming, algorithm