Transcript URL
アルゴリズムとデータ構造
( Algorithm and Data Structure )
第1回
オリエンテーション
アルゴリズムとは
本科目の目標
学習目標
プログラミングの基礎であるアルゴリズムと、それ
に伴うデータ構造について、正しい認識をもつ
代表的なデータの構造(配列、線形リスト、スタッ
ク、キュー、木)、および、データの操作の基本で
ある、並べ替え、検索等のアルゴリズムを学ぶこ
とで、良いプログラムを書くための基礎を養う
到達目標
基本的なアルゴリズムおよびデータ構造を理解し、
それらを活用したプログラム作成ができるように
なる
教科書・参考書
教科書
参考書
柴田望洋・辻亮介 共著 「新・明解 C言語によるアルゴリズムとデータ構造」
成績評価
成績評価
2/3回(10回)以上の出席を満たさない場合は期末
試験を受験できない(学内履修規定)
毎回講義後に演習問題を提示、最終日に期末試験
を実施
演習問題40%・期末試験60%の比率で総合評価
演習と試験の合計得点を100点満点に換算
優:80点以上
良:70点以上~80点未満
可:60点以上~70点未満
参考)IT関連の資格
出典: 情報処理技術者試験センター 試験の概要
http://www.jitec.jp/1_08gaiyou/_index_gaiyou.html
参考)基本情報技術者試験
出題分野
コンピュータ科学基礎
1 情報の基礎理論
1-1 数値表現・データ表現に関すること(基数変換,数値表現,文字表現,数値
計算(演算方式と精度,近似解法と方程式ほか),確率と統計,最適化問題 な
ど)
1-2 情報と理論に関すること(論理演算,符号理論,述語論理,状態遷移,計算
量,情報量,BNF,ポーランド表記法,集合 など)
2 データ構造とアルゴリズム
2-1 データ構造に関すること(2 分木,リスト,スタック,キュー など)
2-2 アルゴリズムに関すること(整列,探索,再帰,グラフ,文字列処理,フロー
チャート など)
コンピュータシステム
システムの開発と運用
ネットワーク技術
データベース技術
セキュリティと標準化
情報化と経営
第1回
アルゴリズムとは
アルゴリズムの数学的定義
数学的にアルゴリズムとは?
チャーチ(A.
Church)の提唱(1936年)
「チューリング計算可能関数,一般帰納的関数,λ定義
可能関数のクラスはすべて一致する.チューリングマシ
ンで記述可能な手続きをアルゴリズムと呼ぼう.」
S.C.Kleeneの帰納性(recursiveness)
K. Godel, E. Post, A. A. Markov
チューリングマシン
アラン・チューリング(A.M.
Turing,1936年)
「計算」を数学的にモデル化したマシン.
現在のコンピュータも理論的にはチューリングマシン.
チューリング賞はコンピュータ科学における最高権威.
暗号機械エニグマの解読に成功
チューリングマシン
有限状態制御部,半無限長のテープ,テープヘッドからなる
機械で,その動作は遷移関数によって定義される.
テープは加算無限個のセルの列で構成され,各セルには有限種類のテープ記号
(空白記号を含む)のうちのいずれか1つが記憶される.
b
d
a
a
α
c
b
a
c
…
テープヘッドは常にテープ上の1つのセルを指し,
1回の動作でセル1つ分右または左に移動する.
各動作によってテープヘッドの先のセルの内容が
読み書きされる.
有限状態制御部には有限種類の状態記号のうちのいずれか1つが記憶され,
動作の度に読み書きされる.状態記号のうちのいくつかは終了状態を表し,
終了状態になったときマシンは yes を出力し終了.
アルゴリズムとは
明確に定義された有限個の規則の集まりであって、
有限回適用することによって問題を解くもの
直感的には,与えられた問題を解くための処理手順
のこと.
プログラミング言語に依存しない.
(コンピュータができる前からアルゴリズムの概念はあっ
た.)
同一の問題に対して複数の解法が存在しうる.
→優れた解法,劣った解法?
解法1
問題A
解法2
解法3
最先端の研究とのつながり
・ アルゴリズムは、多くの分野で、先端科学とつながっている
(アルゴリズムが使われている、その分野で研究されている)
・ 特に、大きなデータがあって、データやモデルが数理的にシン
プルなところ
- 分子生物学
ヒトゲノムの大きさは30億文字なので、ヒトが扱うのは困難。
ATGCの4文字でコンピュータには有利。遺伝子や、ゲノムの変異
などはある程度の規則性を持つ。
- 情報化学
分子は基本的に原子の繋がりなので、同じくコンピュータで扱い
やすいが、立体と距離を含めた取り扱いが難しい。今後発展か?
最先端の研究とのつながり (2)
- 天文学
望遠鏡のコンピュータ化により、データが電子的に蓄積されてい
る。統合データベースもできつつある。今後は、データを総合的に
使った研究が始まるだろう。
- 物理学(素粒子、量子力学)
加速器から得られる情報の大きさは天文学的。今のところ、処理
して蓄積するだけで手いっぱい。
- 社会科学
シミュレーションによるミクロ的な要因を含む人間(社会)のシステ
ムを理解が進んできている
最先端の研究とのつながり (3)
- 建築学
構造計算による強度の計算だけでなく、最適化による、強度を
保ったまま部材を減らし軽量化する手法の研究など
- 文学
膨大な文献情報(古典を含む)のコンピュータ処理による知見の
発見
- その他全般
シミュレーションにより、現実世界のシステム的理解をする、シ
ミュレーション科学の進展
日本の最先端研究
・ アルゴリズムの分野は、日本の研究レベルは世界の中でも比較
的高い
- 最適化に対する内点法アルゴリズム、世界標準
- 離散数学と組合せ最適化アルゴリズム
- 圧縮アルゴリズムと簡潔索引
- データベース高速検索
- データマイニングアルゴリズム
- 計算幾何学アルゴリズム
...
・ 現在は理論中心であるが、将来的には工学のほうに成果が応
用されていくものと思われる
データとは?
現象や性質を何らかの枠組みに従って形式化したもの
身長、体重、座高、視力
家族構成、居住地、居住形態
CDに記録されている音
構造とは?
全体を形づくっている種々の材料による各部分の組み合
わせ。作りや仕組み。
さまざまな要素が相互に関連し合って作り上げている総
体。また、各要素の相互関係。
データ構造とは
アルゴリズムを実行するための『データ』や、ア
ルゴリズムの対象となる『情報』を、計算機(プ
ログラム)で表す(表現する)方法
データをコンピュータの記憶部分にどのように組
織化して格納するか(茨木)
2. データの表現方法
1.
よく用いられるデータ構造の例:
配列、リスト、スタック、キュー、グラフ、木、
ハッシュ
アルゴリズムとデータ構造の関係
Dr. Niklaus Wirth
(1934~、 1984年にACM チューリング賞を受賞した):
「アルゴリズム + データ構造 = プログラム」
データ構造を利用して,アルゴリズムをプログラミング言語で表現したもの
アルゴリズムを中心に考えれば、あるアルゴリズムは、特定
のデータ構造でおきなおすことが可能かもしれない
データ構造を中心に考えれば、あるデータ構造では簡単な
アルゴリズムで問題が解決するかもしれない
あるデータ構造のグループには共通のアルゴリズムが適用
できるかもしれない
そんなことを考え始めるのに役立つ本
良いアルゴリズムの条件(1)
信頼性が高い
(精度の良い,正しい結果が得られる)
処理効率が良い
処理時間の短い、
計算回数が少ない,
処理速度が速い,
大量のメモリ領域を使わない
一般性がある
(特定の問題だけでなく,他の問題にも適用できる)
良いアルゴリズムの条件(2)
拡張しやすい
(仕様変更に対し簡単に修正が行える)
わかりやすい
誰が見ても理解できる.
プログラムの保守がしやすい
短くコンパクト
移植しやすい
(他のシステムにも少ない労働で
稼働させることができる)
プログラムとは
1.
2.
3.
4.
5.
問題分析
何をするプログラムを書くのか決める (プログラム仕
様の決定)
どんなアルゴリズム,データ構造を使用すればよいかを
選択
実際にプログラミング言語を用いてプログラムを書く
プログラムが正しく動くことを保証する (検証)
つまり、設計したとおりにプログラムが動作するかテストする
6.
(マニュアルの作成やプログラムの性能評価を行う.)
この授業では,適切なアルゴリズム,データ構造を選ぶ能力を身に付ける.
良いアルゴリズム + 適切なデータ構造 = 実用的なプログラム
• 入力データの分量,CPUやメモリなどの資源を考慮して選択
• どんなアルゴリズム/データ構造があるのか一通り知っておく必要がある
注意点
本講義は「プログラミング」の講義ではない。
つまり、特定のプログラミング言語に習熟する
ことが目的ではない
使用するプログラミング言語に依存せず、ある
目的を達成するためのプログラムを作るため
の「基本的な知識と技術の習得」が目的
プログラムを作ることは要求する。それは、
「アルゴリズム」や「データ構造」が正しく実現
されているか、という検証のため
アルゴリズムの例-1
身長順の名簿が作りたい
50音順に並んでいるデータを身長順に並べ替
えるプログラムを作ろう
入力:50音順の名簿(5名分)
出力:身長順の名簿
青木
177
青木
177
小田
金子
佐藤
渡辺
158
167
174
170
佐藤
渡辺
金子
小田
174
170
167
158
アルゴリズムの例-1
身長順の名簿が作りたい
プログラム内でデータをどう表すか?
⇒データ型,データ構造の決定
名前は文字列で
表現しよう
身長は整数型?
実数型?
青木
小田
177
158
金子
佐藤
渡辺
167
174
170
1名分のデータをま
とめて管理できると
便利だな
5名分のデータの集合
をどう表わそう?
アルゴリズムの例-1
身長順の名簿が作りたい
どういう手順で処理し,欲しい結果を求める
か?
⇒アルゴリズムの決定
青木
小田
177
158
金子
佐藤
渡辺
167
174
170
アルゴリズムAは,
メモリをあまり使わないが,
処理が遅い
アルゴリズムBは,
メモリを大量に使用するが,
処理が高速
このデータを処理するには
どの方法が適している?
アルゴリズムの例-2
「ある正整数mが3の倍数であるかどうかを求
める」
入力:正整数 m
出力: 3の倍数かどうかの判定メッセージ
すべてのアルゴリズムは、ある問題(Problem)を解くという
目的で書かれる
1つの問題は無数の問題例(Problem instances)から成る。
例えば上記は、mを指定することによって定まる無数の問題
例の集合である。
例2:与えられた整数m(ただしm≧0)が3の倍数か否か。
計算手順(手続き)
Step A1:もしm=0ならば Step A4 へ。
Step A2:mから3を減ずる。
Step A3:Step A1 へ。
Step A4:「mは3の倍数である」と出力する。
Step A5:計算を停止する。
mが3の倍数でないとき,
この手順では処理が停止しない.
アルゴリズム
Step B1:もしm=0ならば Step B4 へ。
また,m<0ならば Step B6 へ。
Step B2:mから3を減ずる。
Step B3:Step B1 へ。
Step B4:「mは3の倍数である」と出力する。
Step B5:計算を停止する。
Step B6:「mは3の倍数ではない」と出力する。
Step B7:計算を停止する。
手続き(procedure)
注意点: アルゴリズムと手続きの違い
コンピュータにかけて実行できる
ように手続きを詳細にしたもの
⇒ プログラム(program)
操作の系列を並べたもの
有限ステップで停止するとは限らない
アルゴリズム
必ず有限ステップで
停止する
アルゴリズムの例-3
三つの整数値の最大値を求める
#include<stdio.h>
int main(void)
{
int a, b, c;
int max; /*最大値*/
printf(“3つの整数の最大値を求めます。\n”);
printf(“aの値:”); scant(“%d”, &a);
printf(“bの値:”); scant(“%d”, &b);
printf(“cの値:”); scant(“%d”, &c);
max = a;
If (b > max) max = b;
If (c > max) max = c;
① /* maxにaの値を代入*/ 順次構造
② /* bの値がmaxより大きければ, maxにbの値を代入 */
③ /* cの値がmaxより大きければ , maxにcの値を代入 */
選択構造
printf(“最大値は%dです。\n”, max);
return 0;
}
フローチャート
三つの最大値を求める手続きを流れ図(フローチャート)として図式化すると、プロ
グラムの流れが理解しやすくなる
処理の流れ
開始
a → max
双岐選択
Yes
b > max
b → max
No
Yes
c > max
c → max
No
終了
3値の大小関係の組み合わせ
a>b>c
Yes:
No:
b>c
a>b=c
b≧c
a>c>b
a≧c
a>c
a=c>b
c>a>b
a>b
a=b>c
a≧c
a≧b
a>c
a=b=c
c>a=b
b>a>c
a>c
b>a=c
a≧c
b>c>a
b≧c
b>c
b=c>a
c>b>a
決定木(decision tree)
フローチャートの記号 (1)
問題の定義・分析・解法の図的表現であるフローチャート(flowchart)と、その記
号は、以下の規格で定義されている。
プログラムフローチャートは、以下に示す記号から構成される
実際に行う演算を示す記号
制御の流れを示す線記号
プログラムフローチャートを理解し、かつ作成するのに便宜を与える特殊記号
(terminator)
(line)
(process)
フローチャートの記号 (2)
(data)
(decision)
(loop limit)
while文による繰り返し
1からnまでの整数の和を求まる
1+2+ … +n
#include <stdio.h>
int main(void)
{ int i,n,sum;
puts(“1からnまでの和を求めます。”);
printf(“nの値:”);
scanf(“%d”, &n);
sum = 0;
i = 1;
while (i <= n) {
sum += i;
i++;
}
①
/* iがn以下であれば繰り返す */
/* sumにiを加算 */
/* iの値をインクリメント */
printf(“1から%dまでの和は%dです。\n”, n , sum);
return 0;
}
②
1からnまでの整数の和を求まるフローチャート
開始
①
ここを通過する際のiとsumの値の変化
0 → sum
1→i
No
i≦n
Yes
②
sum + i → sum
i+1→i
i
sum
1
0
2
1
3
3
4
6
5
10
4を加える
6
15
5を加える
…
…
1を加える
2を加える
3を加える
5までの和
終了
for文による繰り返し
1からnまでの整数の和
#include <stdio.h>
開始
int main(void)
{ int i,n,sum;
puts(“1からnまでの和を求めます。”);
printf(“nの値:”);
scanf(“%d”, &n);
sum = 0;
for (i = 1; i <= n; i++)
sum += i;
}
合計
i : 1, 1, n
sum + i → sum
/* i = 1, 2, ... , n */
/* sumにiを加算 */
printf(“1から%dまでの和は%dです。\n”, n , sum);
return 0;
}
0 → sum
合計
終了
変数名 :
初期値, 増分,終値
iの値を1から
始めてnになる
まで1ずつ増やし
ながら処理を行う
まとめ
アルゴリズムの数学的定義
アルゴリズムとデータ構造の関係
プログラムとは
アルゴリズムの例1
身長順の名簿が作りたい
良いアルゴリズム + 適切なデータ構造 = 実用的な
プログラム
アルゴリズムの例2
「ある正整数mが3の倍数
であるかどうかを求める」
アルゴリズムと手続きの違い
アルゴリズムの例3
三つの整数値の最大値を求める
フローチャート
演習問題
第1問
整数 a、b を含め、その間の全整数の和を求めるフローチャートを記述せよ。
なお、a と b の大小関係にかかわらず和を求められるようにせよ。
また、a と b が等しい場合は、和は a(または b)そのものとなることとする。
第2問
第 1 問のフローチャートを実現する関数
int sumof(int a, int b)
を作成せよ。