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)
を作成せよ。