31
アルゴリズムとデータ構造 3スタックと待ち行列 2013年10月10日 金岡 晃

アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

アルゴリズムとデータ構造第3週 スタックと待ち行列

2013年10月10日

金岡 晃

Page 2: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

授業計画

1

第1週

(9/26)

データ構造とアルゴリズムの基礎

第2週

(10/3)

アルゴリズムの効率、線形構造

第3週

(10/10)

スタックと待ち行列

第4週

(10/17)

文字列照合(KMP法、BM法)

第5週

(10/24)

木構造、木の走査

第6週

(10/31)

二分木、決定木

第7週

(11/14)

中間試験

第8週

(11/21)

休講

第9週

(11/28)

グラフ構造と最短路問題

第10週

(12/5)

解の探索:Aアルゴリズム

第11週

(12/12)

データ整列:ヒープソート法

第12週

(12/19)

データ整列:クイックソート法

第13週

(1/9)

データ探索:ハッシュ法

第14週

(1/16)

データ探索:木構造探索法

1/22-2/8 期末試験

2013/10/10 アルゴリズムとデータ構造

Page 3: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

【復習】第2週アルゴリズムの効率、線形構造

アルゴリズムとデータ構造

2 2013/10/10 アルゴリズムとデータ構造

Page 4: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

アルゴリズムの効率

2013/10/10 アルゴリズムとデータ構造3

𝑚𝑜𝑑の利用𝑛 𝑚𝑜𝑑 3を計算し、0になるかどうかを判定

3ずつ引いていく𝑛 = 𝑛 − 3を繰り返し計算し、1または2になったら0を出力、0になったら1を出力

各桁の数を足し合わせる

𝑛の各桁の数字を上位から取り出し、足して3での余りを調べる。すべての数字の処理が終わった結果が0だったら1を出力、それ以外(1または2)だったら0を出力

• 「𝑚𝑜𝑑の計算」と「減算」と「数字を取り出し、足して3での余りを調べる」の3つの作業はすべて同じ時間で実行できる

前提

作業の回数を見る

1回

𝑛/3 回

log10 𝑛 回

Page 5: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

オーダ記法

2013/10/10 アルゴリズムとデータ構造4

計算時間の近似的な目安

𝑂 𝑓 𝑛 と表現されたときの時間計算量

𝑂 𝑓 𝑛

𝑛が十分大きいところでは 𝑓 𝑛 に比例した処理時間になる。つまり𝑓 𝑛 の定数倍の時間として十分精度良く近似できる。

1. 𝑚𝑜𝑑の利用

2. 3ずつ引いていく

3. 各桁の数を足し合わせる

𝑂 1

𝑂 𝑛

𝑂 log 𝑛

𝑂 1 < 𝑂 log𝑛 < 𝑂 𝑛なので1→3→2の順に効率が良い

Page 6: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

演習1:𝑂 𝑛 、𝑂 𝑛2

• 計算量が𝑂 𝑛 、𝑂 𝑛2 の例をそれぞれ1つずつ考える– 「**という状況で***という問題を解く」というまず状況

設定と解かれるべき問題を書くこと

– 問題の解き方を書き、それがなぜそのオーダになるかを示すこと

2013/10/10 アルゴリズムとデータ構造5

Page 7: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

レコード

2013/10/10 アルゴリズムとデータ構造6

• データ構造の基本• 一般に複数のフィールド(Field、欄ともいう)からなる。• 各フィールドに名前を付け、格納できるデータの型も前もって指定

してある

レコードの定義:氏名(文字列)

年齢(非負整数)

識別子(非負整数)

各レコード: 山田太郎 54 99990001

佐藤次郎 20 99990002

鈴木一朗 39 99990003

Page 8: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

関係

2013/10/10 アルゴリズムとデータ構造7

レコードの集合があって、レコード間に何らかの関係をつくると、データ構造になる

順序関係• アルファベット順• 出席番号順• 背の順• 成績順

全順序関係 任意の2レコード間に必ず順序が決まっている関係

Page 9: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

全順序関係の定義

2013/10/10 アルゴリズムとデータ構造8

全順序関係

集合𝑆の任意の要素 𝑥, 𝑦, 𝑧 について、要素間の関係 𝑅 に関して次の4つの性質が成り立つものを、集合𝑆上の全順序関係と言う。

1.反射律: 𝑥𝑅𝑥2.推移律: 𝑥𝑅𝑦 ∧ 𝑦𝑅𝑧 ⇒ 𝑥𝑅𝑧3.反対称律: 𝑥𝑅𝑦 ∧ 𝑦𝑅𝑥 ⇒ 𝑥 = 𝑦4. 𝑥𝑅𝑦 ∨ 𝑦𝑅𝑥

∨:または∧:かつ⇒:ならば

• 数値の大小関係( ≤ )• 辞書式順序(アルファベット順、アイウエオ順)

Page 10: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

データの論理構造

2013/10/10 アルゴリズムとデータ構造9

• レコード𝑎, 𝑏, 𝑐, 𝑑を含むファイル𝑆• 全順序構造がある

𝑎 ≤ 𝑏𝑎 ≤ 𝑐𝑎 ≤ 𝑑

𝑏 ≤ 𝑐𝑏 ≤ 𝑑𝑐 ≤ 𝑑

本質的には𝑎 ≤ 𝑏 ≤ 𝑐 ≤ 𝑑

データの論理構造

𝑎 𝑏 𝑐 𝑑

レコード

関係

グラフになっている

Page 11: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

データの物理構造

2013/10/10 アルゴリズムとデータ構造10

𝑎 𝑏 𝑐 𝑑

上記の論理構造を物理的にコンピュータに格納する必要性がある

順配置1 a

2 b

3 c

4 d

リンク配置a b c d

論理構造から物理構造を構成することはプログラミングの重要な仕事

Page 12: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

演習2:全順序関係

• 数値をフィールドに持つデータ構造を作り、数値の大小関係(≤)を用いた3つのレコードを用意し、全順序関係を持つ集合𝑆を作ってください。

• またその集合が全順序関係を持つことを証明してください。

• 答案に書くもの

– 2-1:データ構造

– 2-2:集合𝑆

– 2-3:集合𝑆が全順序関係を持つことの証明

2013/10/10 アルゴリズムとデータ構造11

Page 13: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

演習2の回答例

2013/10/10 アルゴリズムとデータ構造12

2-1 氏名(文字列) 年齢(非負整数) 識別子(非負整数)

山田太郎 54 99990001

佐藤次郎 20 99990002

鈴木一朗 39 99990003

2-2

2-3 • 年齢で順序関係を構築• 各レコードを「山田」「佐藤」「鈴木」で示す

1. 山田≦山田、佐藤≦佐藤、鈴木≦鈴木 いずれも真

2. 佐藤≦鈴木 ∧ 鈴木≦山田 ⇒ 佐藤≦山田 真

3. 山田≦山田 ∧ 山田≦山田 ⇒ 山田=山田

佐藤≦佐藤 ∧ 佐藤≦佐藤 ⇒ 佐藤=佐藤

鈴木≦鈴木 ∧ 鈴木≦鈴木 ⇒ 鈴木=鈴木 いずれも真

4. 山田≦佐藤 ∨ 佐藤≦山田

山田≦鈴木 ∨ 鈴木≦山田

佐藤≦鈴木 ∨ 鈴木≦佐藤 いずれも真

1~4のすべてを満たすので、全順序関係である

Page 14: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

第3週スタックと待ち行列

アルゴリズムとデータ構造

13 2013/10/10 アルゴリズムとデータ構造

Page 15: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

本日の到達目標と概要

• 到達目標

– スタックとキューの概要を理解する

– 再帰的手続きを理解する

• 概要

– スタックとキュー

– 順配置表現でのスタックとキュー

– 再帰的手続き

– ハノイの塔

14 2013/10/10 アルゴリズムとデータ構造

Page 16: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

レコードの追加・削除の形態

2013/10/10 アルゴリズムとデータ構造15

線形リストへのレコード追加・削除

スタック(Stack)

レコードの追加・削除ともに線形リストの先頭においてのみ行われる

キュー(Queue)

レコードの追加は線型リストの末尾のみ、削除は先頭においてのみ行われる

Page 17: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

スタック

2013/10/10 アルゴリズムとデータ構造16

スタック(Stack)

レコードの追加・削除ともに線形リストの先頭においてのみ行われる

追加をプッシュ(push)、削除をポップ(pop)と呼ぶ

LIFO(Last-In First-Out)とも呼ばれる

• 机の上に積んだ本• スーパーやコンビニエンスストアの籠

Page 18: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

レコードの追加は線型リストの末尾のみ、削除は先頭においてのみ行われる

キュー(待ち行列)

2013/10/10 アルゴリズムとデータ構造17

キュー(Queue)

追加をEnqueue、削除をDequeueと呼ぶ

FIFO(First-In First-Out)とも呼ばれる

• 有名店の行列• コンビニエンスストアの飲料売り場

Page 19: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

順配置表現

2013/10/10 アルゴリズムとデータ構造18

a[1]

a[n]

先頭の位置 t

a[1]

a[n]

末尾の位置 r

先頭の位置の1つ前 f

スタック(Stack) キュー(Queue)

Page 20: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

再帰的手続き

2013/10/10 アルゴリズムとデータ構造19

再帰的手続き

手続き中にその手続き自身を呼び出すこと

再帰性:数学的帰納法、漸化式、フラクタル図形

漸化式の例: 𝑘𝑡 = 𝑘𝑡−1 + 𝑘𝑡−2

フラクタル図形の例:

Page 21: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

再帰的手続きの例:ハノイの塔

2013/10/10 アルゴリズムとデータ構造20

ハノイの塔

19世紀にEdouard Lucasにより発明されたゲーム。・3本のピンがある・穴の開いた大きさの異なる円盤が複数枚ある・最初は左端のピンに小さいものが上になるように積み重ねられている・すべての円盤を他のピンに移す・ただし、1度の1枚の円盤しか動かせない・小さな円盤の上に大きな円盤を載せることはできない

円盤が3枚のときの初期状態

Page 22: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

ハノイの塔:枚数3枚(𝑛 = 3)のとき

2013/10/10 アルゴリズムとデータ構造21

Page 23: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

ハノイの塔:枚数3枚(𝑛 = 3)のとき

2013/10/10 アルゴリズムとデータ構造22

操作に名称を付ける

𝑚𝑜𝑣𝑒(𝑖, 𝑗):ピン𝑖の頂上の円盤をピン𝑗に移す

1 2 3 1 2 3 1 2 3

1 2 3 1 2 3 1 2 3

1 2 3 1 2 3

𝑚𝑜𝑣𝑒(1,3) 𝑚𝑜𝑣𝑒(1,2)

𝑚𝑜𝑣𝑒(3,2) 𝑚𝑜𝑣𝑒(1,3) 𝑚𝑜𝑣𝑒(2,1)

𝑚𝑜𝑣𝑒(2,3) 𝑚𝑜𝑣𝑒(1,3)

Page 24: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

ハノイの塔:枚数𝑛枚のとき

2013/10/10 アルゴリズムとデータ構造23

操作に名称を付ける

𝐻𝑎𝑛𝑜𝑖 𝑛, 𝑖, 𝑗 : 𝑛枚の円盤をピン𝑖からピン𝑗に移す𝑖, 𝑗 = 1,2,3𝑖 ≠ 𝑗

1枚の時 𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒(𝑖, 𝑗)

2枚の時

𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒 𝑖, 𝑘 , 𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝑚𝑜𝑣𝑒(𝑘, 𝑗)

𝑘 = 6 − 𝑖 − 𝑗

1 2 3 1 2 3 1 2 3

𝑚𝑜𝑣𝑒(1,2) 𝑚𝑜𝑣𝑒(1,3)

1 2 3

𝑚𝑜𝑣𝑒(2,3)

Page 25: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

ハノイの塔:枚数𝑛枚のとき

2013/10/10 アルゴリズムとデータ構造24

操作に名称を付ける

𝐻𝑎𝑛𝑜𝑖 𝑛, 𝑖, 𝑗 : 𝑛枚の円盤をピン𝑖からピン𝑗に移す𝑖, 𝑗 = 1,2,3𝑖 ≠ 𝑗

𝑛枚の時

𝐻𝑎𝑛𝑜𝑖 𝑛, 𝑖, 𝑗 ∶ 𝐻𝑎𝑛𝑜𝑖 𝑛 − 1, 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝐻𝑎𝑛𝑜𝑖(𝑛 − 1, 𝑘, 𝑗)

𝑘 = 6 − 𝑖 − 𝑗

再帰的手続き

Page 26: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

ハノイの塔:𝑛 = 3のときの操作分解

2013/10/10 アルゴリズムとデータ構造25

𝐻𝑎𝑛𝑜𝑖 3, 𝑖, 𝑗 ∶ 𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝐻𝑎𝑛𝑜𝑖(2, 𝑘, 𝑗)

𝑘 = 6 − 𝑖 − 𝑗

𝐻𝑎𝑛𝑜𝑖 3, 𝑖, 𝑗 ∶ 𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝐻𝑎𝑛𝑜𝑖(2, 𝑘, 𝑗)

𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑘 ∶ 𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 , 𝑚𝑜𝑣𝑒 𝑖, 𝑘 , 𝐻𝑎𝑛𝑜𝑖 1, 𝑗, 𝑘

𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒 𝑖, 𝑗

𝐻𝑎𝑛𝑜𝑖 1, 𝑗, 𝑘 ∶ 𝑚𝑜𝑣𝑒 𝑗, 𝑘

𝐻𝑎𝑛𝑜𝑖 2, 𝑖, 𝑘 ∶ 𝑚𝑜𝑣𝑒(𝑖, 𝑗), 𝑚𝑜𝑣𝑒 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒(𝑗, 𝑘)

𝐻𝑎𝑛𝑜𝑖 2, 𝑘, 𝑗 ∶ 𝐻𝑎𝑛𝑜𝑖 1, 𝑘, 𝑖 , 𝑚𝑜𝑣𝑒 𝑘, 𝑗 , 𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗

𝐻𝑎𝑛𝑜𝑖 1, 𝑘, 𝑖 ∶ 𝑚𝑜𝑣𝑒 𝑘, 𝑖

𝐻𝑎𝑛𝑜𝑖 1, 𝑖, 𝑗 ∶ 𝑚𝑜𝑣𝑒 𝑖, 𝑗

𝐻𝑎𝑛𝑜𝑖 2, 𝑘, 𝑗 ∶ 𝑚𝑜𝑣𝑒(𝑘, 𝑖),𝑚𝑜𝑣𝑒 𝑘, 𝑗 ,𝑚𝑜𝑣𝑒(𝑖, 𝑗)

𝐻𝑎𝑛𝑜𝑖 3, 𝑖, 𝑗 ∶𝑚𝑜𝑣𝑒 𝑖, 𝑗 , 𝑚𝑜𝑣𝑒 𝑖, 𝑘 ,𝑚𝑜𝑣𝑒 𝑗, 𝑘 ,𝑚𝑜𝑣𝑒 𝑖, 𝑗 ,

𝑚𝑜𝑣𝑒(𝑘, 𝑖),𝑚𝑜𝑣𝑒 𝑘, 𝑗 , 𝑚𝑜𝑣𝑒(𝑖, 𝑗)

Page 27: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

演習1:ハノイの塔

• ”𝑛 = 3のときの操作分解“の例に従い、𝑛 = 4のときの操作分解を行え

2013/10/10 アルゴリズムとデータ構造26

Page 28: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

再帰的手続きの例:フィボナッチ数列

2013/10/10 アルゴリズムとデータ構造27

フィボナッチ数列

Leonard Fibonacciにちなんで名づけられた数列

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …

・次の数は、最後の数とその前の数を足した数になる

𝑓 0 = 1, 𝑓 1 = 1

𝑓 𝑖 = 𝑓 𝑖 − 1 + 𝑓(𝑖 − 2) 再帰的手続き

Page 29: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

フィボナッチ数列:𝑖 = 4のとき

2013/10/10 アルゴリズムとデータ構造28

𝑓 4 = 𝑓 3 + 𝑓(2)

= 𝑓 2 + 𝑓(1) + 𝑓(2)

= 𝑓(1 + 𝑓 0 ) + 𝑓(1) + 𝑓 1 + 𝑓 0

= 1 + 1 + 1 + 1 + 1

= 2 + 1 + 1 + 1

= 3 + 2

= 5

Page 30: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

演習2:フィボナッチ数列

• ”フィボナッチ数列:𝑖 = 4 “の例に従い、𝑖 = 6のときの操作分解を行え

2013/10/10 アルゴリズムとデータ構造29

Page 31: アルゴリズムとデータ構造 › classes › images › e › e7 › Alg...スタック(Stack) キュー(Queue) 再帰的手続き 19 2013/10/10 アルゴリズムとデータ構造

本日の到達目標と概要

• 到達目標

– スタックとキューの概要を理解する

– 再帰的手続きを理解する

• 概要

– スタックとキュー

– 順配置表現でのスタックとキュー

– 再帰的手続き

– ハノイの塔

30 2013/10/10 アルゴリズムとデータ構造