More Related Content More from Kenta Hattori (20) アルゴリズムとデータ構造12. 2011/4/19 アルゴリズムとデータ構造 1 2
本講座(全 15 コマ)の目的
基本的なアルゴリズムとデータ構造について
理解する
配列,リスト,スタック,キュー,ツリー,ソー
ト,ハッシュ, etc.
計算量の概念を理解し,与えられたアルゴリ
ズムのおおまかな計算量を見積もれるように
なる
簡単な問題なら,自分でアルゴリズムを設計
できるようになる
3. 2011/4/19 アルゴリズムとデータ構造 1 3
講義予定
第1回「イントロダクショ
ン」
第2回「制御構造,再帰」
第3回「配列とリスト」
第4回「スタック,
キュー」
第5回「ツリー(木)」
第6回「線形探索と2分探
索」
第7回「2分探索木」
第8回「平衡木」
第9回「ハッシュ法」
第10回「初等的な整列法」
第11回「整列アルゴリズム
II」
第12回「グラフアルゴリズ
ムI」
第13回「グラフアルゴリズ
ムII」
第14回「文字列」
第15回「アルゴリズムの設
計」
4. 2011/4/19 アルゴリズムとデータ構造 1 4
使用テキスト
本講座の内容は主に以下のテキストにもとづ
く
石畑清,「アルゴリズムとデータ構造」,岩波講
座ソフトウェア科学3.
ただし,言語は Python を用いる
Python 言語の説明は適宜行うので
知らなくてもOK
ちなみに,上記テキストでは Pascal を
使用している
5. 2011/4/19 アルゴリズムとデータ構造 1 5
なぜアルゴリズムを学ぶのか?
そもそもプログラミングとは
アルゴリズムとデータ構造をデザインすることにほかなら
ない
よくある反論
ライブラリを使えばいいじゃん
それに対する反論
ライブラリが提供するアルゴリズムを正しく使うには知識
が必要
ライブラリだけですべてが済むとは限らない
注意点
ただし,ライブラリで提供されているものはそれを使うこ
と
業務でプログラムを作成する場合には,自前で実装しない
こと
6. 2011/4/19 アルゴリズムとデータ構造 1 6
アルゴリズムとは何か?
矛盾なく定義された( well-defined )計算手続き
入力( input )として,値か値の集合を取り
出力( output )として,値か値の集合を生成する
入力から出力へ変換するための一連の計算ステップ
(計算)問題を解くための道具としてみることもで
きる
計算機に問題を解かせるために,アルゴリズムをプ
ログラミング言語によって記述したものがプログラ
ムである
アルゴリズム「でない」ものの例:
料理のレシピ
7. 2011/4/19 アルゴリズムとデータ構造 1 7
準備体操
任意桁の2つの正整数の足し算を行う手順
(筆算)を,正確に記述してみよ.
ただし,小学生は
1 桁同士の数の足し算は理解してるものとする.
0 (ゼロ)も繰り上がりも理解している.
数を(紙に書いておくなどして)記憶することも
できる
「もし~ならば,~せよ」という指示の理解でき
る.
「~まで,~を繰り返す」という指示も理解でき
る
8. 2011/4/19 アルゴリズムとデータ構造 1 8
解答例
足し合わせる2つの数字を,右揃えで縦に並べる.
1の位から始める
その位の数をそれぞれ足す.
もし,繰り上がりがあるなら,次の位に1を立てる.
全ての位について,上の手順を繰り返す
厳密に,漏れなく記述しようとすると,すごく面倒
くさい.
アルゴリズムの記述には曖昧さがあってはならない
9. 2011/4/19 アルゴリズムとデータ構造 1 9
Python について
本講座では Python でアルゴリズムを記述する
Python の主な特徴
オブジェクト指向スクリプト言語
ただし,本講座では「オブジェクト指向」な機能は用いない
構文(シンタックス)と意味(セマンティクス)がシンプ
ルで理解しやすい
ブロック構造をインデントによって表す
リストやディクショナリなど豊富な組込みデータ型
動的な型付け
・・・
準備作業:
各自のPCに Python ( version3.2 推奨)環境をインス
トールせよ
http://www.python.jp/Zope/download/pythoncore
10. 2011/4/19 アルゴリズムとデータ構造 1 10
Python によるプログラム例
入力:2組の数列 A と B
A = [a1,a2,…,an] , B = [b1,b2,…,bm]
1 の位から左から順に並べる.
出力:数列 S
S = [s1,s2,…]
手続き
def add(A,B):
S = [0]; n = len(A); m = len(B)
for i in range(0,max(n,m)):
if i < n: S[i] = S[i] + A[i]
if i < m: S[i] = S[i] + B[i]
if S[i] >= 10:
S[i] = S[i] - 10; S.append(1)
else:
S.append(0)
return S
11. 2011/4/19 アルゴリズムとデータ構造 1 11
ユークリッドの互除法
世界最古のアルゴリズムといわれてる
2つの正整数 p と q の最大公約数を求める
(1) p を q で割った余りを r とする
(2) r = 0 ならば q を答えとする
(3) r ≠0 のときは, q と r を新しい p と q として
(1) へ
問題: 54 と 39 の最大公約数をユークリッド
の互除法で求めてみよ
12. 2011/4/19 アルゴリズムとデータ構造 1 12
Python によるプログラム例(2)
ユークリッドの互除法
入力: 2 組の 1 以上の正整数 p と q
出力: p と q の最大公約数 r
手続き
def GCD(p,q):
while True:
r = p % q
if r == 0: return q
p, q = q, r
13. 2011/4/19 アルゴリズムとデータ構造 1 13
アルゴリズムの正しさ
正しいアルゴリズムとは:
すべての入力に対して,「停止し」,「正しい答
え」を出力する
正しくないアルゴリズム
ある入力に対して,「停止しない」
停止するが,答えが所望のものではない
⇒ 間違う確率が制御できる場合には,有用な「正し
くないアルゴリズム」もある
例:確率的な素数判定法
14. 2011/4/19 アルゴリズムとデータ構造 1 14
アルゴリズムの応用例
ヒトゲノムの解読
30 億もの塩基配列の情報を特定し,データベー
スに格納し,データ解析のツールを開発する.
インターネットのルーティング
ネットワークのデータを適切なあて先に届けるた
めの経路を見つける.
E コマースサービスの基盤
クレジットカードの番号やパスワード情報を秘密
にしておくための暗号アルゴリズム.
などなど.
15. 2011/4/19 アルゴリズムとデータ構造 1 15
データ構造とは
簡単に参照したり変更したりするために,
データを格納し組織化するための方法
全ての目的に適う,万能のデータ構造は無い
さまざまなデータ構造の利点と限界を知ることは
非常に重要.
16. 2011/4/19 アルゴリズムとデータ構造 1 16
困難な問題
世の中には,効率良い解法が見つかっていない問題
もある.
答えが得られるまで非常に長い時間がかかる
NP 完全問題
そのような問題群の重要なサブセット
これまで, NP 完全問題を解く効率良いアルゴリズムは見つ
かっていないが,かといってそのようなアルゴリズムが存在
しないことは誰も証明していない
NP 完全問題のうち, 1 つでも問題が効率よく解けるアルゴ
リズムが見つかれば,他の NP 完全問題も効率よく解ける.
いくつかの NP 完全問題は,それと良く似た形の簡単に解け
る問題がある.
実世界の問題には, NP 完全な問題も数多く表れる
NP 完全問題について知ってないと無駄な時間を費やすこと
に...
17. 2011/4/19 アルゴリズムとデータ構造 1 17
NP 完全問題の例
中央倉庫を持つトラック配送会社
倉庫でトラックに荷物を積み,配達のためにいく
つかの拠点に積荷を送って回る.
1 日の割りに,トラックは中央倉庫に戻ってくる
.
コストを削減するために,なるべく少ない距離で
拠点を訪問したい.
じつは,「巡回セールスマン問題」として知
られる NP 完全問題
18. 2011/4/19 アルゴリズムとデータ構造 1 18
アルゴリズムの計算量
一般に同じ問題を解くのにも,様々なアルゴ
リズムが考えられる.
アルゴリズムの良し悪しの評価基準
答えを出すまでにどれくらい計算時間がかかるか
時間計算量と呼ぶ
Cf. 計算のためにどれくらいメモリを消費するかについ
て,空間計算量という概念もある
19. 2011/4/19 アルゴリズムとデータ構造 1 19
O (オー)記法について
データサイズに対する計算量の増え方の度合を表し
たもの
定義:
関数 g(n) が O(f(n)) であるとは,定数 c0 と n0 が存在
して, n > n0 であるすべての n に対して g(n) < c0 ・
f(n) が成り立つことである
アルゴリズムでよく見られるオーダー
O(1) -定数オーダー,データサイズによらず一定
O(log N) -対数オーダー,二分探索など.
O(N) -線形探索など
O(NlogN) -マージソート,高速フーリエ変換など
O(N2
) -単純なソート,クイックソートの最悪ケースなど
O(CN
) -指数オーダー
20. 2011/4/19 アルゴリズムとデータ構造 1 20
計算量と計算時間の関係
n=100 のときに 1 秒かかるとして計算
特に明記していない欄の単位は秒
計算量 n=10 20 50 100 200 500 1000 10000
O(1) 1 1 1 1 1 1 1 1
O(log n) 0.5 0.65 0.85 1 1.15 1.35 1.5 2
O(n) 0.1 0.2 0.5 1 2 5 10 100
O(n log n) 0.05 0.13 0.42 1 2.3 6.75 15 200
O(n2
) 0.01 0.04 0.25 1 4 25 100 2.78 時
間
O(n3
) 0.001 0.008 0.125 1 8 125 1000 11.6 日
O(2n
) 0.001 1.02 34.8
年
― ― ― ― ―