平成26年度前期 データ構造とアルゴリズムⅠ 第2回

平成26年度前期
データ構造とアルゴリズムⅠ
第2回
そもそも、アルゴリズムって何なの?
アルゴリズムとは
Computational Procedure (T. Cormen et.,al.)
=「Computational 問題」の「処理手順」
「問題処理」のProcess
1. 問題設定
2. 問題処理法(or 解決法)の立案
3. 問題処理(or 解決法)の実施
4. 問題解決
データ構造
データに関すること
• データ型と変数
構造に関すること
• データの保管・管理方法
本日の講義内容
データに関すること
• データ型と変数
– 「値」
– 「変数」とは
– 「配列」とは
– 何故、配列を使うのか?
何故、データ(Data)を学ぶの?
アルゴリズム
⇒「問題」を解決し、「結果」を得るための処理手順
計算機(コンピュータ)において、
「問題」は“データ”(data)という形で入力
「結果」は“データ” (data)という形で出力
⇒データの表現が必要
Q. データは何で表現(定義)するのか?
A. 定数・変数・配列で表現
チキンカレーを作りたい
レシピ=アルゴリズム
チキンカレーを作るのに必要な情報は?
・材料と量
玉葱 2玉
マーガリン 大2 ニンニク 小1 とり手羽元 10本
塩コショー 少々
オリーブ油 大1 ◎水 800cc
◎コンソメ 大1 ◎ローリエ 2枚
◆カレールー 半箱
◆ウスターソース 大2 ◆カレー粉 大1 材料 = Data
・作り方
1. 耐熱皿に玉葱を平らに
入れ、ラップ無しレンジ
で5分(600W)加熱する
2. お鍋にマーガリン・ニン
ニクを熱し①を加え、タ
マネギが飴色になるまで
中火で炒める(約10分)
一旦、取り出す
3. 同じ鍋を軽く拭き取って
からオリーブ油を熱し、
塩コショーした鶏肉を両
面軽く焼き色が付くまで
焼く
・・・
処理 = Processing
データ型(Data Type)
データには“型”がある!
e.g. チキンカレーを作る
・材料と量
玉葱 2玉
マーガリン 大2 ニンニク(みじん切り) 小1 とり手羽元 10本
塩コショー 少々
オリーブ油 大1 ◎水 800cc
◎コンソメ 大1 ◎ローリエ 2枚
◆カレールー 半箱
◆ウスターソース 大2 ◆カレー粉 大1 ◆ハチミツ 大1 ◆砂糖 小2
・具材
玉葱
マーガリン
ニンニク
とり手羽元
・分量
2玉
大2
小1
10本
・調味料
塩コショー
オリーブ油
◎水
◎コンソメ
◎ローリエ
◆カレールー
◆ウスターソース
◆カレー粉
◆ハチミツ
◆砂糖
・時間
・火加減
表現することによっていろいろあって、
最適なものを使う
データ型(Data Type)
データには“型”がある
計算機も同じ
e.g. “文字”表現と“数字”表現では全く違う
“目的”に応じたデータ型を使う
整数型 0, 123, ‐999, 9999
数字を扱う
データ型
実数型 1.23, ‐99.9, 0.001
文字型 A, あ, イ
文字を扱う
文字列型 ABC, 岩田
日付を扱う
日付型
数字に沢山のデータ型がある理
由は処理論で習ってください
値(Value)
データ=情報表現
データの具体的な表現を「値」と呼ぶ
e.g. チキンカレー
・具材
玉葱(みじん切り)
マーガリン
ニンニク
とり手羽元
水
「物」を表している「値」
・分量
2玉
大2
小1
10本
500cc
「数」を表している「値」
数字はデータ型に合わせて表現していればOK
値(Value)
プログラムを書く際の約束事 of 文字&文字列
文字型の値には、シングル・クォーテションを付ける
‘A’ ‘あ’
文字列型の値には、ダブル・クォーテションを付ける
”JAPAN” “アルゴリズム”
Q. 何故、上記の約束があるのか?
A. 数字列の数と、文字列の数を区別するため
=10と”10”は計算機からすると全く違う値である
練習
以下の値を表現するのに用いるべきデータ型は何
か?
1. 120
2. ‐3
3. 0.98
4. ‐0.88
5. 1.00
6. A
7. 金曜日
8. 休日
9. 10月11日
変数(Valuable)
• 「変数」とは「値」を入れておく「皿」 「引出し」
e.g. チキンカレーを作る
みじん切りした玉ねぎを「皿」に「おいておく」
水800ccを準備して「カップ」に「おいておく」
野菜をいためて「ボール」に「おいておく」
e.g. 郵便局の仕分け作業
○○さん宛の郵便物を□□地域の「箱」に「いれておく」
上記の作業例では、
「玉ねぎ」、「水」、「野菜」、「○○さん宛の郵便物」がデータ
それらは、作業過程において、皿なり、箱なりに「保管」し、
出し入れしている
プログラムにおいて、この「皿」「箱」にあたるのが「変数」
変数(Valuable)
e.g. ユークリッドの互除法
最大公約数を求める2つの数 X, Y (X≧Y)
XをYで割った余り R
最低、この3つの変数が最大公約数を探すのに必要
最大公約数の算出
・材料
最大公約数を求める2つの数
X, Y (X≧Y)
・処理
ユークリッドの互除法
定理
「XをYで割った余りRとYの最大公約
数は、XとYの最大公約数に等しい」
X/Y=a1余りR1
Y/ R1=a2余りR2
R1/ R2=a3余りR4
・・・
Rm‐1/Rm=am+1余り0
この時のamがXとYの最大公約数
証明
X=a1*Y+R1
X=α*m, Y=β*m (m : X と Y の最大公約数)
R1=X‐a1*Y=α*m‐a1*β*m=(α‐a1*β) *m
R1はmを約数に持つが、mはXとYとの最大公約数であるから、
mはYとR1の最大公約数
変数(Valuable)
e.g. ユークリッドの互除法
最大公約数を求める2つの数 X, Y (X≧Y)
XをYで割った余り R
最低、この3つの変数が最大公約数を探すのに必要
変数に値を入れることを「代入」(Substitution)するという
注意点
一つの「引出し」に代入できる「値」は一つ
ただし、上書きはできる
=同じ変数に別の値を代入すると、前の値は消去され、新
たに代入された値になる
変数(Valuable)
引出には「名前」を付け、定義しなければならない
In V.B. or C++
e.g. Dim i as Integer = iを整数型で定義する
Dim s as string = sを文字型として定義する
変数を定義するときの約束事
1. ユニークでなければならない
=同じ名前の変数を定義してはならない。名前が違えば、
基本、何でもOKだが、プログラミング言語によっては、予
約変数がある(e.g. pi, e, etc)
2. 数字のみ、または、数字から始まってはいけない
=数字の「値」と区別するため
代入(Substitution)
「代入」とは、変数に値を与える行為
表現する場合、必ず、左辺が変数、右辺が値
・変数名←値
・変数名 = 値
e.g. Aという変数に10という値を代入する場合
A←10
A = 10
代入(Substitution)
「代入」とは、変数に値を与える行為
表現する場合、必ず、左辺が変数、右辺が値
・変数名←値
・変数名 = 値
e.g. strという変数に”ABC”を値を代入する場合
str←”ABC”
str = ”ABC”
代入(Substitution)
「代入」とは、変数に値を与える行為
右辺に算術記号があってもよい
e.g. A←10+5
A = 10+5
であれば、Aに15(=10+5)を代入するという意味
B ← 10*5
B = 10*5
であれば、Aに50(=10*5)を代入するという意味
代入(Substitution)
「代入」とは、変数に値を与える行為
右辺に関数があってもよい
e.g. A←abs(sqrt(9))
A = abs(sqrt(9))
であれば、Aに3(√9の絶対値)を代入するという
意味
B←10 mod 3
B = 10 mod 3
であれば、Bに1(10を3で割った余り)を代入
代入(Substitution)
「代入」とは、変数に値を与える行為
変数に変数を代入することもできる(コピー)
e.g. A←3
B←A
であれば、Bに3(= A)を代入する
A←3
B←2
C ←A+B
であれば、Cの値は5である
代入(Substitution)
「代入」とは、変数に値を与える行為
プログラミングでよく使用することに、自分に自分
を代入する場合がある(後に扱う)
e.g. A←A
AにAを代入する
A←A+3
AにA+3を代入する
変数のデータ型
変数は必ず、”型”を宣言して定義される
In V.B. or C++
e.g. Dim i as Integer = iを整数型で定義する
Dim s as string = sを文字型として定義する
そして、値は同型の変数にしか、代入できない
Dim i as Integer
i = 10 はOK
i = “ABC”は×
i = 0.9 は×
練習
以下の計算結果を述べよ
第1問
A=2, B=3,
A + B = ?
第2問
A=‘5’, B=‘1’,
A + B = ?
配列(Array)
• 「配列」とは「変数」が並んだ「たんす」
e.g. チキンカレー
・具材
玉葱
マーガリン
ニンニク
とり手羽元
水
A_Guzai[i]
A_Guzai[0] = 玉葱
A_Guzai[1] = マーガリン
A_Guzai[2] = ニンニク
A_Guzai[3] = とり手羽元
A_Guzai[4] = 水
e.g. 1年365日の気温
365個のデータ
このように、沢山のデータを保持するために
用いるのが「配列」
配列(Array)
• 「配列」とは「変数」が並んだ「たんす」
e.g. チキンカレー
・具材
玉葱(みじん切り)
マーガリン
ニンニク
とり手羽元
水
具材
A = “玉葱”
B = “マーガリン”
C = “ニンニク”
D = “とり手羽元”
E = “水”
配列
=変数が隙間なく、連続
に並んだもので、変数が
「引出し」とすれば、「たん
す」に対応する
・具材 Dim Gu[5] as String
Gu[0] = “玉葱(みじん切り)”
Gu[1] = “マーガリン”
Gu[2] = “ニンニク”
Gu[3] = “とり手羽元”
Gu[4] = “水”
配列(Array)
配列の約束事 = 大体は「変数」と同じ
1. ユニークでなければならない
=同じ名前の変数を定義してはならない。名前が
違えば、基本、何でもOK
2. 数字のみ、または、数字から始まってはいけな
い
=数字の「値」と区別するため
3. 一配列で扱う値は、同じ型でなくてはなら
ない
配列の表示方法
配列は、
配列要素(=引出し)
配列用素数(= 配列要素の数)
要素番号(=引出しについた番号)
で表す
Dim Array[100] as Integer
Array[0]=0
配列要素
Array[1]=2
要素番号
配列表示した場合の要素番号のことを”添え字”(suffix or index)と呼ぶ
配列の表示方法
「Base 0」と「Base 1」
Base 0
配列の要素番号を”0”~”N‐1”で表す
Base 1
配列の要素番号を”1”~”N”で表す
Dim Array[100] as Integer
Array[0]=0
Array[1]=2
こいつは、Base 0
配列の表示方法
配列へのアクセス
m番目の引出し(=配列要素)にアクセスするときは
Array[m] or Array(m)
と書く
(2つの違いは、プログラミングで習うこと)
e.g.
m番要素に5を代入する ⇔ Array[m]=5
変数aにm番要素を代入する ⇔ a=Array[m]
変数bにm番要素を加える ⇔ b + Array[m]
m番要素にm+1番要素を加える ⇔ Array[m]+ Array[m+1]
何故、配列か?
e.g. 牛肉、 豚肉、 鶏肉の必要量を管理したい場合
変数を3つ用意して管理する
Weight_Beef
Weight_Pork
Weight_Chicken
3種類程度であれば、行けるが、40種類もあると、
40の変数で管理するのは、非効率
配列 Weight_Meet
として、 Weight_Meet[0]~ Weight_Meet[39]で管理
した方が効率的
何故、配列か?
繰り返し操作をする場合、”添え字”で操作できる配
列が便利
e.g. 牛肉、 豚肉、 鶏肉の必要量の和を出したい
Sum = Weight_Beef + Weight_Pork + Weight_Chicken
↓
Sum = Weight_Meet[0] + Weight_Meet[1] + Weight_Meet[2]
40種類ある場合、
Sum = 0
Weight_Meet[i]
(詳しくは、後日)
多次元配列
e.g. 学生の英語・数学の得点を管理したい
77
66
88
78
65
70
…
…
75
55
これを添え字2つを使って
Name_E_M[i,j](0≦i≦ 99, 0≦j≦ 99 )
として管理する場合、 Name_E_M [0,0]を2次元配列と呼ぶ
太郎の英語と数学は
Name_E_M[0,0]=77, Name_E_M[0,1]=66
で表す
添え字が3つあれば、3教科
多次元配列の約束事
• 表示方法
n次元配列では、配列要素をn個の添え字を使って
A[i, j, …] or A(i, j, …)
または、
A[i][j][]… or A(i)(j)…
と表示する
• 縦、横、高さ…の数が一致していなければならない
構造体配列
e.g. 学生の身長・体重の得点を管理したい
身長(cm)
体重(kg)
太郎
177
66
一郎
188
78
次郎
165
70
175
55
・・・
百太郎
これを添え字2つを使って
Name_L_W[i,j](0≦i≦ 99, 0≦j≦ 99 )
として管理する場合、 Name_L_W [0,0]を2次元配列と呼ぶ
太郎の英語と数学は
Name_L_W[0,0]=77, Name_L_W[0,1]=66
で表す
添え字が3つあれば、3種類
多次元配列と構造体配列の違い
多次元配列
構造体配列
身長(cm)
体重(kg)
太郎
177
66
70
一郎
188
78
…
…
次郎
165
70
75
55
・・・
175
55
77
66
88
78
65
百太郎
表でみると、ほとんど同じ → Q. 何が違うの?
A. メモリ内でのデータ管理が違う
多次元配列
77
88
65
…
75
66
78
70
…
55
構造体配列
太郎
177
一郎
66
188
次郎
78
165
百太郎
…
70
…
…
175
55
文字型と文字列型
計算機側の文字の理解
計算機は、数字しか理解しない
= 文字は文字コードと呼ばれる決まりで表現される
e.g. ‘0’=48, ‘1’=49, ‘A’=65, ‘B’=66, ‘C’=67, ‘+’=43, ‘‐’=45
など
文字列型は、文字型の配列で表現
e.g. Str[0]=‘A’, Str[1]=‘B’, Str[2]=‘C’,
“ABC”=Str[0]+Str[1]+Str[2]=’A’+’B’+’C’
練習