• 検索結果がありません。

「アルゴリズムとデータ構造」資料

N/A
N/A
Protected

Academic year: 2021

シェア "「アルゴリズムとデータ構造」資料"

Copied!
14
0
0

読み込み中.... (全文を見る)

全文

(1)

「アルゴリズムとデータ構造」資料 8 動的計画法とメモ化

奈良女子大学生活環境学部 鴨浩靖

2010年6月30日初版 2014年1月20日 第二版 2020年12月7日 第三版

(2)

1

次の式で定義される数列の第n項を求める。

a0=1

an=a⌊n/3⌋+a⌊n/2⌋ (n>0のとき)

(3)

素朴な再帰呼び出し

漸化式の通りに再帰呼び出しで実装する。

(4)

素朴な再帰呼び出しによる例 1 の実装

int mikan(int x) {

if (x > 0) { int y3, y2;

y3 = mikan(x / 3);

y2 = mikan(x / 2);

return y3 + y2 } else {

return 1;

} }

(5)

素朴な再帰呼び出しの実行例

a12 oo a4oo a1oo a0

a0

ff

a2

ff

a0

oo

a1

ff

a0

oo

a0

ff

a6

cc

a3

oo a1oo a0oo

a0

ff

a1

ff

a0

oo

a0

ff

a2

ee

a0

oo

a1

ff

a0

oo

a0

ff

同じ計算を何度も行っている。

(6)

動的計画法

小さいほうから計算し、計算結果は記録し再利用する。

(7)

動的計画法による例 1 の実装

int mikan_array[SIZE];

void init_mikan_array() {

int i;

mikan_array[0] = 1;

for (i = 1; i < SIZE; i ++) { mikan_array[i]

= mikan_array[i / 2] + mikan_array[i / 3];

} }

int mikan(int x) {

return mikan_array[x];

}

(8)

動的計画法による例 1 の(ちょっとトリッキーな)実装

int mikan(int x) {

static char initialized;

static int array[SIZE];

if (!initialized) { int i;

array[0] = 1;

for (i = 1; i < SIZE; i ++) {

array[i] = array[i / 3] + array[i / 2];

}

initialized = 1;

}

return array[x];

}

(9)

動的計画法の実行例

a0 a1

++

a2

a3

a4

a5

a6

a7

a8

a9

a10

a11

a12

不要なものまで計算している。

(10)

メモ化

途中の計算結果を記録しながら計算し、同じ計算が必要になった ら以前の計算結果を再利用する。

(11)

メモ化による例 1 の実装

int mikan(int x) {

static char marks[SIZE]; static int array[SIZE];

if (!marks[x]) { if (x > 0) {

int y3 = mikan(x / 3); int y2 = mikan(x / 2);

array[x] = y3 + y2;

} else {

array[x] = 1;

}

marks[x] = 1;

}

return array[x];

}

(12)

メモ化の実行例

a12 oojj a4oojj a1ookk a0

a2ooff a6[[oo a3hhaa

(13)

アルゴリズムの選び方

▶ 計算の重複が起きる心配がないか、気にならないほど頻度が 低い場合は、素朴な再帰呼び出しで十分。

▶ 計算に必要な値がとびとびの場合は、メモ化が計算時間を節 約できて良い。

▶ 計算に必要な値がぎちぎちの場合は、動的計画法が計算時間 を節約できて良い。

うまく使い分けると良い。

(14)

ACM ICPC 問題

1999年アジア地区予選京都大会問題A Square Coins

素朴な再帰でもメモ化でも動的計画法でも可。

2007年アジア地区予選東京大会問題C Minimal Backgammon 動的計画法が最適。

参照

関連したドキュメント

【こだわり】 ある わからない ない 留意点 道順にこだわる.

22年度 23年度 24年度 25年度 配置時間数(小) 2,559 日間 2,652 日間 2,657 日間 2,648.5 日間 配置時間数(中) 3,411 時間 3,672 時間

19年度 20年度 21年度 22年度 配置時間数(小) 1,672 日間 1,672 日間 2,629 日間 2,559 日間 配置時間数(中) 3,576 時間 2,786 時間

平成30年度

マニピュレータで、プール 内のがれきの撤去や燃料取 り出しをサポートする テンシルトラスには,2本 のマニピュレータが設置さ

マニピュレータで、プール 内のがれきの撤去や燃料取 り出しをサポートする テンシルトラスには,2本 のマニピュレータが設置さ

東京電力パワーグリッド株式会社 東京都千代田区 東電タウンプランニング株式会社 東京都港区 東京電設サービス株式会社

東電不動産株式会社 東京都台東区 株式会社テプコシステムズ 東京都江東区 東京パワーテクノロジー株式会社 東京都江東区