情 ★報 ★科 ★学
Pascalに
よる
デー タ構造 古東 馨 著
東京電機大学 出版局
まえがき
プ ロ グ ラ ミ ング を初 め て 学 ぶ 人 に 対 す る忠 告 と して,「 プ ロ グ ラム を 書 くこ と は,小 説 を書 くこ とで あ る」 とい う例 え を よ く耳 に す る.小 説 もプ ロ グ ラ ム も正 確 に書 か な け れ ば な ら な い の は 当然 で あ るが,修 辞 上 の 善 しあ しだ けで 小 説 の 価 値 が決 ま る わ け で は な い よ う に,プ
ログ ラム も,表 現 の た め の 言 語 を超
え た 内容 が最 も大 切 とい え よ う.プ ロ グ ラ ミン グ言 語 を 習 得 してプ ログ ラ ミ ン グ に精 通 した つ も りに な る は早 計 で あ る し,逆 に,プ
ロ グ ラ ミ ング 言 語 を味 気
な い規 則(文 法)だ らけ の 言 葉 と敬 遠 した 人 で も,プ ロ グ ラ ミン グ(小 説)の お も しろ さ が 理解 で き る と もい え る. 本 書 は,計 算機 言 語 の 学 習 の た め の プ ロ グ ラ ミ ング を 終 え て,プ
ログ ラ ミ ン
グ 自身 を学 ぶ 入 門 書 とな る こ とを 目的 と して い る.内 容 は,計 算 機 の最 も基 本 的 な機 能 で あ るデ ー タの 検 索,整 列 の 計 算 方 法 を題 材 と して,プ
ロ グ ラム の 基
礎 とな るア ル ゴ リズ ム とそ の計 算 対 象 とな るデ ー タの 表 現 方法 を 中心 に,計 算 シ ス テ ム と して抽 象 的 に捕 え る考 え方,ア
ル ゴ リズ ム の 評 価,具
体的 なプ ログ
ラム へ の 実 装 とデ ー タ構 造 に つ い て解 説 して い る. ま た本 書 は,著 者 の 講 義 内容 を基 に,1 年 間 の 授 業 テ キス トと して も使 え る こ とを念 頭 に コ ンパ ク トに ま とめ て あ る.こ の ため,全 体 につ い て広 く述 べ る こ とを心 が け,細 部 に わ た り解 説 す る こ とを あ え て避 け て い る.特 に,ア ル ゴ リズ ムの 緒 性 質 の 論 理 的 ま た は 数 学 手 法 に よ る解析 は,よ
く知 られ て 身 近 な ア
ル ゴ リズ ム で も高 度 の 知 識 が 必 要 と され た り,未 解 決 問題 で あ っ た りす る こ と か ら,直 観 的 な,あ
るい は,例 え に よ る手 法 の 理 解 を優 先 して 解 説 した.幸
い
に も本 書 の 目的 ど お りに,プ ロ グ ラ ミン グ に 関 す る興 味 が 増 した読 者 は,さ
ら
に専 門 的 な本 に よ り理 解 を深 め る こ と を希 望 す る. プ ロ グ ラ ミング 言 語 にはPascalを
用 い た.読 者 はPascalに
つ い て一 通 りの 知
識 が あ る もの と仮 定 して い るが,デ ー タ の構 造 を議 論 す る上 で 重 要 なPascalの
各 種 構 造 型 デ ー タ,お
よ び ポ イ ン タ 型 デ ー タ に つ い て は,復 習 の 意 味 で 第 3章
に ま とめ て あ る.Pascalの
これ らの デ ー タ構 造 に つ い て の 知 識 が あ る読 者 は,
第 3章 を とば して読 み 進 ん で い た だ い て さ しつ か え な い. プ ロ グ ラ ミン グ の 対 象 は,近 年 ます ます 広 範 囲 に大 規模 に な りつ つ あ り,高 い生 産 性,信
頼 性 が 要 求 され て い る.そ れ に 伴 っ て基 本 的 な アル ゴ リズム や デ
ー タ構 造 を抽 象 的 な 計 算 シス テ ム と して と ら え る こ と,さ
らに,人 間 の 思 考 過
程 に あ った プ ロ グ ラ ム作 成技 法 や 計 算機 言 語 が 注 目 され て い る.本 書 が そ の よ う な プ ロ グ ラ ミ ン グへ の 入 門 と して 役 だ て れ ば,著 者 と しての 最 上 の 喜 び で あ る.な お,本 書 に 対 す る ご 意 見,感
想 等 お よせ い た だ け れ ば幸 い で あ る.
最 後 に,本 書 の 草 稿 に 関 して,片 岡 一 夫 氏 を始 め,多
くの 方 々 か らお よせ い
た だ い た ご意 見 や 激 励 に 深 謝 す る.ま た,本 書 の 刊 行 に際 して は,東 京 電機 大 学 出 版 局 の 植 村 八潮 氏 に た いへ ん お 世 話 に な っ た こ と を感 謝 す る.
1987年 5月
鳩 山 にて
古東
馨
目
1
次
プログラミングとその考え方
1.1プ
ロ グ ラ ム と そ の は た ら き
1
1.2よ
い プ ロ グ ラ ム と は
3
1.3プ
ロ グ ラ ム の 構 成
5
1.4プ
1.3.1ア
ル ゴ リ ズ ム
6
1.3.2デ
ー タ構 造 と型
10
1.3.3実
装 プ ロ グ ラ ム
11
ロ グ ラ ミ ン グ の 手 法
12
1.4.1プ
ロ グ ラ ム の 読 み や す さ に つ い て
12
1.4.2下
降 型 プ ロ グ ラ ミ ン グ と 上 昇 型 プ ロ グ ラ ミ ン グ
15
1.4.3下
降 型 プ ロ グ ラ ミ ン グ と そ の 例
18
2
アルゴリズムの評価
2.1ア
ル ゴ リ ズ ム の 記 述
29
2.2ア
ル ゴ リ ズ ム の 計 算 時 間
34
2.2.1評
価 基 準 に つ い て
34
2.2.2ア
ル ゴ リズ ム の 計 算 時 間
35
2.2.3デ
ー タ 量 に 対 す る 計 算 時 間
37
2.2.4計
算 時 間 の 解 析 の 例
40
2.3ア
ル ゴ リ ズ ム の 改 善
43
2.3.1演
算 の 回 数 の 減 少,短
時 間 演 算 へ の 置 き 換 え
2.3.2計
算 し た 結 果 の 有 効 利 用
45
2.3.3分
割 ・処 理 ・統 合 に よ る 計 算 時 間 の 縮 小 化
47
3Pascalに 3.1デ
3.2.1配
3.3ポ
お ける構造型 のデ ータ
ー タ の 型
3.2Pascalの
44
51 構 造 型 デ ー タ
55
列 型 デ ー タ
55
3.2.2レ
コー
ド型 デ ー タ
58
3.2.3集
合 型 デ ー タ
64
3.2.4フ
ァ イ ル 型 デ ー タ
65
イ ン タ 型 デ ー タ 3.3.1LHS表
68
現 とRHS表
現
69
3.3.2静
的 領 域 と 動 的 領 域
70
3.3.3ポ
イ ン タ 型 デ ー タ
71
4
線形 リス ト
4.1リ
ス ト型 の デ ー タ
79
4.2リ
ス ト の 実 装
82
4.3ス
4.2.1配
列 構 造 に よ る リ ス トの 実 装
82
4.2.2リ
ン ク 構 造 に よ る リ ス トの 実 装
86
タ ッ ク と キ ュ ー
92
4.3.1特
殊 な リ ス ト
92
4.3.2ス
タ ッ ク
92
4.3.3ス
タ ッ ク の 応 用 例
95
4.3.4キ
ュ ー
101
4.3.5キ
ュ ー の 応 用 例
105
5
木
構
造
5.1木
構造 のデー タ
111
5.2グ
ラ フ 構 造 と し て の 木 構 造
116
5.3木
構 造 の 操 作
119
5.4木
構 造 の 実 装
126
5.4.1一 5.4.2n-分 5.4.3配 5.5木
般 的 木 の 実 装
126
木 の 実 装
130
列 を 用 い た 平 衡 n-分 木 の 実 装
の 操 作 の 実 装
131 133
6
整
列
6.1デ
ー タ の 処 理 と 整 列
142
6.2整
列 に 関 す る 基 礎
145
6.3挿
入 法 に よ る 整 列
148
6.4入
6.5そ
6.3.1挿
入 法 に よ る整 列 の 基 本
148
6.3.2基
本 的 挿 入 法 に よ る 整 列 ア ル ゴ リ ズ ム の 実 装
150
6.3.3シ
ェ ル の 方 法
152
れ 換 え 法 に よ る 整 列
154
6.4.1入
れ 換 え 法 に よ る 整 列 の 基 本 原 理
154
6.4.2バ
ブ ル ソ ー ト(bubble
sort)
155
6.4.3ク
イ ッ ク ソ ー トの ア ル ゴ リ ズ ム の 原 理 と実 装
157
の 他 の 方 法 に よ る 整 列 6.5.1選
択 法 に よ る 整 列
161 161
6.5.2併
合 法 に よ る 整 列
165
6.5.3複
合 ア ル ゴ リ ズ ム に よ る整 列
171
7
検
索
7.1検
索 と は
176
7.2順
次 検 索
180
7.32
分 検 索
182
7.3.1配
列 構 造 の フ ァ イ ル に お け る 2分 探 索
182
7.3.22
分 木 構 造 の フ ァ イ ル に お け る 2分 探 索
183
7.3.32
分 検 索 法 の 計 算 時 間 の 解 析
187
7.4最
適 2分 木 検 索190
7.5デ
ィ ジ タ ル 検 索
198
7.5.1デ
ィ ジ タ ル 検 索 木
198
7.5.2ハ
ッ シ ュ 検 索
201
8 8.1い
記憶の方式と管理
ろ い ろ な 記 憶 方 式
8.2Pascalに 8.3集
213
お け る 可 変 長 レ コ ー ドの 記 憶 方 式
合型 の デ ー タ と ビ ッ トマ トリ ク ス
8.4Pascalに
お け る 動 的 記 憶 領 域 と ヒー プ構 造
付
214 218 224
録
付録 A
アル ゴ リズ ム の 計 算 時 間 と〓-記 法
234
付録 B
置 換 の 反 転 数 の 解 析
236
索
引
243
[1] プ ログラミングとその考 え方
1.1
プログラムとそのはたらき
は じめ に,「 計 算 機 の プ ロ グ ラ ム 」お よび 「プ ログ ラ ミ ング 」とは な ん で あ るか を考 え て み た い.数 学 事 典(岩 波 書 店)に よ る と,計 算 機 プ ロ グ ラム とは 「所 用 の 計 算 を 実 行 す る た め に こ れ らの 命 令 の 有 限個 を適 当 に 並 べ た列 」 とあ り,プ ロ グ ラ ミ ン グ とは 「プ ロ グ ラム を作 る作 業,す
な わ ち 目的 の 計 算 を単 位 の 命令
の 有 限 個 の 列 で 表 現 す る こ とで あ る」とあ る.こ の 記 述 は 抽 象 的 で あ り,ま た 数 学 的 に も厳 密 な もの で,こ れ だ け で,な
る ほ ど と納 得 の い く人 はプ ロ グ ラム
と は何 か を 知 っ て い る とい って い いの で は な い だ ろ うか. 引 き続 い た 説 明 に,「 各 命 令 は,制 御 装 置 の構 造 か ら定 ま る一 定 の 形 式 で 数 値 的 に表 現 され,計 算 に 先 立 っ て 記 憶 装 置 の 中 に 蓄 え られ る 」 と あ るの を 見 て もわ か る と お り,こ こ で は機 械 語 の プ ロ グ ラム の 説 明 を して い る. プ ロ グ ラ ム とは,計 算 機 に 実 行 して も ら う計 算 の 方法 を計 算 機 に指 令 す る命 令 群 で あ る し,計 算 機 は機 械 語 しか 理 解 で きな いの で,厳 密 に は こ こ に書 か れ て い る とお りで あ る. しか し,人 間 が 直 接機 械 語 の プ ロ グ ラ ム を書 か な くて も,ア セ ンブ リ言 語や 数 多 くの 標 準 化 さ れ た プ ロ グ ラ ミン グ言 語 を 用 い て書 い た プ ロ グ ラム を,計 算 機 内 に用 意 され て い る翻 訳 プ ログ ラム に 入 力 して,機 械 語 の プ ロ グ ラム に 変換
して 目的 の プ ロ グ ラ ム を得 る方 法 が機 械 語 の プ ロ グ ラ ミン グ よ り も一般 的 で あ る こ とは,読 者 諸 氏 の よ く知 る と ころ で あ ろ う.ア セ ンブ リ言 語 に始 ま り,問 題 向 き言 語 とか 高 級 言語 とか は,無 味 乾 燥 な機 械 語 の プ ロ グ ラ ミン グ を人 間 の 言 葉 に近 く,ま た機 械 に依 存 しな い 言 語 へ と発 展 させ て きた 結 果 で あ る と もい え る. 機 械 語 の プ ロ グ ラム が 機 械 へ の 指 令 を表 現 す るだ け もの で あ った の に対 し, Pascalの
よ うな 高 級 言 語 に よ るプ ロ グ ラム は,そ の 本 来 の 目的 で あ る機 械 へ の
指 令 を表 現 す る た め で は な く,人 と人 との 意 志 の伝 達 手 段 を 目的 と して も利 用 され て い る.た
とえ ば,複 雑 な仕 事 の 手 順 を仲 間 に 知 らせ るの に く ど くど と文
章 で 表 現 す る よ り も,Pascalの
プ ログ ラム で書 き示 した ほ うが 正 確 で わ か りや
す い とい う こ とが あ り得 る. 著 者 の 知 る限 りでの こ の よ う な仕 事 の 手 順 を記 述 して あ る例 は,料 理法 の 本 で あ る.誰 に で も同 じ味 の 料 理 が で き る よ うに,用
い られ る材 料(デ ー タ)の 記
述 に 始 ま り,料 理 の 手 順(計 算 の 方法)を あ い ま い な とこ ろ が な い よ う に正 確 に 記 述 す る.料 理 の 方 法 をPascalで ての 料 理 人 がPascalを
書 い た 本 な ど見 た こ と もな いが,も
し,す べ
自然 言 語 の よ う に理 解 で き る とす れ ば,料 理 法 の本 は 半
分 以 下 の 厚 さ に な り,も っ と正 確 な 記 述 が で き るの で は な いか と冗 談 半 分 に思 っ て い る. 図1・1に
示 さ れ た 三 つ の プ ロ グ ラ ム は,50個
図 1・1
の 数 の 和 を 求 め る機 械 語,ア セ
ン ブ リ語 お よ びPascalの
プ ロ グ ラ ム の 一 部 分 を 示 し た もの で あ る が,詳
と は と も か く機 械 語 よ り は ア セ ン ブ リ語 に よ る プ ロ グ ラ ム が,ま 語 よ り はPascalに
しい こ
た ア セ ンブ リ
よ る プ ロ グ ラ ム の ほ う が 読 み や す く は な い だ ろ う か.
機 械 語 とア セ ン ブ リ語 との 相 違 は,前 者 が 単 な る 数 字 の 羅 列 で あ るの に対 し, 後 者 は命 令 や デ ー タ の 意 味 との連 想 づ け した 記 号 化 を用 い て 読 み や す くな っ て い る.し か し,双 方 の プ ロ グ ラ ム と もにプ ログ ラム を構 成 す る命 令 の 一 つ 一 つ が か な り微 細 な機 能 しか 持 っ て い な い た め に,プ ロ グ ラム か ら全 体 の 構 成 とか, 思 想 を理 解 す る こ とは 容 易 で は な い. ま た,各 命 令 も機 械 特 有 の もの で わ れ わ れ が 日常 な じみ の な い もの ば か りで あ り,か つ機 械 が 異 な る と異 な っ た 言 語 で 記 述 しな け れ ば な らな い.こ して 高 級 言 語 は,よ
れ に対
りな じみ の あ る 単 語 や 表 現 を用 い書 か れ たプ ロ グ ラ ム も普
通 の 文 章 に近 い し,言 語 が標 準 化 さ れ て 異 な っ た機 械 に も共 通 の プ ロ グ ラ ミ ン グ が 可 能 で あ る. プ ログ ラム 言 語 が 発 達 して くる と,機 械 的 な決 ま りき っ た 手 順 の 記 述 は機 械 に まか せ る こ とが で き る よ う に な り,プ ロ グ ラ ミ ング は,「 どの よ う」に計 算 す る か で は な く「何 を 」計 算 す るか を記 述 す る とい う意 味 あ いが 強 くな っ て くる. 現 代 の プ ロ グ ラ ム は,単
に機 械 へ の 指 令 伝 達 の た め ば か りで は な く,人 間 的
な 要 素 つ ま り人 間 の 思 考 の 表 現 とか,情 報 交 換 の 手 段 と して の機 能 も重 視 され て きつ つ あ る こ とに注 意 してプ ログ ラ ミン グ を 考 え な けれ ば な らな いで あ ろ う.
1.2
よいプログラムとは
よ いプ ロ グ ラム とは どの よ うな プ ロ グ ラ ム を指 す の で あ ろ う か.プ
ログラム
と は,計 算 機 に仕 事 を させ る と きの 手 順 を書 き示 した もの で あ る か ら,そ れ が 正 し く書 か れ て い る こ とが 一 番 大 切 で あ る. 仮 に,こ の条 件 が満 た さ れ て い る もの とす れ ば,答
を得 るまでの計算時 間が
短 い こ と,プ ロ グ ラム が 作 動 す る た め に 必 要 と され る記 憶 領 域 が 小 さ い こ とな どが あ る.こ れ は,計 算 機 資 源 の 利 用 効 率 の 面 か らの評 価 方 法 で あ る.
こ れ に対 して,プ
ロ グ ラ ム の 適 用 範 囲 が 広 い こ と,改 造 が しや す い こ と,プ
ロ グ ラ ム が 人 間 に と っ て読 み や す い こ とな どが よい プ ロ グ ラ ム の 条 件 と な る こ と もあ る. これ らの 評 価 の観 点 を ま とめ る と, (1)
計 算機資源 の利用効 率の観点か らみ た評価
(2)
プ ロ グ ラ ム の 利 用 者 や 作 成 者 な どの 対 人 間 的 な 面 か ら見 た評 価
の 二 つ の 観 点 か らプ ログ ラ ム を評 価 して い る こ とが わ か る.こ の 二 つ の 評 価 方 法 は,異
な った 次 元 に 立 って い る の で,簡 単 に優 劣 を つ け る こ とが で きな い.
こ の 二 つ の 評 価 方法 につ い て も う少 し考 え て み よ う. あ る人 が,数 多 くの場 合 に わ た っ て 同 じよ うな 計 算 を す る問 題 に対 してA, Bの 二 つ の プ ロ グ ラ ム の ど ち ら を 用 い た らよ いの か 考 慮 してい る もの と しよ う. A の プ ロ グ ラム は一 つ の デ ー タ に対 して10秒,B
は20秒
で あ っ た とす る と,
A の ほ うが 選 ば れ る で あ ろ う. こ の 場 合,A
も B も正 しい プ ロ グ ラ ム で あ る とい う仮 定 が あ る.つ ま り,プ
ロ グ ラ ム の 善 しあ しの 最 大 の また 当然 の 条 件 で あ る正 し く作 動 す る とい う こ と を前 提 とで きれ ば,計 算 機 資 源 の 利 用 効 率 だ け で プ ロ グ ラ ム の評 価 が で き る. しか しな が ら,プ ロ グ ラ ム が 正 し く作 動 す る か ど うか とい う こ とは 以 外 に む ず か しい.た
とえ ば,プ
ロ グ ラム に入 力 デ ー タが あ る と き に は,適 用 で き る デ
ー タ の範 囲 ,必 要 と され る精 度,表 が,望
現 の 方法 な ど に制 限 が あ る の が普 通 で あ る
む 結 果 を得 る ため の 入 力 デ ー タの 条 件 を知 る こ とが,プ
ログ ラム を正 し
く作 動 させ るた め に 必 須 とな る.こ れ はプ ロ グ ラ ムの 仕 様 書 な どに書 か れ て い る が,十 分 で な い と きに はプ ロ グ ラム を読 む 必 要 が あ る.利 用 者 で な く,プ ロ グ ラ ム の 作 成 者 側 で あ る と き に は な お さ ら とな る. 以 後 の 議 論 に お い て は,計 算機 資 源 の 効 率 の 面 か らのプ ロ グ ラム の 善 しあ し を 問題 とす る場 合 をプ ログ ラム の 効 率(ま た はア ル ゴ リズ ム の 効 率)と 呼 び,対 人 間 的 な面 か ら見 た場 合 をプ ロ グ ラ ミングの 効 率 と呼 ん で 区 別 す るこ とに す る. こ の 二 つ の 評 価 を統 一 的 に議 論 す る こ と はむ ず か か しい.一 般 的 に は,プ
ロ
グ ラ ム の 効 率 とア ル ゴ リズ ム の 効 率 とは 直 接 関 係 が な い とい え るが,ア ル ゴ リ
ズ ム の効 率 の よ いプ ログ ラム は,複 雑 かつ 技 巧 的 で プ ロ グ ラ ミ ン グが む ず か し くな り,逆 に 人 間 に読 み や す く,明 快 なプ ロ グ ラ ミン グ をす る と,プ ロ グ ラム の 寸 法 が 大 き く,時 間 の か か るプ ロ グ ラ ム とな って しま う傾 向 に あ る. プ ログ ラム の 効 率 は,あ
る物 理 量 か ら数 値 的 に優 劣 が 比 較 で き るが,プ
ログ
ラ ミ ング の 効 率 は な か な か そ うは い か な い.こ の 両 者 の 関 係 をひ とつ の比 喩 で 表 せ ば,「プ ロ グ ラ ミ ング は 小 説 を 書 くの と同 じで あ る」とい う こ とが で き よ う. 無 制 限 に 誰 にで もわ か りや す い 文章 と い う もの は あ り得 な い.小 学 生 の語 彙 で な ん で も説 明 しよ う とす れ ば,表 現 す る概 念 の や さ しい言 葉 で の 定 義 が 必 要 と な る な ど,文 章 は長 く複雑 と な る.か
え っ て大 人 に はわ か りず ら くな る 可 能性
が あ る. 逆 に,専 門 用 語 な どの 高 度 の 意 味 を持 つ 単語 を用 い れ ば,文 章 は簡 潔 か つ 正 確 とな る.だ が,専 門 用 語 を理 解 で き る 人 に は わ か りよ くて も,知 ら な い 人 に は わ か りず ら い. プ ロ グ ラ ミン グ で も,そ の 技 術 の 高 さや,扱
う内 容 が 専 門 的 に な れ ば,そ れ
に 応 じて 高 度 ま た は専 門 の プ ロ グ ラ ム 表 現(ア ル ゴ リズ ム)や デ ー タ の表 現(デ ー タ構 造)が
必 要 とな っ て く る.つ
ま り,プ ロ グ ラ ミン グ は計 算 機 言 語 だ け を
知 っ て い れ ば よ いの で は な く,少 な く と もあ る程 度 の ア ル ゴ リズ ム や デ ー タ構 造 の 知 識 が 不 可 欠 とな る. どの よ うな 場 合 に どの ア ル ゴ リズ ム を用 い る か に は ア ル ゴ リズ ム の 評 価 が 必 要 で あ る し,ア ル ゴ リズ ム を多 く知 れ ば,そ れ だ け 書 か れ るプ ロ グ ラ ム も正確 で わ か りや す くな り,プ ロ グ ラ ミ ング も容 易 とな る.こ の よ うに,一 見 した と こ ろ で は異 な った 次 元 の プ ロ グ ラ ム 評 価 規 準 も 「よ い プ ロ グ ラ ム 」を作 る こ と で は 協 力 しあ って い る.
1. 3
プログラムの構成
わ れ わ れ が 計 算 機 で 解 くべ き問 題 が 与 え られ た と き,ま ず 最 初 に しな け れ ば な ら な い こ とは,こ の 問題 が計 算 機 で 解 く対 象 に な る よ う に モ デ ル 化 す る こ と
で あ る.こ の モ デ ル は,一 般 に 数 学 的 モ デ ル(mathematical 象 モ デ ル(abstract
model)と
model),ま
たは抽
呼 ば れ て お り,解 くべ き問 題 を数 値 表 現 や 図 式表
現 な ど の 記 号 とそ の 記 号 間 の法 則 とで表 現 した もの で あ る. た と え ば,宇
宙 空 間 を飛 行 す る ロ ケ ッ トの あ る時 刻 で の 位 置 を知 りた い とい
う問題 に対 して は,地 球 を原 点 とす る三 次 元 座 標 系 を仮 定 し,ロ ケ ッ トや 各 天 体 系 の 質 量,ロ ば,ロ
ケ ッ トの 噴 射 力 な ど と,引 力 の 法 則 や 運 動 方 程 式 が 与 え られ れ
ケ ッ トを含 め た 天 体 の 状 況 を 幾組 か の 数値 で 表 現 され た モ デル を作 る こ
とが で き る. わ れ わ れ は,現 実 の 問題 を この モ デ ル の 上 に投 影 し,こ の モ デ ル の うえ で 問 題 の 解 を見 い だ そ う とす る.正 確 に は,解
そ の もの を求 め るの で は な く,ど の
よ う に した ら解 が 求 ま るか の 手 段 を見 つ け る こ とで あ る.こ の 解 を求 め る手法 は,ア
ル ゴ リズ ム と呼 ば れ て い る.
1.3.1
アル ゴリズム
ア ル ゴ リズ ム(algorithm)は,古
くは 四 則 演 算 に よ る計 算 の 手 順 の 意 味 に 用
い られ た り,単 に ユ ー ク リ ッ ドの互 除法 に よ る最 大 公 約 数 の 求 め 方 な ど を意 味 して い たが,現
在 で は計 算 の 手 順 全般 を意 味 す る.
しか し,単 に計 算 の や り方 とい う よ りは制 約 が 強 く,計 算 機 関 連 の 記 述 に は 頻 繁 に 使 わ れ 重 用 な概 念 で あ るの で,単
にア ル ゴ リズ ム と訳 され て い る.
アル ゴ リズ ム の 正 確 な 意 味 づ け に は,専 門 的 数 学*の 助 け を借 りな け れ ば な ら な い.む
しろ,ア ル ゴ リズ ム と い う言 葉 自体 が 数 学 の 専 門 用 語 で あ る とい うほ
うが 正 確 で あ る.し
か しな が ら,こ こ で は 正確 な数 学 的 な 定 義 をす る こ とが 目
的 で は な く,そ の概 念 を 平 易 に 理 解 す る だ け で 十 分 で あ る. ア ル ゴズ ム とは, (1)次
の(2)を 満 たす よ うな命 令 を有 限 個 並 べ て 表 現 した計 算 法 の 記 述 で あ
る. * 数 学 基 礎 論,計
算 の 理 論 な どの 分 野 の 数 学.
(2)各
命 令 は,そ れ が 実 行 され る すべ て の 状 況 に 対 して,あ い ま い さ が な く
明確 に記 述 され て い て,か つ,有 (3)命
限 時 間 で 実 行 され な けれ ば な ら な い.
令 の 実 行 順 序 は,特 に指 定 の な い 限 り,一 つ の 命 令 が 終 わ っ た後 は,
そ の 直 後 の 命 令 を実 行 す る もの とす る. (4)ア
ル ゴ リズ ム に は,必 要 に 応 じて計 算 の 初 期 値 と な るデ ー タ(ア ル ゴ リ
ズ ム の 入 力 と呼 ぶ)が あ って も よい.ま
た,少 な くと も一 つ の 計 算 結 果(ア
ル ゴ リズ ム の 出 力 と呼 ぶ)を 持 た な け れ ば な ら な い. (5)命
令 列 の 中 に は必 ず停 止 命 令 が あ り,計算 開 始 か ら有 限 回の 命令 の 実 行
の 後 に 必 ず 停 止 命 令 が 実 行 され る保 証 が な けれ ば な らな い. ア ル ゴ リズ ム の 条 件 の(5)の 代 りに (5') 命 令 列 の 中 には,必 で 置 き か え た も の,つ
ず停 止 命 令 が な けれ ば な らな い.
ま り ア ル ゴ リ ズ ム の 条 件 の う ち,有
に 停 止 す る 保 証 の な い 場 合 は,プ
ロ シ ジ ァ(procedure)と
限回の命令実行の 後 呼 ば れ る.す
べ ての
ア ル ゴ リ ズ ム は プ ロ シ ジ ァ で も あ る こ と は す ぐ に わ か る. プ ロ シ ジ ァ と い う 用 語 も数 学 の 専 門 用 語 で,Pascalの じ綴 り で あ る の で ま ぎ ら わ し い.以 ぐ た め に,こ
下 の 議 論 で は,こ
手 順(procedure)と
同
の 二 つ が混 同 す るの を 防
こ で 定 義 し た プ ロ シ ジ ァ は 計 算 手 順 と 訳 し,Pascalの
ほ う は単 に
手 順 とす る こ と に す る. 【例 】
与 え られ た整 数m(m>0)が
3の 公 倍 数 で あ るか否 か を判 定す る問 題 を考 えて
み よ う.
Procedure も しm=0
A
Step
A1:
な ら ば Step
Step
A2:
m-3を
Step
A3:
Step A1へ.
Step
A4:
「m は 3の 倍 数 で あ る 」と 出 力 す る.
Step
A5:
計 算 を 停 止 す る.
計 算 し,そ
A4へ.
の 値 を 改 め て m の 値 と す る.
(a)Procedure
A
(b)Algorithm
B
図1・2
前 記 の計 算 の 手 順 は,有 限 の 命 令 数(5 ス テ ップ)で あ り,そ れ ぞ れ の 命 令 に は あ い ま い さ が な く有 限 時 間 で 実 行 で き る.入 力 は 非 負 の 整 数 m,出 力 は「m は 3の 倍 数 で あ る 」と い う文 章 で あ り,停 止 命 令 が あ る の で この 計 算 法 の 記 述 は 計 算 手 順 で は あ るが ア ル ゴ リズ ム で あ る とは い え な い.な ぜ な らば,m 公 倍 数 の 場 合 に は 計 算 が 停 止 す るが,そ
が 3の
うで な い と きに は 永 久 に停 止 す る こ と
が な い.こ の 計 算 手 順 を
Algorithm ら ばStep
B
Step
B1:
も しm=0な
Step
B2:
m-3を
Step
B3:
Step
Step
B4:
「m は 3の 倍 数 で あ る 」と 出 力 す る.
Step
B5:
計 算 を 停 止 す る.
Step
B6:
「m は 3 の 倍 数 で は な い 」と 出 力 す る.
Step
B7:
計 算 を 停 止 す る.
計 算 し,そ
B4へ.ま
たm<0な
らばStep
B6へ.
の 値 を 改 め て m の 値 と す る.
B1へ.
と書 き 直 す こ と に よ っ て,与 え ら れ た 正 の 数 m は 3 を 引 か れ る た び に 小 さ く な
っ て い き,必
ず 0か 負 の 数 と な り停 止 す る こ と が 保 証 さ れ て い る か ら ア ル ゴ リ
ズ ム で あ る こ と が わ か る. 計 算 機 プ ロ グ ラ ム に と っ て 重 要 な こ と は,そ の 計 算 の 方 法 が ご く特 殊 な 場 合* を 除 い て,計
算 が 終 了 し て 停 止 す る 保 証 が 必 要,つ
ま り,ア
ル ゴ リズム で な け
れ ば な ら な い こ と で あ る. さ て,ア
ル ゴ リズ ム の 概 念 の 重 用 性 は わ か っ た と し て も,前
概 念 的 な 説 明 で は,与
に述 べ た よ うな
え られ た計 算 の 記 述 が ア ル ゴ リズ ム で あ るか 否 か を判 定
す る に は 十 分 と は い え な い. 前 例 で み る と,m=0を
判 定 す る こ と,m-3を
ャ ン プ す る こ と な ど は,有
限 時 間 で 計 算 で き る で あ ろ う か.ま
ま い さ が な い で あ ろ う か.m た,ス
計 算 す る こ と,Step
が 整 数 の 範 囲 内 の 変 数 な ら ば,前
A4へ
た,記
とジ
述 にあい
の二 つ の 問 に は
yesと
答 え ら れ る.ま
テ ッ プ の 総 数 が 有 限 個 で あ れ ば,上 か ら順 にStep
A4で
あ る か 否 か を 調 べ る こ と が で き る の で,3 番 目 の 問 に も肯 定 的 に答 え られ
る で あ ろ う. 結 論 を い え ば,ア
ル ゴ リズ ム で あ る か 否 か を 判 定 す る こ と は,数
証 明 す る よ う に,機
械 的 な 常 套 手 段 は な く,人
し,あ
い ま い さ の な い 記 述 と い う 意 味 で は,ア
ミ ン グ 言 語 を 用 い る の が も っ と も適 し て い る.こ 械 へ の 命 令 と し て だ け で な く,人 あ る こ と が わ か る.し
か し,プ
学の定理 を
間 の 知 能 に 頼 る しか な い.し
か
ル ゴ リズ ム の 記 述 に はプ ログ ラ の こ と か ら もプ ロ グ ラ ム が 機
間 ど う しの 情 報 伝 達 の 手 段 と し て も不 可 欠 で
ロ グ ラ ム よ りは概 念 的 な計 算 方 法 の 記 述 とい う
意 味 で は,自 然 言 語 や フ ロ ー チ ャ ー ト な ど の 計 算 図 式 に よ る 表 現 も 有 用 で あ る. 今 後,正
式 な ア ル ゴ リ ズ ム は プ ロ グ ラ ミ ン グ 言 語 で 表 記 す る と し て,非
は 自 然 言 語 を 含 むPascal的
記 法,流 れ 図(フ ロ ー チ ャ ー ト:flow
適 宜 使 い 分 け る こ と に す る(第 2章2.1節
* 計 算 手 順 は あ るが,ア
どで
参 照).
ル ゴ リズ ム は 発 見 さ れ て い な い 問 題 を解 くた め に,場
に 停 止 しな い こ と を覚 悟 の う え で,計
chart)な
公式 に
合 に よ って は永 久
算時 間 の 許 す 限 り計 算 して み る とい う よ うな 場 合 が あ り得
る.ア ル ゴ リ ズム が 存 在 す る か否 か が 不 明 な 問題 ば か りで は な く,計 算 手 順 は存 在 す るが ア ル ゴ リズム が 存 在 しな い こ とが わ か っ て い る問題 もあ る.
1.3.2 デ ー タ 構 造 と 型 計 算 機 に して も ら う仕 事 に は,数 値 計 算,文 字 列 の 変 換,フ
ァ イル の 転 送,
な ん らか の モデ ル を表 現 す る記 号 の 集合 に対 す る操 作 な ど,枚 挙 にい と まが な い.わ れ わ れ は これ らを 総 称 して 「計 算 」と呼 ぶ こ とに す る. そ れ ぞ れ の 計 算 に は,そ の 計 算 の 対 象 とな る種 々 な デ ー タ が 存 在 す る.あ る 数 の 自乗 を求 め る計 算 で は,そ の 対 象 とな るデ ー タ は 一 つ の 実 数 で あ り,地 球 上 の 2点 間 の 距 離 を求 め る問 題 の と きに は,あ
る 1点 を表 現 す るデ ー タ は経 度
と緯 度 を表 す 2実 数 か らな って い る こ と もあ る. また,あ る商 店 の 顧 客 の 名 簿 で は,1 人 の デ ー タが20以 て い て,こ
内 の 文 字 で 表 現 され
れ を ア イ ウ エ オ 順 に並 び 換 え る問 題 も考 え られ る.も
っ と複雑 な例
は,1 台 の 自動 車 が10以
内 の 文 字列 か ら な る愛 称,4 桁 の 数 字 か らな る製 造年,
8文 字 か らな る型 式,塗
装 色 を表 す 記 号 で 表 現 され て い て総 計10000台
分のデ
ー タが あ る と き,そ れ ぞれ の項 目別 の 台 数 の統 計 を取 る問題 な どが 考 え られ る. 複 雑 な デ ー タ は,基
本 的 な デ ー タ の 構 成 要 素 を,組 織 的 に組 み 合 わ せ た"構
造"を 持 っ て い る.あ
る部 屋 の 環 境 は,気 温 と湿 度 を表 す 二 つ の 数 で 表 現 され
て い る もの とす れ ば,こ の デ ー タ は 2実 数 か らな る構 造 を持 って い る とい え る し,1 台の 車 の デ ー タ の 例 で は,愛 称,製 造 年 月 日,形 式,塗
装色 の四つの よ
り基 本 的 な デ ー タ が こ の 順 序 で 並 ん で い る とい う構 造 を持 っ て い る. また,同
じ よ う に 2実 数 か らな る部 屋 の 環 境 を表 す デ ー タ と前 述 の 地球 上 の
点 を表 す デ ー タ と は 同 じと い っ て よ いの で あ ろ うか.も ち ろ んNOで
あ る.デ ー
タ と しての 重 用 性 は,ど の よ うな構 造 で 表 現 され て い る か だ けで は な く,む し ろ 何 を表 現 して い る か に負 う と ころ が 大 きい. デ ー タ構 造 と い う言 葉 は,こ の デ ー タの 二 つ の 面 に対 して 混 同 して 使 わ れ る こ と もあ る が,こ
こ で はデ ー タ が どの よ うな構 成 要 素 で表 現 され て い るか とい
う面 に対 して は,「 構 造 」とい う言 葉 を使 い,何
を表 現 して い るか とい う面 に対
して は,「 デ ー タ の 型 」ま た は 単 に 「型」とい う言 葉 を用 い るこ と に す る. デ ー タが 単 に数 字 や 記 号 の集 ま り と して で は な く,そ の 意 味 解 釈 を含 め て考
え られ る と き,そ の デ ー タ上 に定 ま っ た操 作 や 演 算 が 考 え られ て い て,独 特 の 社 会 つ ま り「計 算 シ ス テ ム 」が 形 成 さ れ て い る.た
と えば,地 球 上 の 1点 を 表 す
デ ー タの 集 ま りに 対 して は,2 点 間 の距 離 とか,時 差 を計 算 す る方 法 が付 随 し て 考 え られ,ま
た,部 屋 の 湿 度 と気 温 を表 現 して い るデ ー タ で あ れ ば,快 適指
数 を計 算 す る方 法 が 付 随 した別 の 計 算 シ ステ ム を形 成 して い る. デ ー タ の 型 は,単 タの 意 味,さ
に デ ー タの 成 り立 ち を示 して い る もの で は な く,そ の デ ー
らに は計 算 シ ス テ ム を示 す もの で あ る.こ
こで は,デ ー タの 構 造
とア ル ゴ リズ ム に つ い て考 え る こ と と し,デ ー タの 型 に つ い て は 第 3章 で 触 れ る こ と に す る.
1.3.3 実 装 プ ロ グ ラ ム 計 算 シ ス テ ム が 何 を計 算 す るか とい う抽 象 的 意 味 を記 述 して い るの に 対 して, ど の よ う に計 算 を す る の か の具 体 的 に記 述 もあ る.す な わ ち,デ の 記 憶 装 置 内 で どの よ うな構 造 に な っ て い るの か,ど
ー タ が計 算機
の よ うな 命 令 の順 序 で ど
の よ う な制 御 を す れ ば解 が 得 られ る の か の 記 述 で あ る. どの よ う に計 算 す るか を 具 体 的 に記 述 した もの を 「実 装 」ま た は 「実 装 プ ロ グ ラ ム」と呼 ぶ こ と に す る.ま
た,そ の よ うな 記 述 をす る こ と を 「実 装 す る」とい
う. プ ロ グ ラム を実 装 で の 主 要 な 問題 は,デ ー タ を どの よ うに 表 現 す るか,ま た, そ の デ ー タ を どの よ う に扱 っ て 解 答 を得 る の か,つ
ま り,デ ー タ構 造 と アル ゴ
リズ ム の 問 題 で あ る と い っ て よい. デ ー タ構 造 とア ル ゴ リズ ム との 間 に は,密 接 な 関 係 が あ り,ア ル ゴ リズ ム は デ ー タ構 造 を抜 きに 考 え る こ とは で きず,ま
た,デ
ー タ構 造 もそ れ を扱 うア ル
ゴ リズ ム に適 した よ う に設 計 され な けれ ば な らな い か ら,互 い に 相 補 的 な 関係 に あ る.ゆ え に,デ ー タ構 造 とア ル ゴ リズ ム は一 体 と して 扱 わ れ る こ とが 多 い. 単 に デ ー タ構 造 とい っ て も,暗 黙 の 内 に ア ル ゴ リズ ム が 含 まれ て い た り,そ の 逆 の こ と もあ り う る. 実 際 の 問題 の 解 決 法 で は,何 重 もの 計 算 シ ス テ ム が 階 層 的 に 積 み 重 な って い
る こ とが 多 い.上 の 層 か らそ の 下 の 層 を見 た と き は実 装 的 で あ る計 算 の 記 述 も, さ らに 下 層 の 計 算 の 記 述 か ら見 れ ば計 算 シ ス テ ム的 で あ り,さ
らに 下 層 の 計 算
記 述 は そ の 実 装 とな っ て い る よ う に 見 え る こ と は 自然 な こ とで あ る.こ の こ と か ら,計 算 シ ス テ ム と して の 記 述 と実 装 記 述 との相 違 は絶 対 的 な もの で は な く, 多 分 に相 対 的 で あ る と い え る. 本 書 の 主 題 で あ るデ ー タ構 造 と アル ゴ リズ ム につ い て は,第
2章 以 下 で 順 次
検 討 さ れ る. よい プ ロ グ ラ ム の 作 成 の た め に は,プ
ロ グ ラ ミ ング に関 す るい ろ い ろ な考 え
方 や 技 法 も重 要 で あ る が,本 書 の 内 容 を習 得 した う え で,さ
らに高度 のプ ログ
ラ ミ ン グ理 論や プ ロ グ ラ ミン グ工 学 の 範 囲 で あ る と考 え る.こ
こで は,プ
ログ
ラム の 階 層構 造 と階 層 的 プ ロ グ ラ ミン グ の概 念 につ い て お お まか に次 節 で 触 れ る.
1.4
プログラ ミングの 手法
1.4.1 プ ロ グ ラ ム の 読 み や す さ に つ い て 「プ ロ グ ラ ム の 読 み や す さ」に は 2 とお りの 意 味 が あ る.そ の 一 つ は,プ ラ ムの 持 つ 意 味 に も多 少 関 連 す るが,主 み や す さ と,他 方 は,プ
ログ
と して プ ロ グ ラ ム リス トそ の もの の読
ロ グ ラム の 計 算 内 容 に関 連 した 意 味 の 理 解 しや す さ と
い う 2点 で あ る.こ の 項 で は,第
1の 意 味 で の読 み や す さを取 り扱 う こ と にす
る. こ こ に述 べ る事 柄 は,す べ てPascalの
初 学 時 に指 摘 され た こ とで あ る.し か
しな が ら,初 級 の プ ロ グ ラ ミン グ で は,そ の 重 用性 が 実 感 され て い な い よ うで あ る. とい うの は,そ の 時 代 で は プ ロ グ ラ ミ ン グ言 語 を 正確 に理 解 す る こ とに 重 点 が お か れ が ち で あ り,プ ロ グ ラム す る 問題 の 意 味 や 計 算 の メ カ ニ ズ ム は す で に よ く知 られ て い て,頭 の 中 で プ ロ グ ラ ム の 細 々 と した事 柄 まで 注 意 が 行 き届 い て い る か らで あ る.こ の場 合,プ ロ グ ラム は計 算 機 へ の 入 力 と して の み 扱 わ れ,
人 間 が 読 む べ き 対 象 と し て は 扱 わ れ に くい か ら で あ る. だ が,プ
ロ グ ラ ム の 規 模 が 大 き く な り,新
し い 概 念 も 導 入 さ れ て く る と,プ
ロ グ ラ ム に 関 す る 事 柄 を す べ て 頭 の 中 に 記 憶 し て お く こ とが で き な く な っ て く る.ゆ
え に,プ
ロ グ ラ ム は 機 械 に 読 ま せ る だ け で は な く,作
成 の 途 中 で,ま
た
は 作 成 の 終 わ っ た 後 で も 作 者 自 身 を含 め た 人 間 に 繰 り返 し読 ま れ る と い う こ と に 注 意 して 書 か れ な け れ ば な ら な い. 英 文 の 構 成 要 素 が 単 語 と カ ン マ や ピ リオ ドな ど の 記 号 で 構 成 さ れ て い る よ う に,Pascalの
プ ロ グ ラ ム も,単 語 と記 号(双 方 合 わ せ て 字 句(token)と
か ら成 り立 っ て い る.記 順(procedure),関
号 と 綴 り の 定 め ら れ て い る 字 句 は 別 と して,変
数(function)な
で き る 字 句 が あ る.こ
呼 ぶ)と 数,手
どの 名 前 の よ うに プ ロ グ ラ マ が 自由 に選 択
れ らの 名 前 の選 び 方 が プ ロ グ ラ ム の 読 み や す さ に大 き な
影 響 を 与 え る. 結 論 を 先 に い え ば,そ 用 い る の が よ い.し
の 字 句 の 表 現 して い る 内容 を 容 易 に類 推 で きる綴 りを
か も,1
区 切 の 単 語 だ け で 対 象 を 限 定 せ ず に,2∼3の
修
辞 句 を探 して 順 に 限 定 の 範 囲 を 狭 め る 方 法 を と る ほ う が よ い. た と え ば,支
出 の 総 額 を x で 表 現 す る よ り は,total_costで
内 容 が わ か りや す い で あ ろ う.ま
た,そ
の 総 額 が 本 代 の 総 額,食
か ら成 っ て い た と き,cost1,cost2,… total _cost_of_foodと
表 現 した ほ うが 費 の 総 額,…
と す る よ り は,total_cost_of_books,
した ほ う が わ か りや す い で あ ろ う.文
字 数 が 多 くな っ た
た め に 生 ず る打 鍵 の 手 数 な ど 意 味 を取 り違 え て プ ロ グ ラ ム し て し ま っ た 後 で の デ バ ッ ギ ン グ の 手 数 に 比 較 し た な ら微 々 た る も の で あ る. 一 方,プ
ロ グ ラ ム 内 の 変 数 の 中 に は,常
道 的 な 技 巧 に 用 い ら れ,プ
の 本 質 的 意 味 と は 深 くか か わ っ て い な い 地 域 変 数 が あ る.た 数 の 総 和 を 求 め る と き のfor文 temp:=x;
と え ば,配
ロ グ ラム 列 内の
の 制 御 変 数 と か,x と y の 値 を 入 れ 換 え る と き;
x:=y;
y:=temp;
と す る が,こ の 場 合 の 作 業 変 数tempな
ど は,そ れ ぞ れ の 目 的 に 応 じて 定 ま っ た
変 数 名 を 用 意 し て お くの が よ い.for文
の 制 御 変 数 に は 常 にi,j,kを
ど が そ の 例 で あ る.こ
れ は,細
用 いるな
か い部 分 の 命 令 法 に必 要 以 上 の 気 を 払 わ な い で
済 む よ う に す る 逆 説 的 命 名 法 で あ る. 命 名 法 に 関 す る も う 一 つ の 問 題 は,使
用 す る 言 語 で あ る.最
近 は漢 字 を併 用
で き る プ ロ グ ラ ミ ン グ 言 語 も出 現 して き つ つ あ る が,日 本 語 の ロ ー マ 字 表 現 は, 予 約 語 が 英 単 語 で あ るPascalで 見 解 で あ る か も しれ な い.こ
は 読 み づ ら い よ う で あ る.こ れ は 筆 者 の 個 人 的 こ で ク イ ズ を や っ て み よ う.次
の 文 を意 味 の 通 じ
る よ う に 読 ん で み て 欲 し い: To
be
to be
ten
made
to
be.
こ の 文 は 多 分 に こ じ つ け で は あ る.ロ
ー マ 字 し か 読 め な い 小 学 生 に は 「飛 べ
飛 べ 天 ま で 飛 べ 」 と す ぐ に 読 め る で あ ろ う が,英 文 で あ る こ と に す ぐ気 が つ か な い で あ ろ う.こ マ 字 に よ る 変 数 名 を 用 い た も の と,英
語 を学 ん だ 人 に は ロ ーマ 字 の の 本 の プ ロ グ ラ ム 例 に は,ロ
ー
単 語 を 用 い た も の と用 意 し た の で ,ど
ち
ら が 読 み や す い か 体 験 し て み て 頂 き た い.要
は 書 く と き の 苦 労 よ りは,読
みや
す い こ と の ほ う を 優 先 す べ き で あ る と い う こ と で あ る. 次 に,文
章 間 の レ イ ア ウ トに つ い て 考 え て み よ う.も
段 区 切(indentation)で
あ る.こ
の 手 法 は,変
時 よ り よ く 守 ら れ て い る よ う で あ る.逆
数 な ど の 命 名 法 と 異 な り,初
に 段 区 切 を し な い と,文
あ る と す ら思 っ て い る 人 も い る ほ ど で あ る か ら,こ 最 後 に,注 釈(comment)に
っ と も有 名 な 手 法 は,
法 上 の 誤 りで
こ で は 省 略 す る.
つ い て 触 れ た い.注 釈 は,本
プ ロ グ ラ ム を 読 む た め の 補 助 的 情 報 と す べ き で あ る.プ か っ た 補 足 的 意 味 を 効 果 的 に 配 置 す る こ と に し,本
学
質 的 に は あ くまで も
ロ グ ラ ム に 盛 り切 れ な
質 的 あ るプ ロ グ ラ ミ ン グ に
対 し て 過 負 荷 と な ら な い よ う に 注 意 し よ う. 一 昔 前 に は 注 釈 が 多 す ぎ る こ と は な い と い わ れ た が,計 っ て プ ロ グ ラ ム 自 身 のreadabilityが
向 上 し,人
間の一時 に注意 の及ぶ 範囲 が
あ ま り広 く は な い こ と が わ か っ て き つ つ あ る 今 日 で は,注 プ ロ グ ラ ム は,冗 た だ し,プ
算機 言語の発達 に よ
釈 が 本 文 よ り も多 い
長 に す ぎ る と思 わ れ る.
ロ グ ラ ム の 冒 頭 な ど に,そ
の プ ロ グ ラ ム の マ ニ ュ アル な どの よ う
に 別 の 目 的 を 持 っ た ドキ ュ メ ン ト と して 注 釈 文 を 利 用 す る の は,こ な い.
の 限 りで は
1.4.2 下 降 型 プ ロ グ ラ ミ ン グ と 上 昇 型 プ ロ グ ラ ミ ン グ プ ログ ラ ミ ング の 入 門 時 の 対 象 とす る問 題 は,比 較 的 単 純 で解 法 も既 知 で あ る よ うな もの が 多 い が,こ
の 段 階 をす ぎて 実 用 的 な 問題 と取 り組 む よ う に な る
と,プ ロ グ ラ ム の 寸法 が す ぐ さ ま膨 張 して,比 較 的 簡 単 な問 題 で も数 百 数 千 ス テ ップ の プ ロ グ ラ ム と な っ て くる.さ
ら に,専 門 的 な 仕 事 とな る と数 万 は お ろ
か 数 十 万 ス テ ップ を越 え る もの も珍 し くな い. こ の よ う な大 きな プ ロ グ ラ ム とな る と問 題 の 解 析,プ ら試 計 算(test
run),誤
ロ グ ラ ム の 設 計 な どか
りの 訂 正(デ バ ッギ ン グ:debugging)ま
で の すべ ての 仕
事 は 人 1人 の 扱 い 得 る 能 力 の 限 界 を越 え て い る.数 多 くの 人 々 の 共 同作 業 に よ らな けれ ば 実 現 は 困 難 で あ る.こ の よ う なプ ログ ラム 生 産 の た め の 学 問 は,プ ロ グ ラム 工 学 と呼 ば れ る一 分 野 を 成 して い るが,本 な い の で,こ
こで は詳 し くは 触 れ な い.し
書 の 目的 とす る とこ ろ で は
か しな が ら,プ ロ グ ラ ミ ング と い う
仕 事 は対 象 が い か に 巨 大 とな っ て も,細 密 な と ころ ま で十 分 に 注 意 を 注 ぎ こ ま な け れ ば な らな い と い う本 質 か ら抜 け る こ とが で き な い の で,そ の 対 策 は重 要 とな る. 人 間 は 異 な っ た性 質 の 問 題 を 同 時 に処 理 す る こ と,ま た あ る一 つ の 限 られ た 問題 で も広 い範 囲 に思 考 を巡 らせ る こ とは 苦 手 で あ る. た とえ ば,建 築 物 を 設計 す る場 合 を考 え て み て も,建 物 の 材 質 と強 度 の 問 題, 居 住 性 の 問題,外
観 的 デ ザ イ ンの 問 題 な ど を同 時 に考 え る こ とや,建
物 内の給
水 排 水 の 配 管 を全 域 的 に考 え る こ とは む ず か しい し,単 純 な 誤 りの 発 生 の 原 因 と な る.そ れ ぞれ の 問 題 を別 々 に扱 う こ と,各 フ ロ ア ー ま た は部 屋 単 位 の 配 管 と,建 物 全 体 の お お まか な もの と分 離 して 考 え た ほ うが や りや す い.し
か し,
別 々 に考 え られ た もの を ま とめ て 統 率 す る必 要 が 生 ず る. こ の よ う に考 え て くる と,仕 事 が 必 然 的 に 階 層 化 さ れ て くる.前 例 で い え ば, 建 物 全 体 と して の 規模 や 機 能 の 設 計 か ら個 々の 部 屋 の 設 計 に い た る ま で の 数 多 くの レベ ル が 考 え られ る. プ ログ ラ ミ ング に お い て も,そ の 問題 に よ っ て仕 事 が い くつ か の レベ ル に 階
層 的 に 分 割 す る こ と が で き る.こ か?,さ
の お の お の の レベ ル の ど こ か ら仕 事 を 始 め る
ま ざ ま 方 法 が あ る と思 わ れ る が 代 表 的 な も の と して,も
ベ ル か ら 順 に 上 の ほ う へ と進 め る 方 式 と,そ
っ と も下 の レ
の 逆 の上 の レベ ル か ら下 の ほ うへ
と 進 め る 方 式 と が 考 え ら れ る.前 者 を 上 昇 型 プ ロ グ ラ ミ ン グ(bottom-up gramming),後
者 を 下 降 型 プ ログ ラ ミン グ(top-down
programming)と
pro呼 んで い
る. 一 般 的 に は,下 る が,そ
降 型 プ ロ グ ラ ミ ン グ の ほ う が 上 昇 型 よ り も優 れ て い る と い え
の 方 法 が 確 立 で き る ま で に は,長
い 経 験 と理 論 的 な 解 析 の 積 み 重 ね が
必 要 で あ っ た. プ ロ グ ラ ム の 階 層 構 造 を 模 式 化 す る と,図1・3の プ ロ グ ラ ム は,ト
ップ レ ベ ル で は メ イ ン プ ロ グ ラ ム で あ り,そ
い る サ ブ プ ロ グ ラ ム(Pascalで
はprocedureま
レ ベ ル の プ ロ グ ラ ム を 構 成 し て い る.ま
トッ プ レベ ル
よ う に な る.図
第2 レベ ル
た,第
第 3 レベ ル
図1・3
た はfunction)の
に お け る各
こ で引 用 され て それぞ れが 第 2
3レベ ル のプ ロ グ ラ ム群 は 第 2
第 n レベ ル
レベ ル か ら引 用 され て い るプ ログ ラ ム群 で構 成 され て い る と い う よ う に順 次 定 義 さ れ る.一 つ の プ ロ グ ラ ム が 異 な っ た レベ ル に は 幾 つ か 現 れ る こ と は あ る. 下 降 型 プ ロ グ ラ ミン グ は,こ の 階 層 構 造 に お け る上 位 の レベ ル の プ ロ グ ラ ム か ら下 位 に 向 か っ て プ ロ グ ラ ミ ン グ を して 行 くの だ が,そ の た め に は幾 つ か の 問 題 点 が あ る. そ の 第 1は,各
プ ロ グ ラ ム 単 位 の 寸法 を どの よ う に した ら よい か と い うこ と
で あ る.各 プ ロ グ ラ ム は一 つ の 概 念 で 表 す こ との で き る よ うな ま と ま っ た 計 算 の 単 位 で あ る こ とが 望 ま しい こ とは い う ま で もな い が,一
つ の概 念 が どの 程 度
の 範 囲 を カバ ー す れ ば よい の で あ ろ うか. こ れ は,人 間 が 一 度 に考 え られ る思 考 の 範 囲 に 関 係 して い て,そ の 時 点 で 考 え て い る プ ロ グ ラ ム 全体 に 配 慮 が 行 き届 く よ うな 寸 法 とい う こ とに な る.人 間 が プ ロ グ ラ ミン グ時 に十 分 配 慮 の 行 き届 く範 囲 は,習 熟 度 や個 人 に よ り差 が あ るの は 当然 で あ る が,以 外 に小 さい よ うで あ る. 科 学 的 な 測 定 で は な く経 験 か らの概 算 で は,初 心 者 は お お よ そプ ログ ラム リ ス トの 1ペ ー ジ(約60行)の こ と,プ
程 度 で あ る と言 わ れ て い る.こ の 値 が 概 算 値 で あ る
ログ ラ ミ ング 時 に は,参 考 資 料 とか メ モ そ れ に 既 に書 い た部 分 を見 る
こ とが で き る こ とな どか ら,厳 密 な 数 値 と して で は な くお お よ そ の 目安 と して 1∼数 ペ ー ジ を一 つ の 分 割 さ れ た プ ロ グ ラ ム 単 位 とす るの が よい と され て い る. そ の 第 2は,下
降 型 プ ロ グ ラ ミン グ で は,そ
の レベ ル を構 成 す る下 位 の サ ブ
プ ロ グ ラム が まだ 現 実 に存 在 して い な い こ とで あ る.Pascalの の 場 合 は,こ
プ ログラ ミング
の 時 点 で は 引 用 され る手 順 ま た は 関 数 の 名 前 の 設 定,引 数 お よび
関 数 値 の 型 の 設 定,そ
して最 後 に その 手 順 ま た は 関 数 の 何 を計 算 す るの か の 仕
様 を 設 定 す るだ け で,下 位 レベ ル の細 か い 実 装 に 気 を使 わ な い で プ ロ グ ラ ミン グ を 進 め る こ とが で きる. 下 降 型 プ ロ グ ラ ミ ング法 が よ い プ ロ グ ラ ミ ン グ法 で あ る とい うこ とは,一 般 的 な 意 味 で あ って,い
か な る場 合 に も この 方 法 が最 適 で あ る と は限 らな い.あ
る状 況 で は,上 昇 型 プ ロ グ ラ ミン グ が 必 要 な こ と もあ る し,ま た あ る と きに は, 中 間 の レベ ル の 仕 様 が 固 定 して い る こ とに よ り,そ の レベ ル か ら上 下 へ とプ ロ
グ ラ ミ ン グ を進 め る こ と もあ り得 る.こ れ ら は,主
と して プ ロ グ ラ ム の計 算 と
して の機 能 そ れ 自身 の持 つ性 質 に よ るの で,副 次 的 な 読 みや す さが 犠 牲 にな る こ とは止 む を 得 な い が,そ
うで な い と き に は下 降 型 プ ロ グ ラ ミン グ法 に そ って
作 られ た プ ロ グ ラム は 誤 りが 少 な く また読 み や す い と い わ れ て い る.
1.4.3 下 降 型 プ ログ ラ ミ ン グ と そ の 例 下 降 型 プ ロ グ ラ ミ ング上 達 の 秘 訣 は,ま ず 第 1に 問 題 を よ く理 解 す る こ とで あ る.こ の こ とは,い るが,プ
か な るプ ロ グ ラ ミ ン グ法 で あ っ て も変 わ りな い こ とで あ
ロ グ ラ ム の コ ー デ ィ ン グ に入 っ て か らプ ログ ラム の仕 様 が 変 わ る こ と
は プ ロ グ ラム の 信 頼 性,作 業 効 率 そ の 他 の す べ て の 面 か らみ て,も
っ と も避 け
な け れ ば な らな い こ とで あ る. そ の 第 2は,問 題 の 解 決 方 法 を何 回 も十 分 に吟 味 す る こ とで あ る.そ 第 3と第 4は な くて,第 グ:coding)が
して,
5 く らい にプ ロ グ ラ ミン グ言 語 で の 記 述(コ ー デ ィ ン
くる.問 題 が 与 え られ た と き,す
ぐ さ ま 端 末 機 に と りつ い て プ
ログ ラ ム 作 成 に か か りた くな る. TSSの
端 末 は,考 え な が らプ ロ グ ラ ミ ング で き る環 境 で あ る と考 え て い る人
が 多 い.し か し,静 か な個 室 で 豊 富 な計 算 機 資 源 に 恵 まれ て い て も,計 算 機 と 対 面 す る と,あ や,機
る種 の 興 奮状 態 とな り,独 善 の 思 い 込 み に 陥 りや す い.ま
械 の 騒 音 や 人 の 出 入 りの 煩 雑 な環 境 は,プ
して
ログ ラ ム に 適 して い る とは い
え な い. 冷 静 な プ ロ グ ラ ミン グ の た め に は,コ ー デ ィ ン グ か ら離 れ て,問 題 の仕 様, 採 用 す る ア ル ゴ リズ ム に十 分 な る思 索 を巡 らす こ とが,よ
りよ きプ ロ グ ラム の
作 成 の た め の 早 道 で あ る.こ の こ とを端 的 に 表 現 す るマ ー フ ィー の 法 則 と して The the
sooner longer
you
start
it is going
coding
your
program,
to take.
(プ ロ グ ラ ム コ ー デ ィ ン グ に と り か か る の が 早 け れ ば 早 い ほ ど, 完 成 ま で に よ り 多 くの 時 間 が か か る もの で あ る) と い う の が あ る が,こ
の よ う に い わ れ る の は,コ
ー デ ィ ン グ以 前 に よ く考 え る
こ とが な か な か む ず か しい か ら で あ ろ う. 下 降 型 の プ ログ ラ ミ ング の例 と して,数 多 くの メ ー カ ー で 製 造 され て い る あ る製 品 の 性 能 や 試 験 結 果 に基 づ い た順 位 に よる一 覧 表 を作 成 す るプ ロ グ ラ ム を 考 え て み よ う. こ の 問 題 は,「数 多 くの メ ー カー で製 造 され て い る あ る製 品 の 試験 結 果 に基 づ く一 覧 表 を作 成 す る」とい う こ と で あ る が,こ れ だ け で は 大 体 の こ とは わ か っ て も,プ ロ グ ラ ミ ング に か か るだ け の十 分 な 情 報 は 含 ん で い な い.さ
ら に詳 し
い 問 題 の 記 述 が 必 要 で あ る. プ ログ ラ ミ ング に必 要 な程 度 に詳 細 な 問 題 の 記 述 をプ ロ グ ラム の仕 様(specification)と 呼 ん で い る.プ ロ グ ラ ミン グ の 第 1段 階 は,こ
の 仕 様 を 正確 に理
解 す る こ とで あ る.し か しなが ら,問 題 の 提 出者 か らの 仕 様 が 完 全 で あ る こ と は あ ま り期 待 で き な い こ とが 多 く,と きに は問 題 の提 出 者 自身 が 正確 な仕 様 を 持 っ て い な い こ とす らあ る.問 題 の 提 出 者 とよ く相 談 して正 確 な 仕様 を作 り上 げ る こ とが 必 要 で あ る. こ の 問 題 の仕 様 は,問 題 の提 出 者 との相 談 の うえ,与 る もの,順
位 づ け をす るた め の 評 価 の 方法,出
え られ るデ ー タ に 関 す
力 の 書 式 に関 す る もの と三 つ に
分 け て 次 の よ う に得 られ た もの とす る.
仕 様 1.入
製 品の総数
力 デー タ
100以
下
試験 デー タ内容 (1)動
作精 度
x
0<=x<=100(整
数)
(2)最
大 出力
y
0<=y<=100(整
数)
(3)耐
久時 間
t
0<=t<=10000(整
(4)消
費電力
p
(5)外
形 寸 法(W,L,H)
(6)仕
様勝 手
u
5段 階 評 価
(7)デ
ザ イ ン
d
5段 階 評 価
50<=p<=100(実 10<=W,L,H<=150(実
数) 数) 数)
(5 段 階 評 価
5:よ
い
4:や
や よい
3:普
通
2:や
や悪 い
1:悪
い)
各 製 品 に 対 す る 評 価 結 果 は,製 品 認 識 番 号(5 桁 整 数),メ ー カ ー 名(10文 x,y,t,p,w,l,h,u,dの
字),
順 で 空 白 で 区 切 ら れ た 1 レ コ ー ドか ら な る テ キ ス ト型 の
フ ァ イ ル で 与 え ら れ る.
仕 様 2.評 価 基 準 評 価 基 準 に は,以 下 の 関 数 で 与 え られ る 2種 類 あ り,ど ち らの 基 準 で計 算 す る か は,計 算 す る時 点 で選 択 で きる よ うに す る.も ち ろ ん,計 算 され た基 準 値 が 大 きい ほ ど よ い 製 品 と され る. 評 価 基 準 1:
評 価 基 準 2:
仕 様 3.書
出力 書 式 は,順
式
位 と製 品 番 号 を 1ペ ー ジに 印 字 す る もの と,順 位 順 にす べ て
の デ ー タ を 出 力 す る もの と 2種 類 あ り(図1・4)
,その 両 者 を 出 力 す る,ど ち らか
一 方 だ け を 出 力す るか の 選 択 が 可 能 で あ る こ と . この プ ロ グ ラム は,主 計 算 部 分 が比 較 的 小 さ い の で,入 模 で 扱 う こ とが で き,プ
出 力 部 とほぼ 同 じ規
ロ グ ラ ム 全体 は デ ー タの 入 力 部,主 処 理 部,出
ら成 っ て い る と考 え られ る.さ
力部か
らに い くつ か の オ プ シ ョナ ル な機 能 が あ り,そ
れ らは そ れ ぞ れ の 関 連 処 理 の と こ ろで 指 示 され る よ りは,プ
ロ グ ラム の 開始 時
点 で 一 括 して 指 示 で き る ほ うが利 用 者 に は便 利 で あ ろ うか ら,プ 頭 に オ プ シ ョン指 定 部 を設 けて 図1・5の
ロ グ ラ ムの 先
構 造 図 式 の 第 1レベ ル の よ うな 四 つ の
ブ ロ ッ ク か らな る もの と しよ う. プ ログ ラム の大 ま か な機 能 と平 行 して,こ の レベ ル で 扱 わ れ るデ ー タ の 大 ま か な構 造 も頭 に 浮 か ん で い る はず で あ る.た
とえ ば,こ の レベ ル で は 各 製 品 の
(a)書
式 1
(b)書
式2
図1・4
集 ま りが 扱 われ て い るの で あ るが,個
々の 製 品 に 順 番 をつ け,そ の 順 に出 力す
る こ とが 要 求 さ れ て い る の で,順 番 の な い集 合 型 よ り も要 素 間 に順 番 が 明 確 に 定 義 され て い る 配 列 型 と した ほ うが よ い と考 え られ る. ゆ え に,製
品 の 集 ま りは,配 列 型 の デ ー タ構 造 を採 用 す る こ と にす る.た だ
し,各 要 素 の デ ー タ構 造 は もっ と下 位 の レベ ル で 扱 わ れ る こ とに な るの で,こ の 時 点 で は まだ 定 義 され な い.た だ し,並 べ 換 え(整 列)を 行 う と きの 基 準(並 べ 換 え の 鍵)と な る評 価 値 も試 験 結 果 の デ ー タ と同 じひ とま とめ の構 造 に格 納 で き る よ うに す る こ と を念 頭 に お い て お く こ と にす る.細 部 が 未 確 定 で あ る に も
図1・5
図1・6
か か わ ら ず,そ
の 上 位 の レ ベ ル の デ ー タ 構 造 を 定 め て し ま う こ と に は,後
正 し な け れ ば な ら な い の で は な い か との 懸 念 が あ る か も 知 れ な い.し ロ グ ラ ム 構 造 が 適 切 に 設 計 さ れ て い れ ば,上
で修
か し,プ
の レベ ル で 定 め られ た構 造 が 下 位
の レ ベ ル で の 処 理 に 矛 盾 す る こ と の 心 配 は ほ と ん ど す る 必 要 が な い. 以 下 の 詳 細 は 省 略 す る が,同 様 に 各 レ ベ ル に つ い て 考 慮 し た 結 果,図1・5の よ う な 構 造 図 式 の 全 体 が 構 築 さ れ る.こ
の 構 造 図 式 の 最 下 位 の レベ ル は,な
ん
の 参 照 も し な い で コ ー デ ィ ン グ で き る 程 度 に 細 分 化 さ れ た 機 能 単 位 で あ る か, ま た は,既
に完 成 され て い て 作 る必 要 の な いプ ログ ラ ムパ ッケ ー ジ で あ るか の
ど ち ら か で あ る. 構 造 図 式 を 十 分 に 点 検,改 ロ グ ラ ム は 図1・6の
善 し た 後 で コ ー デ ィ ン グ に 移 る.第
よ う に な り,こ こ で は 配 列 要 素 の 型itemや
set_data,main_processing,listingは
未 定 義 と な っ て い る.し
1レベ ル の プ
手 順read_and か _し,各
手順 の
引 数 の 個 数 や 型 の イ ン タ フ ェ ー ス は こ の 時 点 で 定 ま っ て く る こ と に 注 意 し よ う. 以 下,構
造 図 式 に そ っ て 図1・7の
な る に従 っ て,一
よ う に コ ー デ ィ ン グ さ れ る.下 位 の 構 造 に
つ の プ ロ グ ラ ム 単 位 の 機 能 は 狭 く ま た 詳 し く な っ て ゆ き,上
位 の レベ ル で 未 定 義 の ま ま残 され て い た 手 順 や 関 数 お よび デ ー タ構 造 の 細 部 が 記 述 さ れ て ゆ く.quicksort(第
7章 参 照)と 出 力 部 の 第 2 レ ベ ル 以 下 の コ ー デ
ィ ン グ は 紙 面 の 都 合 上 省 略 さ れ て い る.
(a) 図1・7(そ
の 1)
(b) 図1・7(そ
の 2)
(c)
(d) 図1・7(そ
[注 意]本 機(プ
の 3)
書 に お け るプ ロ グ ラ ム の リス トに は,本
文 と同 じ字 体 に よ る もの と,計 算 機 出 力 の 印 字
リ ン タ)に よ る もの と の 2種 類 が あ る.ど
word)は
ち ら の リ ス ト で も,Pascalの
太 字 体 に して 見 や す さ を図 っ て い る.計
で な い もの と字 体 を変 え る必 要 は な い.ま
予 約 語(reserved
算 機 へ の 入 力の 場 合 に は,予 約 語 と,そ
た,Pascalに
う
お け るポ イ ン タと フ ァイ ル 変 数 に は
↑記 号 が 用 い られ る.計 算 機 の 印 字機 に は ↑記 号 が 用 意 され て い な い もの が 多 く,そ の 場 合 は^記 号 が 代 用 さ れ る.本 書 で も,印 字 機 の プ ログ ラム リス トで は^記 号 が 使 用 さ れ て い る.
練習問題
第 1章
1.計
算 機 の プ ロ グ ラ ム 以 外 の 分 野 で,仕
事 の や りか たや 仲 間 ど う しの 意 志 の
疎 通 の た め に 用 い ら れ る 手 順 の 記 述 方 法 の 例 を あ げ よ.
2.あ
な た が プ ロ グ ラ ミ ン グ 時 に 用 い る 変 数 な ど の 命 名 法 や,あ
割 に 使 用 さ れ る 変 数 名,ま
た,プ
ロ グ ラ ム リス トを 見 や す くす る す る た め の レ
イ ア ウ トに 関 す る ノ ウ ハ ウ が あ れ ば,そ
3.以
る定 ま っ た役
下 に 示 し た 計 算 手 順 は,何
れ ら に つ い て 説 明 せ よ.
を 計 算 す る か.ま
た,こ
の計 算 手 順 は ア ル ゴ
リ ズ ム と な っ て い る か 否 か を 答 え よ. Step-1
与 え ら れ た 入 力 デ ー タ n(4 以 上 の 整 数)に 対 し,sqrt(n)を
計 算 し,
そ の 値 を r と す る. Step-2
作 業 変 数 iを 3 に セ ッ トす る.
Step-3
も し n が iで 割 り切 れ た ら'no'と 出 力 し て 停 止 す る.
Step-4
も しi≧rな
Step-5
iの 値 を 2増 加 し てStep-3へ
4.関 数f(x)と
そ の 導 関 数f'(x)が
の とす る),f(x)=0な
5.Pascalに
た,こ
出 力 し て 停 止 す る. も ど る.
与 え られ た と き(f'(x)は
連 続 関 数 で ある も
る 方 程 式 の 近 似 解 を 求 め る 方 法 と し て,ニ
ラ プ ソ ン(Newton-laphson)の 調 べ よ.ま
ら ば,'yes'と
ュー トン ・
方 法 が よ く知 ら れ て い る.こ の 解 を 求 め る 手 順 を
の 手 順 は ア ル ゴ リ ズ ム で は な い こ と を 示 せ.
は 複 素 数 型 の デ ー タ は 用 意 さ れ て い な い.そ
こで 複 素 数 型 を
complex=record x:real; y:real end;
とい う よ うに 直 交 座 標 系 で 表 現 す る場 合 と, complex=record r:real; theta:real end; と い う よ う に,半 あ る.複
径 と X 軸 と の な す 角 度 に よ る 極 座 標 系 の 2種 類 の 表 現 形 式 が
素 数 間 の 演 算 と し て 加 減 乗 除 を 考 え る こ と に す る.ど
も 1複 素 数 が 二 つ の 実 数 に よ っ て 表 現 さ れ る.し
か し な が ら,同
ち らの 表 現 方法 じ複 素 数 型 の
数 シ ス テ ム を 表 現 し な が ら も 異 な っ た 型 の 表 現 と な る. 2 複 素 数x,yを
加 算 した 結 果 を値 とす る関 数addcomp(x,y),減
とす る 関 数compsub(x,y),同 (x,y)を
6.あ
算 の 結 果 を値
様 に乗 算,除 算 に 対 してcompmult(x,y),compdiv
そ れ ぞ れ の 表 現 形 式 に 合 わ せ て プ ロ グ ラ ム せ よ.
な た の 自 宅 か ら学 校 ま た は 勤 務 先 ま で ど の よ う し た ら 到 達 で き る か,階
層 的 な 箇 条 書 き に よ る 説 明 法 を 用 い て 記 述 せ よ.階 (1)
自 宅 か ら徒 歩 で 三 鷹 駅 に 行 く.
(2) 三 鷹 駅 か らJR中
と い う よ う に,ま え ば,上
層 的 な 記 述 と は,
央 線 の 電 車 に 乗 り,東 京 駅 で 下 車 し 八 重 州 口 に 出 る.
ず 大 ま か な 説 明 を し,そ
の 記 述 の(1)に
の 後 に 各 項 目 を さ ら に 詳 し く,た
つ い て は,
(1-1)
自 宅 前 の 幸 い 通 り を 北 に300m行
(1-2)
天 神 通 り との 交 差 点 を 右 に 曲 が り,東 に50mほ
(1-3) と い う よ う に 階 層 化 す る 方 法 で あ る.
き, ど行 っ た と こ ろ で
と
[2] アル ゴ リズムの評価
2.1ア
ル ゴ リズム の記述
ア ル ゴ リズ ム な どの 記 述 は,正 確 で あ い ま い さの な い こ とが 重 要 で あ る.一 般 に 用 い られ て い る記 述法 で,も
っ と もこの 要 求 に合 致 して い るの は,数 学 で
用 い られ て い る記 法 で あ ろ う.ゆ え に,ア ル ゴ リズ ム の 記 述法 に も多 くの 数 学 的 記 法 が 取 り入 れ られ て い る. しか し,そ の ほ とん どは,数 学 を 少 しで も学 ん だ 人 々 に は 自明 な記 法 で あ る の で,こ
こ に 一 つ ず つ 紹 介 す る こ とな しに使 用 させ て 頂 く.簡 単 な例 を あ げ る
と, x+y*z x2-3.14>z
string='abc'
な ど で あ る.た
だ し,最
後 の 例 で は 変 数stringの
か 否 か と い う命 題 を 表 現 し て お り,そ BASICで
のstringに'abc'を
あ ま り一 般 的 で は な い が,ア
値 が 文 字 列'abc'に 等 し い
の 値 は 真 ま た は 偽 で あ る.FOTRANや
代 入 せ よ と い う 意 味 で は な い こ と に 注 意 し よ う. ル ゴ リズ ム や プ ログ ラム に関 す る記 述 に しば し
ば 用 い ら れ る 記 号 と記 法 を 表2・1に
紹 介 し て お く.
ア ル ゴ リ ズ ム の 記 述 と は 直 接 関 係 は な い が,あ
い まい さの 生 じや す い記 述 に
表2・1
記号
意
←
味
例
右辺の値 を計 算 しその値 を左辺の変数 に代入す る 〓右辺 と左辺 の変数 の値 を入れ換え る
〓α」
X←2+a X〓Y
実数値 を取 る数式αの値 を越 えない最 大の整数 を表す
〓3.5」=3 〓4.0」=4
「α〓
実数値 を取 る数式αの値 を以上の最 少の整数 を表す
「3.5〓=4 「4.0〓=4
対 す る 幾 つ か の 約 束 を 定 め て お こ う.最 つ い て 触 れ て お く.厳
密 な 議 論 は 第 3章3.3節
図 に よ る 表 現 に 限 る こ と に す る.X る X に は,2
初 は変 数 とそ の値 に つ い て の 記 述 法 に で さ れ る が,こ
こで は主 と して
が あ る 変 数 を 表 し て い る と き,文
中 に表 れ
と お りの 意 味 が あ る.
そ の 一 つ は 変 数 名 を 表 し,他
方 は 変 数 X の 値 を 表 し て い る 場 合 で あ る 「そ の
答 は 変 数 X に 格 納 さ れ て い る 」と い う場 合 は 前 者 で あ り,「 X を 4 で 割 っ て 四 捨 五 入 す る 」と い う 場 合 は 後 者 に な る.こ は,var(X),val(X)と
の 区 別 を厳 密 に す る 必 要 の あ る と き に
記 述 す る こ と に す る.
前 の 二 つ の 例 文 は,「そ の 答 は,var(X)に 4で 割 っ て 四 捨 五 入 す る 」と な る.ま
格 納 さ れ て い る 」お よ び 「val(X)を
た,var(X)の
値 が'abc'で
あ る こ と を図
で 表 現 す る と,
と な る.Pascalで ル
ドX,Y,Zか
は,デ
ー タ が 階 層 的 に な っ て い る こ と が 多 い が,R
ら な る レ コ ー ド で,X,Y,Zの
値 が そ れ ぞ れ'a',123,trueで
が フ ィー あ る と
き は,
と な り,配 列A[1..3]の 図 的 表 現 は,
各 要 素 の 値 が そ れ ぞ れ3.14,365,1.732で
あ る と きの
と な る. 上 記 の 変 数 の 場 合 に 限 ら ず,一 い る の か,そ
般 的 に書 か れ て い る もの が そ れ 自身 を示 して
の 意 味 す る もの を 表 し て い る の か が 問 題 に な る こ とが た び た び 生
ず る. た と え ば,Pascalのif文 if
は,
Boolean_expression
と表 現 さ れ た と き,if,then,elseの
then
statement
else
statement
単 語 と, Boolean_expresseion,statement
な ど の 単 語 と は 書 か れ た 意 味 が 異 な っ て い る. 前 者 はif文
の 構 成 要 素 そ の もの,つ ま りifやthenは
に 書 か れ る も の で 終 端 記 号(terminal
symbol)ま
そ の ま まプ ロ グ ラ ム の 中
た は 単 に 記 号(単 語)と 呼 ば れ
て い る. 後 者 は,そ
こ に 書 くべ き も の の 意 味 を 示 し て お り,超 記 号(meta-symbol)ま
た は メ タ 記 号(メ タ 単 語)と 呼 ば れ て い る. 上 記 の 例 で は,両
者 の 区 別 が な い の で メ タ 記 号 と終 端 記 号 と が 判 明 せ ず,正
確 な 意 味 を つ か む こ と が む ず か し い.こ う に,終
の 2種 類 の 記 号 を 正 し く区 別 で き る よ
端 記 号 に は ア ン ダ ー ラ イ ン を す る,"記
で く く る と か,終
端 記 号 に は 英 単 語,メ
号 で く く る,メ
タ 記 号 を<>
タ記 号 に は 日本 語 とい う よ う に言 葉 と
か 文 字 を 変 え る な ど の 方 法 を 取 っ て い る. 本 書 で は,終
端 記 号 を"記
号 で く く る 方 法 を 採 用 す る こ と に す る.前
のif
文 の 例 は, "if"
B
oolean_expression"then"
statement"else"
statement
と い う よ う に な る. 本 書 に お け る ア ル ゴ リ ズ ム の 記 述 法 は,大 そ の 第 1は,上
き く 3種 類 に 分 類 さ れ る.
記 の 数 学 的 また は約 束 され た 記 法 を 含 ん だ 自然 言 語 で 箇 条 書
さ れ た 一 連 の 命 令 ス テ ップ か ら 成 り,特
に 指 定 の な い 場 合 は 先 頭 の ス テ ップ か
ら 実 行 す る も の と す る. 第 2の ア ル ゴ リ ズ ム の 記 述 法 は,フ 法 は,視
ロ ー チ ャ ー トに よ る もの で あ る.こ
覚 的 な わ か り や す さ が 特 徴 で,こ
の方
こ で は 主 と し て 以 下 に 述 べ る 第 3の
図2・1
方 法 に よ る ア ル ゴ リ ズ ム 記 述 の 補 助 的 な 役 割 と して 使 用 さ れ る の み で あ る の で, 図2・1の
よ う な ご く基 本 的 な 構 成 要 素 の み で 記 述 す る こ と に す る.
第 3 の 記 述 方 法 は,Pascalの の で あ る.前
者 は,も
プ ロ グ ラ ム ま た は 擬Pascalプ
ロ グ ラム に よる も
っ と も正 確 で あ い ま い さ の な い 記 述 で あ る が,細
で 厳 密 な 記 述 を 必 要 と し な い 場 合 に は 適 当 で は な い.た
と え ば,あ
部 に ま
るプ ロ グ ラ
ム で 用 い ら れ て い る ア ル ゴ リ ズ ム を 記 述 す る の に プ ロ グ ラ ム 自身 で 示 さ な け れ ば な ら な い の は,ナ
ン セ ン ス で あ ろ う.か
と い っ て,第
さ が 多 す ぎ る と い う 場 合 に は,後 者 の 擬Pascalプ
1の 方 法 で は あ い ま い
ロ グ ラ ム が しば し ば 用 い ら れ
る. 擬Pascalプ
ロ グ ラ ム と は,あ い ま い さ の 入 り 込 ん で く る の を 避 け た い 部 分 に
は,Pascalの
文 章 を 用 い,既
し な い と こ ろ に は,自 た と え ば,擬Pascalプ Var
に わ か っ て い る こ とや あ ま り正 確 な 記 述 を 必 要 と
然 言 語 を 用 い た 折 衷 文 で 表 現 さ れ て い る. ロ グ ラ ム に お い て は,プ
V1,V2,…,Vn:integer;
ログラム中 に
の よ うな 自然 言 語 的 な 表 現 も許 され る.擬Pascal文
に は,正 式 な文 法 な ど は な
く,意 図 した 意 味 が あ る程 度 正確 に表 現 で きれ ば よい もの とす る. 二 つ の 正 整 数x,yの
最 大 公 約 数 を求 め る有 名 なユ ー ク リ ッ ドの互 除法 の アル
ゴ リズ ム を そ れ ぞ れ の 方 法 で 表現 す る と,図2・2の Step1:も
しx
Step2:z← Step3:も
あ れ ばx〓yを 〓x/y」
しx-yz=0な
Step4:x←y,y←zを
よ う にな る.
実 行 す る
を 実 行 す る ら ば, yを 最 大 公 約 数 と し,ア
ル ゴ リズ ム を停 止 す る
実 行 し た 後,Step2へ
(a)自
(b)フ
然 言 語 に よ る記 述
ロ ー チ ャ ー トに よ る 記 述
(c)擬Pascalに
図2・2
よ る記 述
3種類 の ア ル ゴ リズ ム 表 記 法
2.2 2.2.1評
アルゴリズムの計算時間 価基準 について
第 1章 で 述 べ た よ う に,プ
ログ ラム の評 価 の 方法 に は 種 々 な評 価 基 準 が 考 え
られ る う え に,数 量 的 な 評 価 が む ず か しい もの や,相
異 な る基 準 間 の 数 量 的 関
係 が 明 確 で な い こ とな どか ら,総 合 して一 次 元 的 な評 価 は 困 難 で あ る.こ の 章 で は,ア ル ゴ リズ ムの 評 価 基 準 を も っ と も数 量 化 しや す い計 算機 資 源(計
算時
間 や 記 憶 容 量)の 立 場 か ら議 論 す る こ とに す る. 計 算 の 遂 行 に際 して,評 価 の 基 準 と な る 資源 の 主 た る もの は,計 算 時 間 と占 有 記 憶 領 域 で あ る.他 の評 価 基 準 に比 べ て数 量 化 が 容 易 で あ る この 二 つ の 間 で さ え も,一 方 を小 さ くす れ ば 他 方 が 増 大 す る とい う一 般 的 傾 向 は認 め られ て も, 数 値 的 な 等 価 交換(trade
off)の 関 係 を求 め る こ と はむ ず か しい 問 題 と な っ て
い る. 現 在 の 計 算機 で は,す べ ての 計 算 が フ ォ ン・ノイ マ ン(von
Neumann)方
式,ま
た は逐 次 計 算 型 と も呼 ばれ る方 式 で 直 列 的 に計 算 して い る.こ の 方 式 で は,あ る一 時 点 で は一 つ の デ ー タ しか ア ク セ ス で きな い た め に,占 有 記憶 領 域 が計 算 の 複 雑 さの 増 大 と と もに飛 躍 的 に大 き くな る こ とは 少 な く,大 多 数 の 場 合 が 入 力 デ ー タ の 量 と必 要 と され る記 憶 容 量 は線 形 の 関係 に お さ え られ る. 逆 に,逐 次 計 算 で あ るが ゆ え に,計 算 時 間 と 入 力 デ ー タの 量 との 関 係 は,計 算 内容 に よ っ て 大 幅 に 変 化 す る.立 場 を 変 え て み る と,フ
ォ ン・ノ イ マ ン型 の
計 算 機 で は,ア ル ゴ リズ ム の善 しあ しに よ って 大 きな 影 響 を受 け る の は,占
有
記 憶 容 量 よ りはむ しろ計 算 時 間 で あ る とい え る. 以 上 の 理 由 か ら,ア ル ゴ リズ ム の 第 1の評 価 基 準 は そ の計 算 時 間 とす る こ と が 一 般 的 とな っ て い る.現 在 研 究 段 階 に あ る並 列 計 算 を 主 とす る計 算 方 式 が 実 現 した暁 に は,計 算 に 必 要 と さ れ る処 理 機 の 数 や 記 憶 量 な どの 基 準 の 比 重 が 増 大 す るで あ ろ う.し か し,計 算 時 間 と処 理 機 の 数 や 記 憶 容量 との 間 の 等 価 交 換
を 求 め る こ と は,む
2.2.2ア
ず か し い 問 題 の 一 つ と して 残 る で あ ろ う.
ル ゴリズムの計算 時間
ア ル ゴ リズ ムの 計 算 時 間 だ け を評 価 の 基 準 と して も,ま だ 多 くの 問 題 点 が 生 じて くる.ま ず,簡
単 な例 を幾 つ か あ げて み よ う.
【 例 1】 あ るア ル ゴ リズ ム はA 計 算 機 で は10秒 かか り,B計 算機 で は12秒 か か った とす る.も う一 つ の ア ル ゴ リズ ム で は,同 じデ ー タに 対 しA計 算 機 で は14秒
か か り,
B計 算 機 で は 9秒 で あ っ た とす る.ど ち らの ア ル ゴ リズ ム が 優 れ て い るで あ ろ う か? 【例 2】 同 じ問題 を解 くアル ゴ リズムA1,A2が 計 算 時 間 は 3秒 で あ り,A2で
あ る.10個 の デ ー タ に対 して はA1で の
の計 算 時 間 は 5秒 で あ っ た.ま た,50個
に 対 して はA1が60秒,A2が55秒
の デー タ
で あ った とす る とき,ど ち らの アル ゴ リズム が
優 れ て い るで あ ろ う か? 【 例 3】 同 じ内 容 で表 現 の異 な る 2種 の デ ー タD1,D2あ ル ゴ リズ ムA1,A2が A2はD1に
あ る.A1はD1に
対 して は 8秒,D2に
り,二 つ の 同 じ問 題 を 解 くア
対 し10秒,D2に
対 して は15秒
か か っ た.
対 して は20秒 の 計 算 時 間 で あ っ た と き,ど ち ら
の ア ル ゴ リズ ム が優 れ て い るか? そ れ ぞ れ の 例 に つ い て,こ れ だ け の 数値 で ア ル ゴ リズ ム の 優 劣 が つ け られ る と考 えて い る わ け で は な い が, (1)ア
ル ゴ リズ ム を構 成 して い る演 算 に対 す る機 械 の 計 算 速 度 の 相 違
(2)計
算 の デ ー タ量 に 対 す る計 算 量 の 変 化 の相 違
(3)異
な った デ ー タ の 表 現 に対 す る計 算 量 の相 違
な どに対 して どの よ うな 評 価 を下 す か とい う問題 を提 起 して い る. 簡 単 な ア ル ゴ リズ ム の 具 体 例 を考 え よ う.以 下 の プ ロ グ ラム は,寸 法 3の 配 列 X の 中 の 整 数 で最 大 の もの を求 め る アル ゴ リズ ム で,配 列 の 中 の 3整 数 は す
図2・3
最 大 値 を求 め る簡 単 な ア ル ゴ リズ ム の 例
べ て異 な る もの とす る. い ま,図2・3で MX5ま
与 え られ た最 大 値 を求 め る手 順 を 図 に示 され た よ うに,MX1∼
で に 分 割 す る と,各 部 分 の 実 行 回数 は MX1…1(1) MX2…3(n) MX3…2(n-1) MX4…
a
MX5…2(n-1)
とな る.MX4の
実 行 回 数 aは 与 え られ た デ ー タの 配 置 に よ って 変 化 す る.そ れ
ぞ れ の 配 置 に 対 して aの値 は X[1]<X[2]<X[3]…0 X[1]<X[3]<X[2]…1 X[2]<X[1]<X[3]…0
X[2]<X[3]<X[1]…1 X[3]<X[1]<X[2]…1 X[3]<X[2]<X[1]…2 と な り,そ
れ ぞ れ の 配 置 の 出 現 確 率 が 等 しけ れ ば,a
MX1,MX2,…,MX5の
の 値 は 平 均5/6で
実 行 時 間 を そ れ ぞれT1,T2,…,T5と
あ る.
す れ ば,こ の ア ル ゴ リ
ズムの平均 の実行時 間T は
T=T1+3*T2+2*T3+(5/6)*T4+2*T5 と な る.max_index=nと
し た と き の aの 値 は,デ
ー タ の 起 こ り う るす べ て の
配 置 が 等 確 率 で あ る とす れ ば, 最 少回数
…
0
平均 回 数
…Hn-1
最 大回数
…n-1
標準偏差
…(Hn-Hn2)1/2 で あ る)
(た だ し, と な る こ と が 知 ら れ て い る(付 録 B参 照).
こ の ア ル ゴ リズ ム の 解 析 結 果 は,ア ル ゴ リズ ム を実 行 時 間 で評 価 す る と きの 前 述 の 各 疑 問 に 対 して,ほ
ぼ 完 全 な解 答 を含 ん で い る.各 演 算 の計 算 速 度 の 相
違 に 対 して は,評 価 式 に 各 演 算 別 の項 を設 け た こ と に よ り,種 々の 演 算 速 度 の 機 械 に対 して も各 演 算 の 実 行 時 間 が わ か れ ば評 価 で き る. デ ー タ の構 成 に起 因 す る計 算 量 の 変 化 に対 して は,統 計 的 見 地 か らの 評 価 を して い る.最 後 に,デ ー タ量 の 変 化 に対 して は,評 価 式 の 中の 各 項 が,デ
ータ
量(こ こ で の例 で は n)を 表 す 変 数 の 関 数 と して表 現 さ れ て い る.前 例 で の デ ー タ量 を n とす る と平 均 実 行 時 間T(n)は, T(n)=T1+n*T2+(n-1)*T3+Hn*T4+(n-1)*T5 と 表 現 さ れ る.
2.2.3デ
ー タ 量 に対 す る 計 算 時 間
アル ゴ リズ ム を 設計 す る際 に は,で
き るだ け一 般 化 を して 広 い適 用 範 囲 を持
つ よ う に 考 え る こ とが よ い ア ル ゴ リ ズ ム を 作 る 秘 訣 の 一 つ と さ れ て い る .よ ア ル ゴ リ ズ ム ま た は 一 般 的 な ア ル ゴ リ ズ ム は,プ 法 に よ っ て あ ま り 変 化 せ ず,繰
い
ロ グ ラム の 寸法 が デ ー タの 寸
り返 し計 算 の 回 数 に 影 響 を 与 え て い る.こ
の こ
とは ノ イマ ン型 の 計 算 アル ゴ リズ ム の 基 本 的 な 性 質 で あ る. こ の 項 で は,こ
の デ ー タ の 寸 法 と計 算 時 間 と の 関 係 を も う 少 し詳 し く検 討 し
て み る こ と に す る. い ま,同
目 的 の 二 つ の ア ル ゴ リズ ムA1,A2の
n に 対 し て そ れ ぞ れT1(n),T2(n)と
平 均 計 算 時 間 が,デ
ー タの 寸 法
す る とき
T1(n)=45+12n+0.001・2n T2(n)=12+30・n2
と 与 え ら れ た と し た と き,ど 表2・2に
示 し た よ う に,こ の 二 つ の ア ル ゴ リ ズ ム は デ ー タ の 個 数 に よ っ て そ
れ ぞ れ の 優 劣 が 変 わ る.n=1の n=30の
の よ う な評 価 をす べ きで あ ろ うか .
と き はA2が
と き はA2が, n=10,20の
と き はA1が,そ
して
勝 っ て い る. 表2・2
デ ー タの 数 が 固 定 して い る場 合 の議 論 な らば,T1,T2の
値 が 少 な い ほ うが
優 れ た ア ル ゴ リズ ム とい う こ とが で き るが,一 般 に は アル ゴ リズ ムの 設計 段 階 で デ ー タの 数 が 定 まっ て い る こ とは少 な い.こ の よ う な場 合 に は,デ ー タ の 数 が 非 常 に大 きい 場 合 を想 定 して 評 価 す るの が 普 通 で あ る. そ の 理 由 は,多
くの ア ル ゴ リズ ム の計 算 時 間 関 数 が デ ー タの 数 に対 して 線 形
以 上 の 増 加 率 を示 し,物 理 的 ま た は経 済 的 条 件 か らの 実 際 の 計 算 可 能 性 が 問題 と な る の は,デ
ー タ 数 が 大 き くな っ た と きで あ る.
前 例 の場 合,計 算 時 間 の 単位 が秒 で あ っ た とす る とデ ー タ数10で
は アル ゴ リ
ズ ムA1は
3分 弱,A2は
数 が30と
な る と,Alは12日
る.A1,A2と で は,A2の
も に,適
約 5分 で あ り),た い し て 困 難 な 状 況 に は な い が,デ 半,A2は7.5時
ー タ
間 と な り,そ の 差 は 大 き く な っ て い
用 デ ー タ 数 に 論 理 的 な 制 限 は な い.し
か し,実
ほ う が 広 い デ ー タ 適 用 範 囲 を 持 っ て い る こ と か ら,A2の
際 の計算
方 がA1よ
り
も 優 れ た ア ル ゴ リ ズ ム で あ る と い え る. 数 学 の 分 野 で 用 い ら れ て い る O 関 数(big-oh
function)が
デ ー タ数 を 固 定 し
な い 場 合 の ア ル ゴ リ ズ ム の 一 般 的 評 価 の 考 え 方 を 的 確 に 表 現 し て い る こ と か ら, こ の 関 数 に よ る ア ル ゴ リズ ム の 評 価 法 が 広 く用 い ら れ て い る. O 関 数 は,実
数 を 引 数 と し実 数 を 値 と す る 関 数 の 中 で 引 数 が 非 常 に 大 き く な
っ た と き に,も
っ と も増 加 率 の 大 き い 項 が 等 し い 関 数 の 集 合 を 表 し て い る(詳
し く は 付 録 A 参 照). た と え ば,
f(x)=31x2+431x+560 g(x)=10334-568logx+0.095x2 h(x)=(x+x1/2)2+3.17x+607
図2・4
な どの 関 数 はす べ て最 大 増 加項 と してx2を もつ グル ープO(x2)に 表2・2の
例 で は,T1(n)はO(2n)に
属 し,T2(n)はO(n2)に
含 まれ て い る.
属 している.明 らか
にT1の 増 加 率 の ほ うが 大 き い こ とが わ か る. 代 表 的 な関 数 に 対 す る計 算 時 間 をn=10の 係 数 値 を 正 規 化 し た もの を図2・4に
と きに関 数値 が 等 し くな る よ うに
示 した.こ の 図 か らだ け で は,相 異 な る増
加 率 と係 数 との 関 係 は捕 え に くい で あ ろ うが,お
お よそ の 関 係 は つ か む こ とが
で き る で あ ろ う. 以 上 の 結 果 を ま とめ る と,一 般 的 な ア ル ゴ リズ ム の計 算 時 間 に よ る評 価 方法 は,次 の 順 番 で評 価 して最 初 に優 劣 が つ い た もの を採 用 す る もの とす る. (1)平
均 計 算 時 間 の デ ー タの 寸 法 に 対 す る最 大 増 加 率 が 小 さ いほ ど よい.
(2)最
大 増 加 率 の 係 数 が 小 さ い ほ ど よい.
(3)計
算 時 間 の 分 散 が 小 さ い ほ ど よい.
この 評 価 方 法 は,一
つ の 目安 で あ っ て絶 対 的 な もの で は な く,場 合 場 合 に よ
っ て評 価 順 序 が 入 れ 換 わ る こ と もあ る し,他 の 基 準 が取 られ る こ と もあ る.
2.2.4計
算時間 の解析の例
実 際 の具 体 例 に お け るア ル ゴ リズ ム の評 価 は,以 後 の 章 で 個 々 に学 ぶ の で, こ こで は 簡 単 な 一 例 だ け を示 す に と どめ る. 問題 とそ れ を解 くプ ログ ラム が 次 の よ うに 与 え られ て い る と き,こ のプ ロ グ ラ ムの 計 算 時 間 に つ い て解 析 して み よ う.
data_file=array[1..n]of record key:searching_key; cont:information end と い う構 造 の デ ー タ が あ る.x:searching_keyが (1)も
し,data_fileの
変 数posに
与 え ら れ た と き,
中 に x と 等 し い 鍵 を 持 つ レ コ ー ドが 存 在 す る と き は,
そ の レ コ ー ドの 配 列 内 で の 位 置 を,
(2)そ
う で な い と き に は,変
数posに
0 を 代 入 す る.
こ の 問 題 を解 くプ ロ グ ラ ム の 一 例 は procedure
search(A:data_file;
var
pos:integer);
var i:1..n;
found:Boolean;
begin found
:=false;
pos
:=0;…(1)
while(i<=n)and(not
found)
do…(2)
begin pos
:=pos+1;…(3)
if A
[i].key=K
found
then…(4)
:=true…(5)
end; if i>n
then
pos
:=0
else
pos
: =i…(6)
end; の よ う に な り,こ の 手 順 の 実 行 部 分 の(1),(2),…,(6)の に そ れ ぞ れt1,t2,…t6の
各 行 を 1回 実 行 す る の
時 間 が か か る も の と す る.ま
た,配
ドが 探 索 さ れ る 確 率 はA[1]がp1,A[2]がp2,…,A[n]がpnで 検 索 の ア ル ゴ リ ズ ム の 評 価 を す る と き に は,検 ァ イ ル 中 に あ る 場 合,す
列 中の各 レコー あ る.
索 す る 鍵 を持 つ レ コ ー ドが フ
な わ ち 検 索 に 成 功 す る 場 合 と,鍵
が フ ァ イル 中 に な い
場 合 す な わ ち 不 成 功 の 場 合 と 分 離 し て 考 え る の が 一 般 的 で あ る. そ の 理 由 は,成
功 に 終 わ る 鍵 に 対 し て は,検
索 確 率 が 求 め ら れ て も,不
に 終 わ る 検 索 の 鍵 の 種 類 が ど の よ う な も の で あ る の か 不 明 で あ り,そ
成功
の 検 索確
率 が 求 め ら れ な い こ と に よ る. しか し な が ら こ こ で は,不 成 功 の 場 合 の 確 率 も わ か っ て い る も の と して 扱 う. こ の よ う に 仮 定 し て お け ば,成
功,不
成 功 の 場 合 を分 離 し た 場 合 の 解 析 も,特
殊 例 と し て 扱 う こ と が で き る か ら で あ る. こ の 場 合,成
功 に 終 わ る 確 率Psは
で あ り,不 成 功 に終 わ る場 合 の 確 率Puは Pu=1-Ps
で あ る.最 初 に,不 成 功 の 場 合 を解 析 して み よ う.不 成 功 の 場 合 に は,検 は フ ァ イル 内 の す べ て の レ コー ドの 鍵 と比 較 させ るの で,プ
索鍵
ロ グ ラム の 各 部 の
実 行 回 数 は, (1)…
1 回
(2)…n+1回 (3)…
で あ る.(2)の
n 回
実 行 回 数 がn+1回
た 後 に,i>nと
n 回
(5)…
0
回
(6)…
1
回
とな っ て い る の は,n 個 の レ コ ー ド と比 較 さ れ
な る こ と が,while文
理 式 はn+1回
(4)…
で 判 定 さ れ る.で
実 行 さ れ る こ と に な る.ゆ
え に,不
の 数 字 は 不 成 功 に 終 わ る 限 り一 定 で あ る.
次 に,成
功 の 場 合 で あ る が,い
(1)…
,各 1
j
索 鍵 が 配 列 の j番 目 の レ コ ー ドの 鍵 と
部 の 実 行 回 数 は, 回
(2)…j+1回 (3)…
ま,探
回
の論
成功の場 合の計算 時間 は
と な り,こ
一 致 して い た とす る と
あ る か ら,while文
(4)…
j回
(5)…
1 回
(6)…
1 回
と な り,計
算 時 間 は,
と な る.よ
っ て,全
と な る.各
レ コ ー ドの 検 索 さ れ る確 率 が 等 し い と き に は,
体 と し て の 平 均 計 算 時 間Tavは,
とな り,平 均 計 算 時 間 は
と な る. 成 功 の 場 合 だ け の 解 析 はT'avの
式 でPu=0
,Ps=1と
お け ば よ く,
平均計算 時 間: 最 短計算 時 間: 最 長計算 時 間: で あ る.ま
た 不 成 功 と な る と き は,先
に 求 め た よ う に,
計 算時 間: で一 定 で あ る. 平 均 計 算 時 間 を O-関 数 で表 現 す る と,成功 ・不 成 功 の どち らの 場 合 もO(n)と な っ て い る の で,検
索 す る フ ァイ ル の 大 きさ に 比例 した検 索 時 間 が か か る こ と
が わ か る.
2.3ア
ル ゴ リズムの 改善
こ の 節 で は,ア ル ゴ リズ ム の計 算 速 度 か らみ た評 価 を中 心 に ア ル ゴ リズ ム の 改 善 方法 につ い て 考 え る.計 算 速 度 を早 くす る方 法 は,大
き く分 け て,次 の 二
つ に分 類 で き る. (1)計
算 機 で よ り高 い効 率 が 得 られ る よ うな 計 算 原 理 を 開 発 す る.
(2)ア
ル ゴ リズ ム を改 善 す る.
最 初 の 方 法 は,計 算 の た め の 原 理 を改 善 す るの で あ るか ら,こ れ は単 にプ ロ グ ラ ミ ン グ に特 有 の 問題 で は な い.た
と え ば,数 学 の 分 野 に お い て,微 分 方程
式 を解 く問 題 を代 数 方程 式 に翻 訳 して,計 算 を簡 易 化 す る演 算 子法 な ど は そ の 典 型 的 な もの で あ る. 計 算 機 に密 接 した 数値 計 算 の分 野 に お い て,も う少 し専 門 的 な 例 で は あ るが, 周 期 関 数 の 調 和 解 析 が あ る.問 題 の 要 点 は,
な る級 数Ckを 計 算 す る こ とで あ るが,計 算 機 に よ る数値 計 算 が 実 用 され 始 め た 時 代 に は,f(t)の
部分 区 間 を二 次 方 程 式 で近 似 す るな ど して 上 式 の 数 値 積 分 を
い か に早 く正 確 に 実 行 す る か が い ろ い ろ工 夫 され た. 現 在 で は,時 系 列 解 析 法 に基 づ い たFFT(Fast 開 発 に よ り,精 度,速
Fourier
Transform)技
法の
度 と もに 大 幅 に改 善 され て い る.
この 種 の 方 法 は,そ れ ぞ れ の 問題 に 固有 な解 決 方 法 を と らな け れ ば な らず, また 前 に も述 べ た よ う にプ ログ ラ ミン グ 以 前 の 問 題 で あ る.こ れ に対 して,第 2の 方 法 は,計 算 の 原 理 的 な と こ ろ は 変 え ず に,計 算 量 を改 善 した り,多 少計 算 の 原 理 的 な と こ ろ を変 更 して も,そ れ は そ の 問 題 に特 有 で は な く普 遍 的 に適 用 で きる 手法 で あ る とこ ろ が 前 者 と異 な る点 で あ る. 以 下 に 幾 つ か の 具 体 的 な 方法 につ い て検 討 しよ う.
2.3.1演
算 回数 の 減 少,短
時間演算への 置き換え
計 算 時 間 の短 縮 の た め の 方法 は,究 極 的 に はす べ て こ の 方法 に分 類 され て し ま うが,こ こ で は特 にそ の 計 算 固 有 の 知 識 や 技 巧 を必 要 と しな い 常識 的 な もの, た とえ ば 乗 除 算 を で き るだ け少 な くす る こ とな どで あ る. 有 名 な例 では,数 式 の 中の2*xや4*yな
どは,x+x,y+y+y+yに
置 き換
え た ほ うが早 く実 行 さ れ る計 算 機 が 多 い. ま た, …(1)
とい う よ うな 多項 式 の値 y をあ る x の値 につ いて 計 算 す る とき,(1)式 の ま まで計 算 す る よ りは …(2)
と して 計 算 す る と,(1)式で は 乗 算 を{n(n+1)/2}回
と加 算 n 回 実 行 す るが,(2)式
で は 乗 算 n 回,加 算 n 回 と減 らす こ とが で き る.多 項 式 の 次 数 を n とす る と,(1)式 で は 乗 算 の 実 行 回 数 がO(n2)で
あ る の に 対 し(2)式 で はO(n)と
な っ て い る.
2.3.2計
算 した結果の有 効利用
も っ と も簡 単 な 例 は,プ ロ グ ラ ム の 中 で 同 一 の 計 算 を 複 数 回 実 行 す る場 合 に, 一 度 計 算 した 内 容 を後 に利 用 で き る よ うに保 存 して お き
,以
後 の計 算 は しな い
で 済 ま す こ と に よ り計 算 時 間 が 節 約 で き る. 節 約 さ れ る 計 算 量 は,保
存 し て あ る 内 容 を 得 る た め に 費 や した 計 算 量 が 大 き
い ほ ど 大 き い. た と え ば, if
getmax(A)>current_max
と い う よ う なif文 temp_max
then
current_max:=getmax(A);
が と き ど き見 ら れ るが,getmax(A)の
計 算 量 が 多 い と きに は,
:=getmax(A);
if temp_max>current_max
then
と す る こ と に よ っ てgetmax(A)を
current_max
:=temp_max;
2度 計 算 す る こ と が 避 け ら れ る.
ま た, for
は,前
i :=1
to
10 do
S[i]
:=Z*exp(-A*i);
に 計 算 し た 値 を 用 い て,
curr_S:=Z; delta:=exp(-A); for
i
:=1
begin
to
curr_S
10 do :=curr_S
S[i]:=curr_S と す れ ば,計
* end;
算 速 度 は 改 善 で き る.し
ロ グ ラ ム の 読 み や す さ は 損 な わ れ,プ も 生 じや す く な る.こ
delta;
か し,こ
の 方 法 を 過 度 に 適 用 す る と,プ
ロ グ ラ ム の 意 味 は 取 り に く くな り,誤
り
の あ た りの 効 果 を十 分 に 考 慮 して適 用 す る よ う に注 意 し
な け れ ば な ら な い. 次 の 例 は,も
う 少 し 高 レ ベ ル の 既 計 算 結 果 の 利 用 法 に つ い て 考 え る.実
プ ロ グ ラ ム や ア ル ゴ リ ズ ム に つ い て は,後
章 に て 具 体 的 に 触 れ る の で,こ
際の こで
は そ の 考 え 方 の 一 例 を 示 す に と ど め る. す べ て 重 さ の こ と な る 8個 の 宝 石 を 重 い 順 に 並 べ た い と考 え て い る.た だ し, 重 さ を 計 る 道 具 は 天 秤 ば か り し か な い も の と し よ う. ま ず も っ と も重 た い もの を 見 つ け る の に,ス メ ン ト法 を 採 用 す る こ と に す る.そ
し て,も
ポ ー ツ な ど で 用 い ら れ る トー ナ っ と も 重 い もの を 取 り 除 い た 後,
残 りの も の に 対 し て 再 び 同 じ方 法 で 第 2番 目 を み つ け る こ と に す る.最 ー ナ メ ン トの 結 果 が す る こ と は,両
,図2・5の
よ う に 得 ら れ た と す る.こ こ でa1とa2と
者 の 重 量 を 天 秤 で 比 較 す る こ と を 意 味 し,こ
う ち か ら再 度 トー ナ メ ン ト を 行 っ て も よ い が,こ
の勝負
の 例 で はa1の
が 重 か っ た こ と を 意 味 す る.2 番 目 に 重 い も の を 求 め る の に,残 a5,a7,a8の
初の ト
ほう
りのa1,a2,…,
の た め に は 6回 の
天 秤 の 操 作 が 必 要 で あ る.
図2・5
しか しな が ら,前 回 の トー ナ メ ン トの 結 果 を利 用 す れ ば,次 の 最 大 重 量 の も の はa6と 比 較 され た もの の 中 に あ る か ら, a4,a7,a5の 中 の どれ か で あ る こ とが わ か る.こ れ らの 中 か ら最 大 重 量 の もの を選 ぶ の に は,2 回 の 天 秤 操 作 で 済 む こ とに な る.こ の 考 え 方 は,後 章 で学 ぶ ヒー プ ソー トの ア ル ゴ リズ ム の 主 要 な 鍵 とな っ て い る.
図2・6
2.3.3分
割 ・処 理 ・統 合 に よ る 計 算 時 間 の 縮 小 化
一 般 的 に,改 善 要 求 の 強 い ア ル ゴ リズ ム は デ ー タ数 nが 大 き くな る と,計 算 時 間 がO(n)に
比 べて 高 い増 加 率 を示 す ものに 多 い.計 算 時 間がO(log
n)に 属
す る よ う な もの は,一 応 は n に対 し,増 加 関 数 で は あ るが 実 用 時 の 実 感 と して は,ほ
とん ど一 定 時 間 で 計 算 で き る とい っ て 過 言 で は な い.
これ に比 べ て,個
々 の デ ー タ に対 して 計 算 す る こ とが 本 質 的 で あ る場 合 は,
ど う して も線 形(つ ま りO(n))以
上 の 増 加 率 とな って しま う こ とは 必然 で あ る.
こ の よ う に,デ ー タ 量 と と もに計 算 量 が増 加 す る よ うな場 合 に は,O(n)の ル ゴ リズ ム は得 られ な いまで もO(n
log log n)やO(n
ア
log n)で あるアル ゴ リ
ズ ム が 得 られ れ ば,ほ ぼ 最 適 と考 え て よ い. 与 え られ た アル ゴ リズム A の デ ー タ 量 nに対 す る計 算 時 間T(n)の O(n)以
増 加 率 が,
上 で あ る もの と仮 定 す る.n 個 の デ ー タ に対 しA を実 行 す るこ と と,
次 の 一連 の 操 作 を加 え た結 果 が 等 しい もの と仮 定 す る. (1)n
個 の デ ー タ に対 して アル ゴ リズ ムAPを
か らな るn/k個
施 してこれ を k個 ず つの デ ー タ
の ブ ロ ック に分 割 す る.た だ し,k は nに無 関 係 な定 数 で
あ る. (2)お
の お の の ブ ロ ック に 対 して ア ル ゴ リズ ム A を施 す.
(3)(2)の
処 理 を受 けたn/k個
のブ ロックにアル ゴリズムAMを 適 用 して n個 の
デ ー タ か らな る一 つ の ブ ロ ッ クへ の統 合 を行 う. APの 計 算 時 間 をTP(n),AMの
と な る.第
計 算 時 間 をTM(n)と
2項 に 注 目す る と,T(k)は
間 は n に比 例 す る時 間 す な わ ちO(n)と き い ほ う がO(T(n))よ
とす る と,A
す れば,全 体 の実 行 時 間 は
n に 無 関 係 で あ る か ら,こ の 項 の 計 算 時 な る.も
り も小 さ い,す
し,O(TP(n))とO(TM(n))の
なわち
で 計 算 す る の と同 じ結 果 を 得 る の に,(1),(2),(3)と
・統 合 に 分 け て 計 算 し た ほ う が ,計
大
算 時 間 の 増 加 率 を小 さ くで き る.
分割 ・ 処 理
この よ うな 分 割 ・統 合 の ア ル ゴ リズ ム を う ま く見 つ け る た め の 組織 的 な手 法 は な く,APやAMは
Aの 計 算 シ ス テ ム 依 存 して 設 計 され な け れ ば な らな いが,よ
り効 率 の よい アル ゴ リズ ム を求 め る と きの 一 つ の 常 套 手 段 とな って い る. 並 び 換 え(sorting)ア
ル ゴ リズ ム につ い て は,後 章 で 詳 し く触 れ る が,分 割
・処 理 ・統 合 の 具 体 的 な例 と して ク イ ッ ク ソー ト(quick
sort)の アル ゴ リズ ム
が あ げ られ る.整 列 の プ ロ グ ラ ム は,普 通 に な ん の 細 工 も しな いア ル ゴ リズ ム で は,デ ー タ の 数 nに 対 して 実 行 時 間 はO(n2)と
な っ て し ま う.
問題 を簡 単 に す る た め に,n 個 の 整 数 が 配列 に格 納 され て い て,こ れ を小 さ い順 に 整 列 させ る 問題 を想 定 す る. ク ィ ッ ク ソ ー トの アル ゴ リズ ム の 要 点 は,整 列 させ るデ ー タ の 中か ら任 意 の 数 を選 び,そ
の 数 よ り も大 きい数 か らな るブ ロ ッ ク と小 さ な 数 か ら な る ブ ロ ッ
ク とに分 割 す る.こ の分 割 の ため の計 算 時 間 はO(n)で
可 能 で あ る こ とは 容 易 に
わ か る で あ ろ う.こ の 二 つ の ブ ロ ッ ク を別 々 に整 列 させ,そ
の 結 果 の ブ ロ ック
が 前 半 と後 半 と な る よ う に一 つ の ブ ロ ッ ク に統 合 す れ ば,目 的 の 整 列 した 数 の ブ ロ ッ クが 得 られ る. 連 続 した 領 域 に細 分 割 され た ブ ロ ック を統 合 す る に は,ブ
ロ ッ クの 数,ブ
ッ クの配 列 内で の 境 界 を変 更 す るだ けで あ るか ら,こ れ もO(n)以 で 可 能 で あ る.よ
と で き る.た
ロ
下 の計 算 時 間
っ て,n が あ る定 数 k よ り も大 きけ れ ば,
だ し,最
初 に 選 ん だ 数 の 期 待 値 は,全
数 の 平 均 値 と な る か ら,ブ
ロ ッ ク は ち ょ う ど 2分 さ れ る もの と仮 定 して い る. 実 際 の ク ィ ッ ク ソ ー トの ア ル ゴ リ ズ ム で は,n は な く,分
割 さ れ た ブ ロ ッ ク を さ らに分 割 す る とい う過程 を ブ ロ ッ クの 大 きさ
が k に な る ま で 繰 り返 す.個 照).そ
個 の デ ー タ を 2分 す る だ け で
の 結 果,平
均O(n
の 繰 り返 しの 回 数 は,O(log log
n)の
n)と
な る(第 6章 参
計 算 時 間 の 高 速 ア ル ゴ リズ ム が 得 ら れ る.
第 2章
1.Pascalの
配 列 型 宣 言 文 に,必
練習問題
ず 出 現 す る 予 約 語 を 終 端 記 号 と し,そ の 他 の
構 成 要 素 を 適 当 な メ タ 記 号 と し て 用 い,配
2.与
え ら れ た 数 値 x に 対 し,x50を
よ.た
だ し,乗
3.フ
ィ ボ ナ ッ チ 数 列F1,F2,…,Fn,…
列 型 宣 言 文 の 文 法 を 記 述 せ よ.
計 算 す る の に 必 要 な最 小 乗 算 回 数 を求 め
算 の 代 わ り に 加 算 を 用 い て は い け な い もの とす る.
は,
で 定 義 さ れ る 整 数 列 で あ る.i が 与 え ら れ た と き にF1を を,自
然 言 語,流
4.正
則 な n行 n列 の 行 列 の 行 列 式 を 求 め る ア ル ゴ リ ズ ム(た
し法)を 擬Pascalの
5.n×nの (1)行
れ 図,擬Pascalの
出 力 す る ア ル ゴ リズ ム
そ れ ぞ れ の 記 述 法 で 示 せ.
と え ば,掃
き出
記 述 法 で 示 せ.
行 列 間 演 算 に つ い て 以 下 の 問 い に 答 え よ. 列 の 積 演 算 は 要 素 間 の 和 演 算 と積 演 算 に よ り,次
の ように定義 され
て い る.
た だ し行 列A,B,C,はC=ABの 行 j列 要 素 を 表 す も の と す る.
関 係 に あ り,cij,aij,bijは そ れ ぞ れ の 行 列 の i
行 列 の 積 の 計 算 に お け る要 素 間 の 和 演 算,積
演 算,行
列 式 の 回 数 を nの関 数
で 表 現 せ よ. ま た,そ れ ぞ れ の 計 算 回 数 をで きる だ け簡 単 な O-記 法 を求 め よ. (2)問
題 4の 行 列 式 を求 め る一 方 法 に 注 目 し,そ の ア ル ゴ リズ ム の 中 で行
わ れ る四 則 演 算 そ れ ぞ れ の 回 数 を nの 関 数 で表 現 せ よ.
6.ア ル ゴ リズ ム の 計 算 速 度 の 改 善 の 方 法 と して, (1) 前 の 計 算 結 果 を利 用 す る方 法 (2) 分 割 ・統 合 に よ る方法 の お の お の に つ い て 本 文 に な い例 を一 つ ず つ あ げ よ.
[3] Pascalに
3.1デ
お ける 構 造 型 の デー タ
ー タ の 型
計 算 機 の 機 構 に つ い て 学 ん だ 方 は,既
に よ く知 っ て い る こ と で あ る が,計
機 内 部 の デ ー タ は す べ て 2進 数 で 表 現 さ れ て い る.た 'A'と い う 文 字 は 8桁 の 数01000001で 場
合0000010011010010と
しか し な が ら,逆
,ま た1234と
と え ば,ASCII符
号での
い う 数 は 2バ イ ト 1語 の
表 現 さ れ て い る. に 計 算 機 の 内 部 に 記 憶 さ れ て い る 数 を 見 た だ け で は,そ
が ど の よ う な デ ー タ を 表 現 して い る の か は わ か ら な い.0100000101OllO10と う 数 は,文
字 の デ ー タ と み れ ば'AZ'と
い う こ と に な る.そ グ で は,計
算
の た め に,ア
れ い
い う 2 文 字 を,整 数 と み れ ば16730と
セ ンブ リ語 な ど の 低 級 言 語 で の プ ロ グ ラ ミ ン
算 機 内 部 の お の お の の デ ー タ の 持 っ て い る 意 味 に 対 し て,プ
ログ ラ
マ が 責 任 を 持 た な け れ ば な ら な い. た と え ば,'A'が01000001で,'B'が01000010で っ て い る プ ロ グ ラ マ は,'A'と
い う 文 字 デ ー タ を 整 数 の デ ー タ と み な し て,
整 数 1 を 加 え る こ と に よ っ て01000010を 'B'にあ た る 符 号 が 得 ら れ た こ と に な る こ の よ う に,整
表 現 され て い る こ と を知
得 る こ と が で き る.こ
の 結 果,文
字
.
数 の 演 算 を 利 用 し て 文 字'A'を 文 字'B'に 変 換 す る と い う
よ う な 芸 当 が で き る 代 わ り に,取
り扱 って い る デ ー タの 属 性 をプ ロ グ ラ ミン グ
を し て い る あ い だ 中,常 こ れ に 対 し て,ほ て い る.Pascalで
と ん ど の 高 級 言 語 で は,取 は,整
デ ー タ 型 の ほ か に,さ は,Pascalの
に 意 識 し て い な け れ ば な ら な い.
数 型,実
数 型,文
り扱 う デ ー タ が 型(type)を
字 型,論
理 型,数
持 っ
え上 げ型 の 単 純 な
ら に い くつ か の 構 造 型 の デ ー タ を 持 っ て い る.こ
の章で
構 造 型 と 呼 ば れ る 複 合 デ ー タ の 構 成 法 に つ い て の 復 習 と,計
算 シ
ス テ ム と して の デ ー タ 型 と の 関 連 に つ い て 学 ぶ こ と に す る.
第 1章 で デ ー タ 型 とは,あ
る構造 を持 っ た デ ー タ の 集 合 と,そ の う え に定 義
され て い る操 作 や 演 算 とで構 成 され る「計 算 シ ステ ム」で あ る と して い る. Pascalに
お け る こ の よ う な デ ー タ 型 の 中 で 典 型 的 な もの は 整 数 型 の デ ー タ で
あ る. こ の 型 の 計 算 の 例 と し て,正 の 整 数m,nの 法 で 求 め る 関 数 プ ロ グ ラ ム を 図3・1に
図3・1ユ
最 大 公 約 数 を ユ ー ク リ ッ ドの 互 除
示 し た.
ー ク リ ッ ドの 互 除 法
こ の プ ロ グ ラ ム 中 の 整 数 演 算div,*,一
や 述 語 く,=の
意 味 に つ い て は,多
くの 人 々 がPascalを
学 ぶ 以 前 か ら慣 れ 親 し ん で い た もの ば か り で あ る.こ の プ
ロ グ ラ ム で 変 数gcd,
n, m,
rが 整 数 型 と し て 宣 言 さ れ て い る こ と は,こ
変 数 が 整 数 を 表 現 し て い る こ と だ け で は な く,演 =な
算 記 号+,-,*ま
れ らの
た 述 語 く,
どが どの よ うに 計 算 され る か を も定 め て い る.
同 じ記 号 で も実 数 型 の 場 合 は 計 算 の 仕 方 は 違 っ て い る.つ は,単
ま り,デ ー タ の 型
に デ ー タの 集 合を指 示 す るだ け で な く,同 時 に そ の 集 合 の 要 素 また は他
の デ ー タ型 との 関連 を定 め た 演 算*で 構 成 さ れ る計 算 シス テ ム で あ る.
一 言 で い えば
,こ
の 場 合 の デ ー タの 型 とは
構 成要 素の集合
そ の 集 合 上 や 他 の 型 との 関 連
+
(デ ー タ)
した機 能(計 算 の 方法)
の 双 方 か らな る計 算 シ ス テ ム を代 表 す る言 葉 とい え る. Pascalで 用 者 が,基
は,こ
の よ う な 「計 算 シ ス テ ム 」と 考 え ち れ る デ ー タ 型 の ほ か に,利
本 的 な デ ー タ を 複 合 さ せ て,さ
る よ う な 機 能 が 備 わ っ て い る.ま functionも
た,演
自 由 に 定 義 で き る が,こ
チ ッ ク に 関 連 づ け て,Pascalの
ら に 複 雑 な 構 造 の デ ー タ を構 成 で き
算 や 操 作 を 定 義 す るprocedureま
たは
れ ら の デ ー タ 型 と 演 算 ・操 作 と を シ ス テ マ
処 理 シ ス テ ム の 中 に新 しい 計 算 シ ス テ ム を意 識
さ せ る よ う な 機 能 は 備 わ っ て い な い.
Pascalで 構 成 さ れ る構 造 型 は,計 算 シ ス テ ム とい う よ りは,よ
り複 雑 な構 造
の デ ー タ 単位 を作 る ため の機 能 と しての 働 きに と ど ま っ て い る.こ の よ うな デ ー タ を複 合 化 す る機 能 に と ど ま るデ ー タ型 に対 して,計 算 シ ス テ ム と して の デ ー タ型 は 「抽 象 デ ー タ型 」と呼 ば れ る こ と もあ る. プ ロ グ ラ ム の 中 で は,ど の デ ー タ もそ の 意 味 を持 ち,そ
れ らの うえ に 施 され
る演 算 ・操 作 とで 計 算 シス テ ム を形 成 して い る.Pascalの
構 造 型 デ ー タ もそ の
例 外 で は な いが,ア
セ ンブ リ語 プ ロ グ ラ ム 中 の す べ て の デ ー タの 型 に対 す る責
任 が プ ロ グ ラマ また は利 用 者 に あ る よ うに,そ れ らの 計 算 シ ス テ ム と して の 面 で の 責 任 は,プ
ロ グ ラマ また は 利 用 者 が 負 わ な け れ ば な ら な い.簡 単 な例 を示
そ う.
type
matrix=array[1..10,1..10]of
で 定 義 さ れ た 配 列 は,100個 て い る が,100個
の 実 数 の 集 合 を 一 つ の デ ー タ と考 え る こ と を示 し
の 実 数 の 集 合 に ど の よ う な 意 味 が あ る か に つ い て は,言
て い な い.し か し な が ら,プ ロ グ ラ ム を し た 人 が,こ * 数 学 的 に,演
real;
算 と は'+'が
二 つ の整 数 に 対 し,一 つ の 整 数 を与 え る よ うに,同
中 で の 幾 つ か の 要 素 に対 し,同 シス テ ム の構 成法 は,述
れ を10×10の
及 し
実数の正 方 一 の 集 合(型)の
じ集 合(型)の 中 の 1要 素 を対 応 づ け る もの と され る.し か し計 算
語 く が 二 つの 整 数 型 要 素 に 対 し一 つ の 論 理 型 要 素 を 与 え る よ う に,厳 密
に は 相 異 な る集 合 間 の 関 係 で あ り,演 算 とは い え な い機 能 も必 要 で あ る.こ の よ う な相 こ とな るデ ー タ集 合 間 の関 係 を も含 め て 考 え る こ と にす る.
こ で の 演 算 と は,こ
行 列 と み な し,行
列 の 間 の 和,差,積,ス
カ ラ 積,逆
行 列 な どの 演 算 をプ ロ グ
ラ ム し て 行 列 と して の 計 算 シ ス テ ム を 作 り上 げ れ ば,こ のmatrix型
は立 派 な計
算 シ ス テ ム と な る. も うす こ し具 体 的 な 例 を 考 え て み よ う.Pascalに 要 素 の 順 序 数 に 関 す る 関 数(ord,succ,pred)と 〈=,〉=,〈,〉)だ
お け る 数 え 上 げ 型 で も,各
そ れ に よ る 順 序 関 係(=,〈
け し か 用 意 さ れ て い な い の で,こ
テ ム を構 成 で き な い.こ
〉,
れ だ け で は計 算 シ ス
の 列 挙 型 を 用 いて 勝 負 の 手 段 と して の ジ ャ ン ケ ン を模
式 化 して み よ う. ジ ャ ン ケ ン を構 成 す る 二 つ の デ ー タ 型 は, type
te kekka で あ る.こ
= (ishi, = (kachi,
kami, make,
hasami); aiko);
の 二 つ の デ ー タ 型 の 間 を 関 係 づ け る 機 能 は,
function janken(watashi, kimi : te) : kekka; begin
if watashi else
case ishi
= kimi : if
kami
hasami
end
end;
then
watashi
:if
:
if
janken
:=
aiko
of kimi
kimi
kimi
=kami
=
=
ishi
ishi
then
janken
else
janken:=kachi;
:=make
then
janken
:=
kachi
else
janken
:=
make;
then
janken
:=make
else
janken
:=
kachi
{case)
{janken}
と な り,teとkekkaと
の 関 係 は 関 数jankenに
の あ る こ と に な る で あ ろ う.ま た 関 数jankenも
よ っ て 組 織 化 され,は じ め て 意 味 デ ー タ の 表 現 の 方 法 に 大 き く依
存 して く る.
以上 の 型 の議 論 か ら,プ ロ グ ラ ミン グ とは,計 算 シ ス テ ム,つ 織 化 が 大 変 重 要 で あ る こ とが わ か る.Pascalの
ま り,型 の 組
よ うに,プ ログ ラマ が デ ー タの
型 を 必 要 に応 じて 定 義 で き る言 語 の 場 合 は,デ ー タの 構 造 を定 め る と き は計 算 シ ス テ ム の こ と を十 分 に考 慮 してプ ロ グ ラ ミ ング しな けれ ば な ら な い,デ ー タ の構 造 を う ま く設 定 で き るか 否 か は シ ス テ ム 全体 の 善 しあ しに 影 響 す る .
ま た,こ の よ う な機 能 は,第
1章 で学 ん だ よ う なプ ロ グ ラム の 階 層 化 だ け で
な く,デ ー タの 構 造 に 対 して も階 層 的 考 え 方 を導 入 し,末 端 の デ ー タ要 素 まで は意 識 せ ず に,高 い レベ ル の 階 層 で は,よ
り抽 象 的 な デ ー タ構 造 を扱 うプ ロ グ
ラ ミ ング が 可 能 で あ る.こ の よ うに,下 降 型 プ ロ グ ラ ミン グ は,単
にプ ログ ラ
ム の 階 層 化 だ け で は な く,そ こ で 扱 わ れ るデ ー タ に 関 して も階 層 を導 入 す る こ とが 必 要 で あ る.
3.2
Pascalの
構 造型 デー タ
前 節 で 述 べ た よ う に,構 造 型 の デ ー タ は 単純 型 ま た は構 造 型 の デ ー タ を複 数 個 ひ とま とめ に組 織 化 して,あ
た か も一 つ の デ ー タの よ うに 扱 っ た り考 え た り
で き る よ うに す る手 法 を提 供 して い る.組 織 す るデ ー タ の性 質 や そ の 数 に対 す る制 限 か ら,配 列 型,レ
コー ド型,集
合 型,フ
ァイ ル 型 が あ る.集 合 型 以 外 の
構 造 型 が 主 と して 複 数 の デ ー タ の 複 合 化 の 手法 と して あ り,で
き上 が っ た新 し
い デ ー タ は計 算 シス テ ム と して与 え られ な い の に対 し,集 合 型 の デ ー タ は要 素 に特 別 な制 限 は な い もの の 各 種 集 合 演 算 を持 ち,前 節 で 述 べ た 抽 象 型 デ ー タ で あ る こ とに注 意 しよ う.
3.2.1
配 列型デー タ
配 列 型 の デ ー タ は,同 一 種 類 の デ ー タ を有 限 個 一 次 元 的 に順 序づ け した デ ー タ の 集 合 を ひ と ま とめ に した構 造 型 デ ー タで あ る.Pascalに
お け る配 列 型 の 定
義 は; 配 列 型 名
”=”
”array”
”[” 添 字 型 名 ”]” ”of” 要 素 の 型 名
で あ り,配 列 型 デ ー タ の 要 素 とな るデ ー タの 型 名(フ ァ イル 型 以 外 の 任 意 の 型) と要 素 の個 数 と その 順 序 を規 定 す る添 字 型 名(有 限 な 要 素 を持 つ 単 純 型)に よ り 構 成 さ れ て い る. い ま,X1,X2,…,Xnの
同 じ型 の 変 数(た
と え ば,文
型 の デ ー タ X と し て 表 現 す る こ と を 考 え よ う.X
字 型 と す る)を 一 つ の 配 列
の お の お の の 要 素 は,単
純 型
図3・2
配列型の デー タ
の 添 字 の 値 に よ り区 別 され る.便 宜 上 こ こで は添 字がindex=0..n-1な あ る もの と して お く.ま た,配 列構 造 の 図 的 表 現 方法 と して,図3・2の 配 列 名,そ の 配 列 の 持 つ要 素 の 集 合 を矩 形,さ 添 え字 と要 素 の 記 憶 領 域 を表 す 矩 形,そ
る型で よ うに
らに それ ぞ れ の 要 素 に付 随 した
して,各 要 素 の 記 憶 領 域 を示 す 矩 形 の
中 に そ の 値 を記 入 す る.
X:array[index]of
char
で 定 義 さ れ る 配 列 型 の デ ー タ X は,n 個 の 文 字 変 数 を ひ と ま と め に し た もの で, 各 要 素 は 普 通 の 変 数 と 同 じ よ う に ラ ン ダ ム ・ア ク セ ス*が 可 能 で,X (0≦i≦n-1)と
でX[i]と
と添 え 字i
表 現 さ れ る.
配 列 型 の デ ー タの 要 素の 間 に は,添 字 型 デ ー タ に よ っ て定 義 され た 順 序 以 外 に は な ん の 関 係 もな い.も ち ろ ん,プ
ログ ラマ が適 当 に意 味 づ け を し,構 造 化
して利 用 す る こ と は 自 由 で あ る.配 列 型 デ ー タ の も っ と も重 要 な特 徴 は,同
じ
型 の デ ー タの 集 合 を ひ と ま とめ に し,一 つ の デ ー タ と して扱 え る こ と と,個 々 の 要 素 の 識 別 に 配 列 型 デ ー タ 名 と添 字 型 デ ー タ を指 定 す る こ とに よ っ て可 能 な こ と で,個
々 の要 素 の 名前 を使 わ な い で よ い こ とに あ る.
簡 単 な 例 で 配 列 型 の デ ー タ を 用 い る こ と の 効 果 を 示 し て み よ う.太 郎,次 花 子 の 3人 の ジ ャ ン ケ ン で 出 す 手 の 統 計 を 取 る と き に,そ 手 の 回 数 を 数 え る 手 順(procedure)を と 用 い た 場 合(図3・3(b))を
郎,
れ ぞ れ の 人 の 出 した
配 列 型 デ ー タ を 用 い な い 場 合(図3・3(a))
比 べ て み る.
* 主 記憶 装 置 ま た は補 助 記 憶 装 置 内 の デ ー タ を読 ん だ り,デ ー タを 記憶 装 置 に書 き込 む こ との 両 方 の操 作 を ま とめ て ア ク セ ス と呼 ぶ.書 ラ ム や 装 置 の 状 態 に依 存せ ず に,常 と よば れ る.
き込 み,読
み 出 しに 際 して,デ
ー タの 格 納 位 置,プ
に 一 定 時 間 で ア クセ ス 可 能 で あ る と き,ラ
ログ
ン ダム ・ア ク セ ス
(a)
(b) 図3・3
(b)の ほ うが,そ れ ぞ れ の 人 の 出 した 手 の 回 数 を ま とめ て 一 つ の デ ー タ と し て 扱 う こ とに よ り,自 由 変 数 を使 用 せ ず に 必 要 な デ ー タ を す べ て 手 順 へ 渡 す こ とが で き る.さ ら に,配 列 型 の添 字 に数 え上 げ型teを
用 い た こ とに よ り,配 列
型 デ ー タ の 要 素 の 選 択 が 非 常 に う ま くい っ て い る. 配 列 型 の デ ー タ は,構 造 型 の デ ー タ の 内 で もっ と も基 本 的 な もの で あ る.計 算 機 の 主 記 憶 装 置 もバ イ ト単 位 の 要 素,絶 対 番 地 を添 字 集 合 とす る配 列 型 デ ー タ構 造 を持 っ て い る と考 え る こ と もで き,利 用 用 途 が広 く,万 能 か つ もっ と も 基 本 的 な デ ー タ構 造 と い う こ とが で き る. 配 列 の 定義 と して 配 列 名:”array”
”[” 添 字 型
1 ”,” 添 字 型
添 字 型 n ”]” ”of”
型
2
”[” 添 字 型 ”]”
”of”
…
”'”
要素の 型名
の よ う に,高 次 元 の 配 列 も定義 で き るが,こ 配 列 名:”array”
2 ”,” …
れ は実 質 的 に は
1 ”]” ”array”
”of” ”[”
”array” 添 字
型
n
”[” 添 字 ”]”
”of”
要素の型 名 の よ うに,一 次 元 の 配 列 の 複 合 形 の 定 義 と同 じこ と に な る.各 次 元 の配 列 要 素 の 型 とか,そ
れ らの 領 域 の 配 置 の 状 況 を考 え る と き に は,後 者 の 一 次 元 配列 の
複 合 形 と考 え るほ う が わ か りや す い で あ ろ う.
3.2.2
レ コー ド型 デ ー タ
レ コ ー ド型 の デ ー タ も配 列 型 の もの と同 様 に い くつ か の デ ー タ を ひ と ま とめ に して扱 え る よ う な構 造 型 の デ ー タ で あ るが,配
列 型 が 同 一 型 の要 素 で な け れ
ば な らな いの に対 し,レ コー ド型 は 各 要 素 の 型 を そ れ ぞ れ 自 由 に 変 えて 取 れ る よ うに した こ と,ま た さ らに 同 じ レ コー ド型 の デ ー タ(以 後,単 呼 ぶ)の
に レ コ ー ドと
間 で も,構 成 要 素 の 型や そ れ らの 数 が 異 な っ て い て も よい よ う に した
の が 最 大 の 相 違 点 で あ る. レ コー ド型 で は,各 構 成 要 素 の格 納 され て い る記 憶 領 域 を フ ィー ル ドと呼 ん で い る.Pascalで
は,す べ て の記 憶 領 域 に 型 が 定 義 され て い な けれ ば な らな い
の で フ ィ ー ル ドに も 型 が あ る こ と に な る.フ 可 変 形 式 の もの と が あ る.固
ィー ル ドに は,固
定 形 式 の もの と
定 形 式 の フ ィ ー ル ド(固 定 フ ィ ー ル ド)は,こ
の レ
コ ー ド型 の デ ー タ の す べ て が 共 通 に 持 っ て い る フ ィ ー ル ドで あ る . こ れ に 対 して,可
変 形 式 の フ ィ ー ル ド(可 変 フ ィ ー ル ド)は,各
デ ー タ が 場 合 場 合 に よ っ て 異 な っ た 型 の デ ー タ の 集 合,す ー ル ドを持 て る よ うに 設 定 され て い る Pascalに
レ コ ー ド型 の
な わ ち異 な っ た フ ィ
.
お け る レ コ ー ド型 の 定 義 は レ コー
で あ る.フ
ド型 名
”=”
”record”
フ ィール
ド 定 義 ”end”
ィ ー ル ド定 義 は 固 定 フ ィ ー ル ド部 だ け の もの,可
変 フ ィ ー ル ド部 だ
方 の 形 式 の フ ィ ー ル ド部 を 持 つ もの が あ る.両
方 の 形 式 の フ ィー
け の も の,両
ル ド部 を 持 つ と き は,両
者 の 間 を ”;” で 区 切 り,固
ィ ー ル ド部 よ り前 に 書 か な け れ ば な ら な い.固
定 フ ィ ー ル ド部 を 可 変 フ
定 フ ィ ー ル ド部 は,固
フ ィ ー ル ドの 定 義 を ”;” で 区 切 っ た リ ス トで あ る.固
定形式の
定 形 式 の フ ィ ー ル ドは
フ ィ ー ル ド名 の リ ス ト ”:” 型 名 ま た は 型 の 指 定 で あ り(後 述 の 例 1参 照),可 ”case”
変 フ ィー ル ド部 は
フ ィ ー ル ド選 別 子 定 義 部 ”of” 可 変 フ ィ ー ル ド リ ス ト
可 変 フ ィ ー ル ド リ ス ト は,可 を 意 味 し て い る.可 選 別 定 数
で あ り,選
変 フ ィ ー ル ド を 一 つ 以 上 ”;” で 区 切 っ た リ ス ト
変 フ ィー ル ドは リス ト
”:”
別 定 数 リ ス トは,フ
”(” フ ィ ー ル
ド定 義
”)”
ィ ー ル ド選 別 子 定 義 部 で 指 定 さ れ た 型 の 定 数 を
” ,” で 区 切 っ た もの で あ る.
フ ィー ル ド選 別 子 定 義 部 は,二 つ の 場 合 が あ りそれ ぞ れ (1)タ
グ フ ィー ル
(2)型
名
ド名
”:”
型 名
と な っ て い る. (1)の
場 合 は,選 別 子 定 義 部 は 一 つ の 固 定 フ ィ ー ル ド を 定 義 し て い る の と 同
じで あ る.た
だ,普
通 の 固 定 フ ィ ー ル ド と異 な る 点 は,こ
さ れ て い る 値 に よ っ て,そ
の フ ィー ル ドに格 納
の フ ィ ー ル ド に 続 く可 変 フ ィ ー ル ドが ど の よ う に 構
成 さ れ て い る か が 変 わ って くる(後 述 の例 2参 照) こ れ に 対 し,(2)の
場 合 は,レ
コ ー ドの 中 に は 可 変 フ ィ ー ル ドが ど の よ う に
構 成 さ れ て い る か の 情 報 は な い.た の 方 法 に よ っ て,可
だ,プ
ロ グ ラ ム の 中 で の フ ィ ー ル ドの 指 定
変 フ ィ ー ル ドの 構 成 を 指 定 で き る だ け で あ る(後 述 の 例 3
参 照). 【例 1】
図3・4
図3・4に タ は20文 号,国
固 定 フ ィー ル ド定 義 例
示 さ れ た レ コ ー ド型 の 定 義 例 で は,bookcardと 字 の 代 表 著 者 名,そ
際 図 書 番 号(15文
っ て い る(図3・5参
の 他 の 著 者 の 有 無,50文
字),発
い る.レ
字 の 書 名,出
版社の 符
行 年 を 記 録 す る た め の 六 つ の フ ィ ー ル ドか ら な
照).
図3・5
こ の 場 合,bookcard型
い う型 名 を持 つ デ ー
固 定 フ ィー ル ド例
の レ コ ー ドは す べ て こ の 六 つ の 型 フ ィ ー ル ド を持 っ て
コ ー ド型 の デ ー タ の 各 要 素 を ア ク セ ス す る と き は,レ
コ ー ド型 の 変 数
と そ の フ ィ ー ル ド と の 間 に"."を
挿 入 し て 表 現 す る.上
レ コ ー ド変 数 X の 書 名 の 部 分 を 表 す に はX.titleと codeと
の 例 で は,あ
な り,図
書 番 号 はX
る本 の .ISBN
な る.
【 例 2】 図3・6に
示 さ れ た 例 は,各
既 婚 者 で あ れ ば,配
人 の 氏 名,生
偶 者 の 氏 名,生
年 月 日,性
年 月 日 を,ま
別,既
婚 者 か 否 か,も
し
た 独 身 者 で あれ ば配 偶 者 に 関
す る フ ィ ー ル ドは あ っ て は な ら な い と し た と き の レ コ ー ド を 設 計 し た もの で あ る.重
要 な こ と は,す
て お い て,不 あ る.独
べ て の 人 の レ コ ー ドに 配 偶 者 に 関 す る フ ィ ー ル ドを 設 け
要 な と こ ろ は,空
欄 に して お くと い うの と は異 な っ て い る こ とで
身 者 の レ コ ー ド に 配 偶 者 の 名 前 を 記 録 す る と,計
に エ ラ ー を 指 摘 し て く れ る よ う で あ れ ば,デ
算 シ ス テ ム が 自動 的
ー タ の 誤 り が 生 じ に く く,信
頼 性
が 増 す こ と に な る.
図3・6
可 変 フ ィ ール ド定 義例
この レ コー
ド は,四
つ の 固 定 フ ィ ー ル ド,可
変 フ ィー ル
可 変 フ ィー ル
ド を 持 た な い か の い ず れ か で あ る.
ドは 二 つ か あ る い は
こ の 型 の ど の デ ー タ に も,full_name,birth_date,sex,marriedの ル
ド が あ り,marriedの
7(a)に
示 さ れ る よ う に,name_of
の 四 つ の フ ィー ル が"false"な
フ ィール
ドの 中 に"true"が
ら ば,図3・7(b)に
記 録 さ れ て い る 場 合 は,図3・
spouse,sp_barth_dateの
ド に 続 い て 配 置 さ れ て い る.も
フ ィー
し,marriedの
示 さ れ た よ う に,そ
フ ィ ー ル ドが 前 フ ィール
ドの 値
の レ コ ー ドは 可 変 フ ィ ー ル
(a)
(b)
図3・7
可 変 フ ィ ー ル ド例(そ
の 1)
ドを 持 た な い こ と に な る. 【例 3】 あ る商 店 に は,商
品 に貼 るた め の 価 格 票 の 内 容 が 次 の よ う に
A ラ ベ ル:商
品 名,価
格,製
造年 月 日
B ラ ベ ル:商
品 名,単
価(円/㎏),重
C ラ ベ ル:商
品 名,容
量,価
格,産
の 3種 類 に 分 類 さ れ て い る.図3・8(a)は り,図3・8(b)は
さ,価
格
地 名 価 格 票 を レ コ ー ド型 と して の 定 義 で あ
価 格 票 を 印 字 す る 手 順 の プ ロ グ ラ ム 例 で あ る.
こ の 例 の 場 合 は,お
の お の の 価 格 票 の レ コ ー ドデ ー タ が ど の よ う な 可 変 フ ィ
ー ル ド部 を持 つ か の 情 報 が そ の レ コ ー ドの 中 に な い .そ ル ド部 を ア ク セ ス す る と き に,ど ム の 中 で,そ
れ ゆ え に,可
変 フ ィー
の 型 の フ ィ ー ル ドが 選 ば れ る か は ,プ
ログラ
の フ ィ ー ル ドが どの よ う に 表 現 さ れ て い る か だ け で 決 ま る .
(a)
(b) 図3・8
こ の 例 で い う と,あ る レ コ ー ドデ ー タ に 対 して,フ ィ ー ル ド名 がTANKAで る フ ィ ー ル ドデ ー タ を ア ク セ ス した と き は,こ 表 現 し て い る も の と解 釈 さ れ る.ア
あ
の レ コ ー ドデ ー タ は B ラ ベ ル を
ク セ ス が 読 み 取 りの 場 合,実
際 にこの レコ
ー ドが B ラ ベ ル で あ る か 否 か と に か か わ ら ず B ラ ベ ル と解 釈 さ れ る の で
,プ
ロ
グ ラ マ の 責 任 に お い て 正 しい ア ク セ ス が さ れ る よ う にプ ロ グ ラ ム され て い な け れ ば な ら な い.
3.2.3
集 合型データ
集 合 型 の デ ー タ は,数 の 計 算 の 世 界,す 演 算,述
な わ ち,集
合 と は と か,集
合
合 の う え に定 義 され て い る種 々の
語(+,-,*,in,=,<,>,<=,>=,<
つ い て は,こ た だ,一
学 で 学 ん だ よ う な 集 合 を 表 現 す る デ ー タ で あ る.集
>)な
ど の 意 味 に
こ で 説 明 す る ま で も な い で あ ろ う. 般 の 数 学 の 概 念 と異 な る こ と は,一
す べ て の 集 合 元,つ
つ の 集 合 型 に は そ の 型 に属 す る
ま り 金 集 合 が 有 限 の 範 囲 に(実 際 の 場 合 は,各
処 理系 に よ
っ て 最 大 要 素 数 が 制 限 さ れ て い る)定 ま っ て い な け れ ば な ら な い こ と で あ る. よ っ て,そ
の 型 の 集 合 デ ー タ は,空
か を 表 現 す る こ と に な る.全
集 合 を含 め て 全 集 合 の 部 分 集 合 の 中 の どれ
集 合 の 要 素 が n個 で あ れ ば,こ
集 合 型 の デ ー タ の 取 り得 る 集 合 の 種 類 は2nと
の 全 集 合 の う えの
な る.
集合型 の定義 は 集 合 型 名="set""of"基 で あ り,基 図3・9の
底 型 は 列 挙 型,論
理 型,ま
底型の指 定 た は 部 分 型 の ど れ か で あ る.
例 は,引 数 と して 与 え られ た 非 負 の 整 数 を10進
字 の 種 類 を 求 め る 手 順 を プ ロ グ ラ ム し た も の で あ る.集 全 集 合 は 集 合[0,1,…,9]で
あ り,変 数shuruiは10種
数 表 現 した と きの 数
合 型suu_no_shuruiの
の 数 の 部 分 集 合(1024種)の
う え の 変 数 で あ る. 集 合 型 の デ ー タ は 他 の 言 語 で は あ ま り見 ら れ な い デ ー タ の 型 で あ る が,集 の 概 念 は 広 い 分 野 で の 計 算 の モ デ ル に 登 場 す る の で,便 ま た,集
合 型 の デ ー タ や 計 算 機 能 の 実 装 に お い て も,ビ
合
利 な デ ー タ 型 で あ る. ッ トマ ト リ ク ス(第 8
図3・9
章8.3節
参 照)や 計 算 機 の 論 理 計 算 機 能 を 用 い て 効 率 の よ い シ ス テ ム と な っ て い
る の で,プ
3.2.4
ロ グ ラ ミ ン グ 時 に は 積 極 的 に 利 用 し た い デ ー タ の 型 で あ る.
フ ァイル型デー タ
フ ァ イ ル 型 の 計 算 シ ス テ ム は,一
般 的 に 二 次 記 憶 装 置 に あ る デ ー タ(フ ァ イ
ル)と 主 記 憶 装 置 に あ る デ ー タ(バ ッ フ ァ デ ー タ)お よ び そ の 両 者 の 間 の 情 報 の 転 送 の 機 能 か ら成 り立 っ て い る. フ ァ イ ル は,フ い る 構 造,い 対 し て,主
ァ イル 型 以 外 の 同 一 型 の デ ー タ が順 次 列 を成 して格 納 され て
わ ゆ る 順 編 成 フ ァ イ ル(sequential
記 憶 装 置 側 の デ ー タ は,フ
ら成 っ て い る(図3・10参 フ ァ イ ル の 特 徴 は,そ あ る が,要
file)を 表 し て い る .こ
れ に
ァ イ ル の 1要 素 だ け を 格 納 で き る 領 域 か
照). の 構 成 要 素 が 同 一 の 型 を 持 つ こ と で は,配
素 の 数 を 指 定 せ ず に 幾 つ で も 格 納 で き る こ と と,配
ク セ ス で あ る の に 対 し フ ァ イ ル は 順 次 ア ク セ ス,つ
列 と同 様 で
列 が ランダムア
ま り 先 頭 の デ ー タ か ら順 に
読 み 出 す か ま た は 先 頭 か ら順 に 書 き 出 す か の ど ち ら か し か で き な い.
図3・10
フ ァ イ ル 型 の デ ー タ を 扱 う 機 能 と し て は,get,put,reset,rewriteの の ほ か に,述
語eofが
手 順
あ る.
(a)get(f)実
行 前
(b)get(f)実
行 後
図3・11
resetは
フ ァ イ ル 名 を 引 数 に 持 ち,引
出 す こ と を 示 す.ま
た,rewriteは
フ ァ イ ル を 消 去 して,フ
数 で 示 され た フ ァ イ ル を以 後 順 次 読 み
同 様 に フ ァ イ ル 名 を 引 数 に 持 ち,今
ァ イ ル を 空 に す る と と も に,以
書 き 込 む こ と を 指 定 す る.resetを
行 っ た 後 はrewriteを
こ と だ け に し か 使 用 で き ず,rewriteを
行 っ た 後 は,順
まで の
後 そ の フ ァ イ ル に順 次 す る まで 順 次 読 み 出 す 次 書 き込 む こ とだ け に
しか 使 用 で き な い. プ ロ グ ラ ム で の 最 初 のresetま
た はrewriteは
つ け る よ う に す る こ と を 勧 め る.eofは
省 略 で き る が,必 ず 書 く習 慣 を
フ ァ イル の す べ て の 要 素 を読 み つ く し
た 状 態 か 否 か を 判 定 す る た め の 述 語 で,読 外 はfalseの
フ ァ イ ル 名 を 引 数 に 持 ち,そ
の フ ァイ ル の 次 の要 素 の 値 を フ ァイ
ァ イ ル バ ッ フ ァ)に 複 写 す る.た と え ば,図3・11の
で 読 ん だ 状 態 で,get(f)を す る.読
れ以
値 を 取 る.
手 順getは ル 変 数(フ
み つ く した 状 態 で はtrueを,そ
実 行 す れ ば,フ
フ ァ イ ル でcn-1ま
ァ イ ル 変 数 f ↑の 内 容 はcnへ
と変 化
ん だ 内 容 は 変 数 f ↑ と し て ア ク セ ス で き る.
同 様 に,putは
そ の 時 点 で フ ァ イル 変 数 に格 納 さ れ て い るデ ー タ を今 まで 書
い た フ ァ イ ル の 最 後 に 追 加 す る(図3・12参
(a)put(f)実
照).
行 前
(b)put(f)実
行 後
図3・12
図3・13に
示 し た 例 は,入 力 か ら 三 つ ず つ の 整 数 を読 み 込 み,そ れ ら を ひ と ま
と め に して 一 つ の フ ァ イ ル 要 素 と し て フ ァ イ ル f に 書 き込 み,そ
の後 その ファ
イ ル を 読 み 三 つ の 数 の 和 を 印 字 す る プ ロ グ ラ ム で あ る. フ ァ イ ル 型 の 特 殊 な 例 と して,テ text=file
キ ス ト型 が あ る.テ
of char
で 定 義 さ れ る と 説 明 さ れ て い る が,テ い 手 順 や 関 数(writeln, は な く,テ
キ ス ト型 は
readln,
キス
eol)も
ト型 に は フ ァ イ ル 型 に は 適 用 で き な
あ り,単
な る 文 字 デ ー タの フ ァ イル で
キ ス ト型 の デ ー タ は 文 字 が 任 意 数 順 列 的 に 集 ま っ て 行 を 構 成 し,そ
の 行 が さ らに 順 列 的 に集 ま って フ ァ イル を構 成 す る とい う複 雑 な デ ー タの 構 成 に な っ て い る. そ こ で,テ
キ ス ト型 の デ ー タ は フ ァ イ ル 型 の デ ー タ の 一 部 と 考 え る よ り も,
む し ろ デ ー タ の 構 成 や そ れ ら の う え に 定 義 さ れ て い る 機 能 も 異 な る 別 の 型 と考
図3・13
え る ほ う が よ い よ う で あ る. 本 書 で は,計
算 機 の 主 記 憶 内 で の デ ー タ 構 造 を 中 心 に 議 論 を し て い る の で,
こ こ で テ キ ス ト型 の デ ー タ に つ い て 十 分 に 解 説 す る だ け の 紙 面 は な い .し か し, テ キ ス ト型 はPascalを
マ ス タ ー す る と い う 意 味 で は 重 要 で あ る の で,他 の 参 考
書 な ど を も う 一 度 精 読 す る こ と を お 勧 め す る.
3.3
ポイ ンタ 型データ
Pascalで し な が ら,ポ
は,上
で 述 べ た 種 々 の デ ー タ 型 の ほ か に,ポ
イ ン タ 型 が あ る.し
イ ン タ 型 の デ ー タ は 少 し 異 な る 扱 い が 必 要 で あ る.今
タ の ほ と ん ど は,変
数(格 納 場 所)と そ の 値(格 納 さ れ て い る デ ー タ の 値)の
お りの 意 味 に 用 い ら れ て き た.ポ
イ ン タ 型 の デ ー タ も,そ
お りの 意 味 を 持 つ が,そ の 値 は ポ イ ン タ 定 数NIL以 の で あ る の か 明 示 さ れ て い な い.ポ
か
まで の デ ー
の 例 に も れ ず,2
2と と
外 は具 体 的 に どの よ う な も
イ ン タ 型 の 変 数 の 値 は,ま
た変 数 で あ る と
解 釈 され て お り,ポ イ ンタ 型 整 数 型 変 数 とい う よ うに,そ の 値 の 変 数 の 型 が あ る な ど,複 雑 で あ る. Pascalを 型 は,デ
学 ぶ 最 後 の 難 関 が,こ の ポ イ ン タ型 の 正 しい 理 解 で あ る.ポ イ ン タ
ー タ の 型 と い う見 地 よ りは,デ ー タ の 記 憶 領 域 へ の 配 置 に関 す る機 能
とい う観 点 か らみ る と,理 解 が 早 い よ うで あ る.こ の章 で は,こ の よ う な見 地 か ら ポ イ ン タ型 の デ ー タ を扱 う こ とに す る.
3.3.1
LHS表
A,Bが,あ
現 とRHS表
現
る 型 た と え ば 整 数 型 の 変 数 と し た と き の 代 入 文; A:=B
の 意 味 を 考 え て み よ う.正 確 な 意 味 は 「B で 示 さ れ た'値'(va1(B))を れ た'格 納 場 所'(var(A))に
複 写 しな さ い 」と な る.同
Aで示 さ
じ よ う に表 現 され た 変
数 A と B は 異 な っ た 意 味 に 解 釈 さ れ て い る こ と に 注 意 し よ う.こ
の 相 違 は,A
と Bが 代 入 記 号 の右 側 にお か れ て い るか 左側 に お か れ て い る か に よっ て 出 て来 た 解 釈 の 相 異 で あ る. 変 数 は,デ ー タ を 格 納 す る 場 所 に 付 け ら れ た 名 前 で あ る こ と は 前 に 述 べ た が, プ ロ グ ラ ム 中 の 変 数 に は 2 と お りの 解 釈 が あ る.そ う に 格 納 場 所 を 表 現 し て い る場 合 と,B
hand
side)表
こ の よ う な 区 別 の 例 は,代
の例の Aの よ
の よ う に そ の 変 数 に 格 納 さ れ て い る値
を 表 現 し て い る 場 合 で あ る.前 者 をLHS(left RHS(right
の 一 つ は,こ
hand
side)表
現 と い い,後 者 を
現 と い う. 入 文 の 左 辺 ・右 辺 に よ る もの の ほ か に,手
順や関
数 の 定 義 時 の 仮 引 数 の 中 に も見 ら れ る. procedure
ex_args(var
A:integer;B:integer);
で 示 さ れ た 関 数 見 出 しに含 まれ る仮 引 数 A はLHS表 で あ る と い え る.ま
た,ア
か れ た ア ド レ ス が,jump命 る 場 合 と,add命
セ ン ブ リ語 を学 ん だ 人 は,命
現
令 の オ ペ ラ ン ド部 に 書
令 の よ う に,そ の ア ド レ ス つ ま り格 納 場 所 を 意 味 す
令 の よ う に,そ
す る 場 合 と が あ り,そ
現 で あ る し,B はRHS表
の ア ドレス で 示 さ れ た格 納 場 所 の 内容 を意 味
れ らの 区 別 は 命 令 の 種 類 で 決 ま る こ と を 知 っ て い る.
この 2 とお りの 変 数 の 解 釈 方 法 は,あ わ れ るが,変
ま りな じみ の な い方 々 も あ る こ と と思
数 に対 して 常 に この ど ち らの 解 釈 で あ るか を意 識 して プ ロ グ ラ ム
す るこ とは,以 後 の ポ イ ンタ 型 の デ ー タ の 扱 い に お い て,意 味 の混 同 防 止 に大 変 役 立 つ と と もに,他
3.3.2
の 言 語 を学 ぶ と きに も統 一 的 に理 解 が深 ま るで あ ろ う.
静 的領 域 と動的領域
プ ロ グ ラ ム の 中 で の さ ま ざ まな デ ー タ は,そ れ らの 名 前 す な わ ち格 納 場 所 に よ って 区 別 され て い る.で あ るか ら計 算 に使 用 さ れ るデ ー タ は,そ の 値 は 前 も っ て わ か ら な くて も型 を指 定 した 変 数 と して 宣 言 され,そ の 領 域 が 確 保 され て い な け れ ば ア ク セ ス す る こ と はで きな い.Pascalに
よ るプ ロ グ ラ ミン グ で途 中
で,予 期 せ ぬ 作 業 領 域 が 必要 に な っ て 変数 宣 言 部 に新 しい 変 数 を追 加 した経 験 はだ れ で も あ る こ とで あ ろ う.
図3・14
この よ うに,プ
ログ ラ ミ ング 時 に計 算 に必 要 と され る デ ー タの 数 が 決 ま っ て
い る場 合 は よ いの だ が,必 要 とす るデ ー タ の 型 は わ か っ て い て も,そ の個 数 が 定 ま っ て い な い場 合 も あ る.こ の よ うな 場 合 の対 処法 の 一 つ は,必 要 数 の 最 大 値 また は そ のプ ロ グ ラ ム の 適 用 で き る最 大 デ ー タ 数 の 制 限値 を決 め てプ ロ グ ラ ム を作 る こ とで あ る.
た と えば,不
定個 数 の 整 数 を読 み 込 ん で計 算 機 の 内部 に 取 り込 む た め に,図
3・14の よ う な プ ロ グ ラム した とす れ ば,10000個
以 下 の デ ー タ に は対 処 で き る
が,そ れ 以 上 の場 合 は適 用 で きな い.プ ロ グ ラ ム の 適 用 範 囲 を大 き くす る に は, 定 数maxindexを 合 に も,maxindexで
大 き く設 定 して お けば よいの だ が,ほ ん の 少 しの デ ー タ数 の 場 指 定 され た 数 のデ ー タ領 域 を用 意 しな けれ ば な らな い ので,
とて も不 経 済 で あ る. こ の よ うな 不 便 さを解 消 す る ため に,プ
ログラムの実行の途 中で必要に応 じ
て幾 つ で も変 数 が 定 義 で き,ま た 不 要 に な っ た変 数 の 定 義 が解 消 で き る な らば, 大 変便 利 だ と思 わ れ る. 実 行 時 に 必 要 に応 じて割 り付 られ,ま よ う な領 域 を動 的領 域 とい い,今
た必 要 の な くな っ た 時 点 で 消 去 で き る
まで議 論 して きた よ う に,プ
ロ グ ラム の 中で
宣 言 に よっ て確 保 され る領 域 を静 的領 域 とい う.動 的 領 域 は大 変 便 利 な機 能 を 提 供 して い るの だ が,そ れ だ け に使 用 方 法 は複 雑 とな る こ とは 否 め な い. まず 最 初 の 問 題 点 は,動 的 に割 り付 られ た デ ー タ領 域 を どの よ う に ア ク セ ス す る か とい う 問題 で あ る.実 行 時 に生 まれ た領 域 で あ る か ら,当 然 プ ロ グ ラ ム 中 に そ れ に対 応 す る変 数 名 は あ り得 ない.そ が 求 め られ る よ う に,動 的 変 数 のLHS表
こ で,計 算 に よ って あ る変 数 に値
現 を値 と して 取 る こ との で き る変 数,
つ ま り動 的 変 数 の 変 数 名 に あ た る もの を値 と して 持 つ こ との で き る変 数 を 考 え る.こ の よ うに して導 入 され た の が ポ イ ンタ 型 で あ る.
3.3.3 ポ イ ン タ 型 デー タ 前 節 で 述 べ た よ う に,ポ イ ン タ 型 と は動 的 領 域 の 変 数 名 を値 とす る変 数(ポ イ ン タ)を 総 称 した 呼 び 名 で あ る.そ れ ぞ れ の ポ イ ン タ は,そ
の値 の 示 して い
る動 的 変 数 の 型 に よっ て,整 数 型 ポ イ ン タ,レ コ ー ド型 ポ イ ンタ,集 合 型 ポ イ ン タの よ うに,フ
ァイ ル 型(テ キ ス ト型 を含 む)以 外 の 任 意 の 型 の ポ イ ン タ が あ
る. 前 に も述 べ た よ うに,ポ
イ ンタ 型 の デ ー タ に また 型 が あ るの は,奇 妙 な感 じ
が す る か も しれ な い.こ れ は,整 数 型 ポ イ ン タの 意 味 が,あ
る動 的 変 数 を値 に
持 つ ポ イ ンタ の 示 す 動 的 変 数 の値 の 型 が 整 数 型 と い う こ と を簡 単 に表 現 して し ま っ た こ とに起 因 して い る. ポ イ ン タ 型 は,計 算 シ ス テ ム を表 して い るの で は な く,動 的 変 数 の 配 置 に関 す る機 能 で あ る よ う に解 釈 で き る の で,ポ
イ ンタ 型 の デ ー タ 間 の 演 算 な どは 定
義 さ れ て い な い が,ポ イ ン タの 動 的 割 付 け に関 す る二 つ の 手 順new,disposeが 用 意 され て い る.x を あ る 型,た
とえ ば整 数 型 の ポ イ ン タ と して 宣 言 され て い
る変 数 つ ま り静 的 変 数 とす る(図3・15参
照).
(b)
(a)
(c) 図3・15
new(x)を
実 行 す る こ と に よ り,ポ イ ン タ x の 型(こ の 場 合,整 数 型)の 変 数 が
一 つ 動 的 領 域 に確 保 さ れ る 変 数 名*が
.こ
の 変 数 に は 名 前 が な い が,仮
x の 値 とな る(図3,15(b)参
照).名
に*と
前 と して の*は,プ
す る.こ
の
ログラマ に は
隠 さ れ て い て 知 る こ と は で き な い が,作
ら れ た 領 域 に 固 有 の も の で,他
のいか
な る 変 数 名 と も異 な っ た も の で あ る.プ
ロ グ ラ ム の 中 で,こ
のア ク
の 変 数*へ
セス は x ↑で表 現 され x ↑:=123を
実 行 す ると,図3・15(b)の
ように変 数*に
値 が 代 入 され る. 図3・15(b)の
状 況 は,動 的 変 数 に仮 の 名 前 を用 い て表 現 され て い るが,実 際
の 変 数 名 と仮 の 変 数 名 が 混 在 した り,動 的領 域 と静 的 領 域 との 区別 が わ ず らわ しい の で,図3・15(c)の
よ うにポ イ ンタ変 数 と動 的 変 数 との 関 係 を矢 印で 表 現
す る記 法 が 用 い ら れ る.こ の 表 現 で は,矢 印 で指 され た 先 の 変 数 は す べ て 動 的 変 数 で あ り,名 前 の つ いて い る 変 数 は,す べ て 静 的 変 数 と解 釈 す る. 注 意 す る こ と は,ポ
イ ン タ変 数 の 値 が 動 的 変 数 を示 して い るの で あ るか ら,
ポ イ ン タ変 数 と動 的 変 数 との 関 係 は,ポ
インタ変数の値 を変 えるこ とによって
変 化 す る こ とで あ る.
(a)実
行前
(b)x:=y実
行 後
(c)new(x)実
行 後
図3・16
た とえ ば,図3・16(a)の
状 況 でx:=yを
変 化 し,x ↑は y ↑ と 同 じ456を と す る 動 的 変 数 は,も
よ うに
値 と す る 動 的 変 数 を 示 す こ と と な る.123を
値
はや ど こか ら もア クセ ス す る こ とが で きな い 迷 子 変 数 と
な っ て し ま う.同 じ よ う に,手 順new(x)を う に,x
実 行 す る と,図3・16(b)の
実 行 し た 場 合 も,図3・16(c)の
↑は 新 し い 動 的 変 数 を 指 し,前 の123を
よ
値 に持 つ 変 数 は 迷 子 に な っ て
し ま う. ポ イ ン タ 型 デ ー タ の 唯 一 の 定 数NILは,ポ 数 を 持 た な い こ と を 意 味 し て お り,ど NILを
図 式 表 示 す る 場 合,直
の 斜 線(図3・17参 ま た,ポ
接NILと
イ ン タが そ の 値 と して 指 す 動 的 変
の 型 の ポ イ ン タ に も 共 通 な 定 数 で あ る. 書 き 示 さ れ る ほ か に,変
数 を示 す 枠 内
照)で 表 現 さ れ る こ と が 多 い.
イ ン タ は 静 的 領 域 に だ け で な く,動
的 領 域 の 変 数 の 値 と して も取 る
(a)
(b)
(c) 図3・17
こ と が で き る.こ
れ を 応 用 した 例 と して,図3・17の
不定個 数の実数 デー タを
呼 み 込 ん で 格 納 す る プ ロ グ ラ ム(一 部)を 考 え よ う. こ の プ ロ グ ラ ム を 図3・17(b)の
デ ー タ に 対 し て 実 行 し た と き,読 み 込 ま れ た
デ ー タ の 格 納 の さ れ 方 は,図3・17(c)の
よ う な 配 置 と な る.こ の 例 の よ う に,
次 々 と 新 し い 動 的 変 数 を 同 じtopと
い う 変 数 を 介 し て 作 っ た と し て も,静
数topか
べ て の 動 的 変 数 が 迷 子 に な らず に ア ク セ ス
ら 順 に た ど っ て 行 け ば,す
す る こ と が で き る.こ
の よ う に,ポ
的変
イ ン タ を順 に た ど って ゆ け ば ア ク セ ス で き
る構 造 を リ ン ク 構 造 と い う. た と え ば,上
記 の 例 で 四 つ の 実 数 を 読 み 終 わ っ た 後 で,2
ク セ ス す る に は,こ
番 目の デ ー タ をア
の ポ イ ン タ で 綴 ら れ た 列 の 3番 目 で あ る こ と か ら
top↑.next↑.next↑.val と な る.ま た,一 般 的 に こ の 方 法 で 読 み 込 まれ た n個 の デ ー タ が あ っ た と き に k 番 目 の 実 数 デ ー タ を 得 る 関 数 は,図3・18の
よ う に プ ロ グ ラ ム す る こ とが で き る.
図3・18
ア ク セ ス 可 能 な動 的 変 数 は,静
的 領 域 の ポ イ ン タ変 数 の値 が 直 接 ア クセ ス す
る こ とが で きる場 合 と,静 的 領 域 の ポ イ ンタ 変 数 か ら幾 つ か の 動 的 領 域 の ポ イ ン タ 変 数 を経 て ア クセ ス 可 能 な場 合 とが あ る. 前 者 の 場 合 を 直接 ア ク セ ス と呼 び,後 者 の 場 合 を間 接 ア クセ ス と呼 ぶ こ と に す る.動 的 変 数 は,そ の 名 称 を持 た な いの で,静 的 変 数 か ら直 接 また は間 接 に ア ク セ ス で きな け れ ば 記 憶 装 置 内 に 存 在 して い て も,使 用 す る こ とが で き な い. ゆ え に,以 後 ア クセ スの 必 要 で な い ポ イ ンタ 型 の デ ー タ は,手 順disposeを い て 記 憶 内 か ら消去 して お くの が よ い.
用
第 3章
1.Pascalの か し,多
規 格 に は 文 字 列(string)型
くのPascal処
の デ ー タ 型 は 用 意 さ れ て い な い.し
理 系 で は 文 字 列 型 の 計 算 シ ス テ ム が 利 用 で き る .あ な た
が 利 用 し て い るPascal処 し,許
練 習問題
理 系 で は,文
さ れ て い る な らば,文
字 列 型 が 許 さ れ い て る か い る か 否 か.も
字 列 型 の デ ー タ 型 に 関 連 して 用 意 さ れ て い る 手 順
や 関 数 に つ い て そ の 機 能 を 調 べ よ.
2.次 の プ ログ ラ ム(部 分)に 問題 点(文 法 上 の 誤 りだ け で あ る とは 限 らな い) が あ れ ば,そ (1)
の 問 題 点 を指 摘 せ よ. type
color=[red,while,blue]; goods=record
red:(y:integer); blue:(z:integer) end;
(2)
type
R=record case
Boolean
of
true:(X:integer;Y:char);
false:(Z:real) end; ver
A:R;…
begin…
with
A
do
begin
Y:='a'; Z:=15.3; X:=123; writeln(X:5,Y) end;
3.フ
ァ イ ル 型 の 特 殊 な 例 と し て,テ
キ ス ト型(text
type)が
あ る.テ
型 の フ ァ イ ル が 普 通 の フ ァ イ ル 型 の デ ー タ と して 表 現 で き な い 点,実
キ ス ト
現 で きな
い 機 能 に つ い て 述 べ よ.
4.あ な た の 使 用 し て い るPascalで set of charの
は,set
定 義 が 可 能 で あ る と し て,二
印 字 す る プ ロ グ ラ ム を 実 装 せ よ.た
だ し,お
of charが
つ の 英 文 章 に 共 通 に表 れ る文 字 を の お の の 英 文 章 は,テ
1行 の デ ー タ(長 さ 不 定)と し て フ ァ イ ルinputか
5.計 算 機 言 語Algol-68に
お け るUNION型
使 用 で き る で あ ろ う か.
キ ス ト型 の
ら読 み 込 ま れ る もの と す る.
の デ ー タ 型 とPascalに
おける可 変 レ
コ ー ド型 の 比 較 を せ よ.
6.実 多項 式 の 非 零 の 項 を そ の次 数 と係 数値 との 対 で 表 現 し,多 項 式 は そ れ ら の 項 の 対 を降 べ き順 に並 べ た列 で 表 現 され て い る もの とす る.た
とえ ば,
な る多項式 は (8,1.5),(6,2.6),(3,13.6),(1,1.0),(0,32.1)…
と表 現 され る.こ の 多項 式 をプ ロ グ ラム 内 部 で は図3・19の 表 現 す る もの と して 以 下 の 問 い に 答 え よ.
…(1)
よ うな リンク構 造 で
(1)
(1)の
よ う な 形 式 の 入 力 デ ー タ を 読 み 込 ん で,図3・19の
よ うな リンク
構 造 表 現 に 変 換 す る 手 順 を 実 装 せ よ.
図3・19
(2) 2つ の リ ン ク構 造 表 現 の 多 項 式 を 引 き数 と し,そ れ らの積 を計 算 す る 手 順 を実 装せ よ.
[4] 線 形 リ ス ト
4.1
リス ト型 のデータ
線 形 リス トま た は 単 に リス トは,別 名 線 形 デ ー タ構 造 と も呼 ば れ,一 つ の抽 象 的 な デ ー タ型 を意 味 して い る.以 後 の議 論 で は,単
に リス トと呼 ぶ こ と にす
る. リス トは,い
くつ か の デ ー タ が 方 向性 を持 っ て 一 列 に連 結 され て い る構 造 を
い う. あ る 要 素 a に 対 し,そ の 前 方 向 に 連 結 して い る 要 素 を a の 前 者(predesessor) と い い,後
方 向 に 連 結 し て い る 要 素 を 後 者(successor)と
後 者 の 関 係 で ひ と ま と め に し た デ ー タ を 意 味 す る.い
い う.リ
ス トは 前 者,
ま,a1,a2,…,anの
n個 の
デ ー タ 要 素 に 対 し, a1は 前 者 を 持 た ず,a2を a2はa1を
anはan-1を
後 者 に持 つ.
前 者 に 持 ち,a3を
前 者 に 持 ち,後
後 者 に 持 つ.
者 を 持 た な い.
とい う関 係 を もつ リス トL は抽 象 的 に L=a1a2a3…an
と表 現 さ れ る.a1は
L の 先 頭(top),anは
L の 末 尾(tail)と
呼 ば れ,そ
れ ぞれ
a1=top(L),an=tail(L)と
表 現 さ れ る.
リス トL の な か のakの
前 者 をpred(ak,L),後
者 をsucc(ak,L)で,ま
を 明 示 し な く て も明 ら か な と き は,pred(ak),succ(ak)と ス ト と い っ た と き に は,個 い る か だ け に 注 目 し,そ
た,L
表 す こ と に す る.リ
々 の 要 素 が な ん で あ り,そ
れが どんな順序で並 んで
れ が 計 算機 の 中 で どの よ うに 配 置 され て い るか は 問題
と しな い. リス トは,一
見 し た と こ ろ 配 列 と 似 て い る よ う で あ る が,リ
ス トに は添 字 の
概 念 お よ び そ れ に 付 随 し た 記 憶 場 所 が 固 定 的 に 定 ま う て い な い.た
と え ば,
L=a1a2…an で あ る リス トで は,a2は
2番 目 の 要 素 で あ る が,L
の 先 頭 にa0を
加 える と
L=a0a1a2…an と な り,a2は そ の 格 納 位 置 お よ び 内 容 が 変 化 し て い な い 場 合 で も,3 番 目 の 要 素 と な っ て し ま う.も
う一 つ の 大 き な 相 違 点 は,リ
ス トは 実 装 の 方 法 に つ い て は
何 も 規 定 し て い な い こ と で あ る. リ ス ト間 に 施 さ れ る演 算 や 操 作 を考 え る と き,リ し て い な け れ ば な ら な い 場 合 と,そ
ス トの 構 成 要 素 の 型 が 一 致
う で な い 場 合 とが あ る .た
の 長 さ を 求 め る 場 合 に は リス ト 内 の 要 素 の 型 は 関 係 な い が,リ 和 を 求 め る と い う 場 合 は,各 定 義 か ら は,リ
と え ば,リ
ス ト
ス ト内 の 要 素 の
要 素 の 型 は 一 致 して い な け れ ば な ら な い .本
来の
ス ト内 の 要 素 の 型 が 一 致 し て い る か 否 か と い う 制 限 は な い が,
以 後 の 議 論 に お い て は,同
じ型 の 要 素 を 持 っ て い る も の と仮 定 して お く.
抽 象 的 な デ ー タ 構 造 で あ る リス トは,こ の 型 に 特 有 な 操 作 ま た は 演 算 が あ る. こ れ ら の う ち で,基 作 が 考 え ら れ る が,そ
本 的 な も の を 7種 類 あ げ て お こ う .こ
れ 以 外 に も,数
々操
れ らの ほ と ん ど は 以 下 の 7種 類 の 操 作 を 組 み 合 わ せ る こ
と に よ っ て 実 現 で き る. 各 操 作 の 実 装 プ ロ グ ラ ム に は,こ
こ で は 触 れ な い.以
簡 単 な 記 述 と,そ れ ぞ れ の 操 作 の 名 称,イ
下 に,各
ン タ フ ェ ー ス を 明 ら か に す る た め に,
そ の 操 作 を 手 順 と し て プ ロ グ ラ ム した と き の 手 順 見 出 し(procedure が 示 さ れ て い る.こ
こ で は,統
操 作の意味の
一 性 を 考 慮 して,各
heading)
操 作 を 手 順 で 表 現 して い る
が,実
際 に は 関 数 と して 定 義 し た ほ う が 使 い や す い も の も あ る で あ ろ う.
(1)
リ ス ト L の 先 頭 の 要 素 を 変 数 a の 値 と し て 持 ち 帰 る. procedure
(2)
car(L:list;var
リ ス トL1の procedure
(3)
a:item);
先 頭 の 要 素 を 取 り除 き,残 りの リス トをL2と cdr(L1:list;var
L2:list);
リ ス ト L の 先 頭 に 要 素 a を 付 け 加 え る. procedure
(4)
cons(a:item;var
L:list);
リ ス ト L の 長 さ を 変 数 N の 値 と し て 持 ち 帰 る. procedure
(5)
length(L:list;var
N:integer);
長 さ 0の リ ス トを L の 値 と し て 持 ち 帰 る. procedure
(6)
nulllist(var
リス トL1の
procedure (7)
し て 取 りだ す(元 の リ ス トは 変 化 し な い).
sublist(L1:list;
リ ス トL1の
ス トL1は
L);
先 頭 か ら i番 目 の 要 素 か ら j番 目 の 要 素 ま で の 間 の サ ブ ・リ
ス トを 一 つ の リ ス トL2と
i,j:
末 尾 に リス トL2の
変 化 す る が,L2は
procedure
concat(var
っ て い れ ば,実
図4・1の 以 上,リ
var
L2:list);
先 頭 を連 結 して,一 つ の リス トにす る(リ
L1:list;
L2:list); 本操 作 の 機 能 と イ ン タ フ ェ ー ス が 定 ま
際 に そ れ ら が 実 装 さ れ て い な くて も,そ
ム を 作 っ て い く こ と,い 例 と し て,リ
integer;
変 化 しな い).
こ れ ら リ ス トに 関 す る 操 作 機 能 は,基
わ ゆ る,下
れ ら を用 い たプ ロ グ ラ
降 型 プ ロ グ ラ ミ ン グ が 可 能 と な る.
ス ト 中 の 重 複 し た 要 素 を取 り除 い た リス トを 値 と す る 関 数 は,
よ う に 実 装 で き る. ス トの デ ー タ 構 造 お よ び リ ス ト上 の い ろ い ろ な 操 作 演 算 に つ い て 述
べ て き た が,リ
ス ト型 の デ ー タ も ま た 配 列 型 や レ コ ー ド型 と 同 じ よ う に,リ
ト 自 身 の 表 現 し て い る 意 味 に つ い て は 強 く規 定 さ れ い な い.あ の 商 店 の 顧 客 の 一 覧 表 で あ っ た り,あ た り,な
して 持 ち 帰 る.
ス
る場 合 は ど こか
る プ ロ グ ラ ム の 入 力 文 字 列 を表 現 し て い
ど い ろ い ろ な 利 用 方 法 が 考 え ら れ る.
しか し,ど
の 利 用 法 に お い て も,そ
れ らの デ ー タ に 適 用 さ れ る 操 作 は,前
に
図4・1
示 した基 本 操 作 の組 み 合 せ で 作 る こ とが で き る.で あ るか ら リス ト型 は,単 デ ー タの 表 現 法 とか 実 装 の 方 法 な ど と は異 な っ て,同
に
じ計 算 シ ス テ ム を持 つ も
の の 全 体 を 表現 した もの と考 え た ほ うが 妥 当 で あ ろ う.
4.2
リ ス トの 実 装
4.2.1 配 列 構 造 に よ る リス トの 実 装 リ ス トL=a1a2…anを
配 列L:array[1..maxlength]of
itemに
実 装 す る に は,
a1をL[1]に,a2をL[2]に,…,anをL[n]に
と い う よ う に,リ
順 々 に 配 列 に 格 納 す る 方 法 が あ る(図4・2).リ 頭 の 位 置 と一 致 し て い る が,末
ス トの 先 頭 か ら
ス トの 先 頭 の 位 置 は,配
列 の先
尾 は リ ス トの 長 さ に よ っ て 格 納 位 置 が 変 わ る.
リ ス トの 末 尾 が 配 列 の ど の 位 置 に あ る か を 示 す た め に,図4・2のtailの リ ス トの 長 さ を 示 す 変 数 を 用 意 す る.tailの
よ う に,
値 に よっ て 示 され た 配 列 の 位 置 か
ら配 列 の 最 後 ま で は 空 領 域 と呼 ば れ て い る.配 列 の 寸 法maxlengthは,こ
の配
列 で 表 現 で き る リ ス トの 最 大 長 を 表 す 数 値 で あ る.
図4・2
配 列 を 利 用 し て 実 装 さ れ た リ ス ト上 の 基 本 関 数length,element,nulllistお よ びinsertの
特 殊 な 例 と し て リ ス トの 最 後 に 新 し い 要 素 を 加 え る 機 能 の プ ロ グ
ラ ム は 簡 単 な の で,こ
こ で 述 べ る ま で も な い で あ ろ う.
簡 単 な よ う で 注 意 を 要 す る の は,deleteやinsertで 去 ま た は 挿 入 し た と き,そ
列
の 二 つ の 関 数 の プ ログ
示 す.
配 列 を 利 用 し た リ ス トの 実 装 に は,さ の 機 能 は,あ
方 と も要 素 を 除
の 位 置 か ら後 部 の 要 素 の 順 番 が 変 わ る た め に,配
内 で の 格 納 位 置 を 移 動 す る 必 要 が 生 じ る た め で あ る.こ ラ ム 例 を 図4・3に
あ る.双
ら に 大 き な 問 題 が あ る.関
数sublist
る リ ス トの 一 部 分 と 同 じ要 素 を持 つ リ ス トを 作 る こ と で あ る が,
値 と な る リ ス ト は も と の リ ス トの 一 部 分 を 共 有 す る の で は な く,そ
の一部分 を
図4・3
複 写 して 新 しい リス トを作 るこ とだ と解 釈 す る こ と に し よ う.そ うす る と,関 数sublistの 値 とな る リス トの 配 列 名 は ど う な るの で あ ろ う.配 列 が 実 行 時 に 必 要 な だ け新 し く定 義 して 作 りだ せ る,い わ ゆ る動 的 配 列 の 機 能 を持 って い る 言 語 の 場 合 は よいの だ が,FORTRANの
ように 静 的 配 列 だ け しかな い言 語 で の
プ ロ グ ラム で は,実 行 時 に作 られ る リス トの 数 を予 想 して そ の 数 だ け配 列 を 用 意 しな け れ ば な らな い.し か し,実 際 に は 必 要 な 配 列 数 が予 測 で き る場 合 は少 な い で あ ろ う. も う一 つ の 問 題 点 は,大 きな領 域 を犠 牲 に して十 分 な 数 の 配 列 を用 意 して も,
そ の う ち の 一 つ の リ ス トが 最 大 長 の 制 限 を超 え て あ ふ れ(over-flow)が 場 合 は,ほ
か の 配 列 で ど ん な に た く さ ん の 空 領 域 が あ っ て も,プ
生 じた
ログラム は中
断 し て し ま う こ とで あ る.
図4・4
こ の 問 題 の 解 決 法 の 一 つ は,図4・4の ス トLIST1,LIST2,…,LISTkを -list)
.こ
き な 配 列 と し てmultilist,使
トの 位 置 情 報 の た め の 配 列listsお
よ び そ の 時 点 で 使 用 さ れ て い る リ ス ト数 を
列 名 で 区 別 さ れ る の で は な く,配
配 列 要 素 は,配
列multilist上
プ ロ グ ラ ム の 記 法 で ま と め る と,
lrange:1..maxlength; multilist:array[lrange]of
item;
lists:array[1..maxlist]of record と な る.
hd,tl:lrange
列listsの
で の.LISTiの
と の 位 置 が 示 す フ ィ ー ル ド を 持 つ レ コ ー ドで あ る. 以 上 をPascalの
用 されて い る リス
ら構 成 さ れ て い る.
そ れ ぞ れ の リ ス ト は,配 対 応 し て い て,listsの
き な一 つ の 配 列 に 複 数 の リ
格 納 して し ま う 方 法 で あ る(マ ル チ リス ト:multi
の 図 の 例 で は,大
表 し て い る 変 数nlistか
よ う に,大
end;
添 字が
先 頭 と末 尾
こ の 例 の 場 合 も,使 用 で き る リス トの 数 はmaxlistの 前 述 の よ う に,多
くの 配 列 を 用 意 す る 必 要 が な く配 列listに
い の で,maxlistを
お い て,lists[i].tl=list[i+1].hdと
列multilistの
ど こ か に 空 領 域 が あ れ ば,幾
lists[i].tl<lists[i+1].hdと る.multilist上
4.2.2
要 す る領 域 も 少 な
大 き く取 っ て も領 域 の む だ 使 い は 無 視 で き る.
ま た,LISTiに も,配
値 で 制 限 さ れ て い る が,
な り あ ふ れ が 生 じて つ か の リ ス トを 移 動 し て,
な る よ うに 移 動 して 対 処 す るこ とが 可 能 で あ
に 空 領 域 が ま っ た く な く な っ た 時 点 で 真 正 の あ ふ れ が 生 ず る.
リ ン ク 構 造 に よ る リス トの 実 装
リ ン ク 構 造 と は,ポ 造 の 総 称 で あ る.リ
イ ン タ*を 用 い て,デ
ー タ 間 の 関 係 を表 現 した デ ー タ構
ン ク構 造 で リス ト を 表 現 す る に は,お
の お の の リ ス トの 要
素 を デ ー タ 要 素 本 来 の 情 報 を 格 納 す る フ ィ ー ル ド と,リ
ンク構 造 を示 す 幾 つ か
の ポ イ ン タ フ ィ ー ル ドか ら な る レ コ ー ドで 表 現 す る.た
と え ば,一
つ のポイ ン
タ を 持 つ リ ス トの 要 素 は pitemrec=↑itemrec; itemrec=record inf:item; next:pitemrec end
で 表 現 さ れ る.ま
た,一
つ の リス トは,そ
の リ ス ト構 造 を 示 す デ ー タ の 一 部,
一 般 に は リ ス トの 先 頭 の 要 素 へ の ポ イ ン タ で 表 現 さ れ る . リス トL=a1a2…anはpitemrec型
の デ ー タ で 表 現 され,図4・5の
よ うな リン
ク 構 造 と な る. リ ン ク 構 造 に よ っ て 実 装 さ れ た リ ス トの 操 作 性 に つ い て 考 え る と,非
常に多
く の 点 で 配 列 構 造 に よ る リス トの 場 合 と 対 照 的 で あ る.
* この 場 合 の ポ イ ン タ は,Pascalの
ポ イ ン タ型 の デ ー タ と い う狭 い 意 味 で は な く,変 数 の 値 が 格
納 位 置(変 数)を 表 現 して い る もの の 総 称 で あ る.
図4・5
■要 素の アクセ ス
配列 上 の リス トの 場 合,お
の お の の 要 素 は 配 列 の 1要 素
で も あ る の で,ラ ン ダ ム ア ク セ ス が 可 能 で あ っ た が,リ ン ク構 造 の リス トで は, リス トの 先 頭 とか 直 前 に ア クセ ス した位 置 か ら順 に リン ク を た ぐっ て ゆ き,目 的 の 要 素 に 到 達 して は じめ て その 要 素 へ の 情 報 の ア クセ ス が 可 能 と な る. ■要 素 の 挿 入 と除 去
配 列 に よ る リス トで の 要 素 の 挿 入 ・除 去 は,前
べ た よ う に,他 の 要 素 の格 納 位 置 の変 更 を伴 う.そ れ に比 較 して,リ に よ る リス トは,図4・6に
に も述
ン ク構 造
示 す よ う に,要 素 Yの 除 去 につ いて はpred(Y)す
(a) リス トの 要 素 の 除 去
(b) リス トの挿 入 図4・6
な
わ ち X の ポ イ ン タ をsucc(Y)=Zへ
と付 け 換 え(点 線),ま た 同 図(b)の
間 に Y'を 挿 入 す る に は X の ポ イ ン タ を Y'に,Y'の
X とZの
ポ イ ン タ を Z に(点 線)つ
け 換 え る だ け で 済 ん で し ま う の で 簡 単 で あ る. ■ リ ス トの 統 合 と 分 割 い が,こ
リス トの 統 合 と分 割 は,基
本 操 作 に含 まれ て は い な
れ は 基 本 操 作 の 組 み 合 わ せ に よ っ て 実 装 可 能 で あ る か ら で,リ
操 作 と し て は 重 要 な機 能 で あ る.front(L,n),rear(L,n)を
ス トの
そ れ ぞ れ リス ト L
の 先 頭 か ら n 番 目 ま で の サ ブ リス ト,(n+1)番
目 か ら 末 尾 ま で の サ ブ リ ス トと
す る と L をL1=front(L,n),L2=rear(L,n)に
分 割 す るに はL1を
LにL2を
目 の 要 素 の ポ イ ン タ の 値 に,そ し て n番 目 の 要 素 の ポ イ ン タ をnilに (図4・7(a)参
照),ま た 二 つ の リス トL1とL2を
の よ う に,L1の
末 尾 の 要 素 の ポ イ ン タnilをL2に
n番
すれ ば よ く
統 合 して L を 作 る に は,図4・7(b) し,L1を
Lに代 入 す る だ け で
よ い こ と に な る.
(a) リス トの 分割
(b) リス トの 統 合 図4・7
[注 意] リン ク構 造 の 利 点,欠 点 につ い て い ろ い ろ 学 ん で きた が,リ ン ク構 造 で 便 利 だ と い われ て い る機 能 に も落 穴 が あ る.そ れ は,一 般 的 に は 側 面 効 果(side effect)と 呼 ば れ て い る 現 象 で,目 的 とす る答 え を得 る 過程 で プ ログ ラ ム の 内 部 状 態 とか 、 デー タ の 一 部 を変 形 して しま う こ と で あ る.た
とえ ば,図4・7(a)の
場 合,L1とL2を
得 る 過程 で,引
割 の 終 わ っ た 時 点 で の L の値 は,元
の もの とは 異 な って い る.(b)の
の 前 と後 で は 値 が 変 化 して い る.こ
の よ うに,リ
十 分 注 意 す る必 要 が あ る.
数 の L は変 え られ て分 例 で はL1が や は り統 合
ン ク構 造 で は側 面 効 果 が 起 きや す い の で,
図4・8
リ ン ク構 造 を 用 い て 実 装 さ れ た リ ス ト間 の 基 本 的 な 関 数 の 幾 つ か の プ ロ グ ラ ム 例 を 図4・8に
示 し た.リ
ン ク構 造 で の リス トの 実 装 の 場 合 に は ,リ ス トが ポ
イ ン タ 型 の デ ー タ で あ る の で,配 さ れ て い な い の で,す つ い て は,読 さ て,今
列 の と き の よ う に リ ス トが 関 数 値 と し て 制 限
べ て が 関 数 と し て プ ロ グ ラ ム 可 能 で あ る .残
りの 関 数 に
者 の 方 々 の 演 習 と し て 残 し て お く. ま で 学 ん で き た リ ン ク 構 造 の リ ス トは,各
者 へ の ポ イ ン タ だ け で あ る た め に,リ
要 素 の レ コ ー ド内 に は 後
ス ト内 の 要 素 を ア ク セ ス す る の に 先 頭 か
ら 末 尾 の ほ うへ リ ン ク を た ど っ て い く方 法 し か 取 れ な い.と
い う こ と は,リ
トと し て も っ と も基 本 的 で あ る,あ る 要 素 a の 前 者 を 求 め る 関 数pred(a)は ら 直 接 求 め る こ と は で き ず,リ
ス aか
ス トの 先 頭 か ら 順 に 後 者 と して a を 持 つ 要 素 を
探 索 し て い く以 外 に 方 法 は な い. こ の 一 方 向 性 の 不 便 を 解 消 す る た め に,リ
ス トの 要 素 の レ コ ー ドを
pitemrec=↑itemrec;
itemrec=record inf:item; pre,suc:pitemrec end; と し前 者,後
者 へ の 双 方 の ポ イ ン タ を 持 つ よ う に す る .こ
リ ン ク し た リ ス ト を 二 重 結 合 リ ス ト(double a1a2…anは
図4・9の
linked
の よ う に,二
list)と い い,リ
方向 に
ス トL=
よ う に 表 現 さ れ る.
図4・9
【 例 】
あ るチ ェ ー ン店 の 本 店 に,各 支 店 か ら毎 日の売 上 伝 票 が 集 ま っ て くる.伝 票 に は,図4・10の
よ うに支 店 番 号 とその 日の売 上 高 が千 円 単 位 で記 入 されて い る.
この モ デ ル と して,支 店 番 号 と売 上 高 の 二 つ の 数 か ら成 る レ コ ー ドを 入 力 装 置
か ら不 定個 数 読 み 込 ん で,伝 票 の 束 を表 現 す る二 重 結 合 リス トを 作 り出 す 手 順 をプ ロ グ ラ ム した例 を図4・11に
示 して あ る.
図4・10
図4.11
4.3 ス タ ッ ク と キ ュ ー
4.3.1
特 殊 な リス ト
リ ス ト構 造 に お い て は,便,不 で き る.ま
た,リ
対 し て も,そ
便 の 差 は あ っ て も,ど
ス トへ の 要 素 の 挿 入,除
去 お よ び リ ス トの 分 割 な ど の 操 作 に
の 操 作 位 置 に は 制 限 が な い.し
法 を 制 限 し特 殊 化 す る こ とで,一
の 要 素 に で もア ク セ ス
か し,こ
の ア クセ ス位 置 や その 方
般 性 が 狭 ま り使 い 勝 手 が よ く な る と い う こ と
が あ り う る. た と え ば,中 こ れ に 反 し て,西 る.リ
華 料 理 で は 1種 類 の 包 丁 で す べ て の 料 理 を こ な す そ う で あ る. 洋 料 理 で は,そ
の 用 途 に応 じて千 差 万 別 の 道 具 が 使 わ れ て い
ン ゴ の 芯 を 取 る 専 用 の 包 丁 な ど は そ の 例 で あ る.中
で リ ン ゴ の 芯 が 取 れ る か ど う か は 別 に し て,そ が,専
華料理の大 型の包丁
の 使 用 法 に は 工 夫 と熟 練 が い る
用 の 道 具 は 使 い 手 が 多 少 無 器 用 で も,け っ こ う使 い こ な せ る も の で あ る.
リ ス トの 機 能 を 制 限 し,特 (queue)が
あ る.こ
殊 用 途 化 し た も の に ス タ ッ ク(stack),キ
の 節 で は,こ
ュー
れ ら の 特 殊 リ ス トに つ い て の 基 本 操 作,実
装
の 方 法 お よ び 用 途 に つ い て 検 討 す る こ と に し よ う.
4.3.2
スタ ック
ス タ ッ ク は,別 (Last
In First
か で き な い が,使
名 プ ッ シ ュ ダ ウ ン リ ス ト(pushdown Out
List)と
list)と かLIFOリ
ス ト
呼 ば れ,リ ス トに 比 べ て 非 常 に 制 限 さ れ た 操 作 し
用 目的 に よ っ て は便 利 な デ ー タ構 造 とな る.
ス タ ッ ク の 特 長 は,デ
ー タ の 挿 入,除
去 の 位 置 が 制 限 さ れ て い る こ と と,そ
の 挿 入,除 去 の 操 作 と ア ク セ ス の 操 作 とが 不 可 分 に 結 合 さ れ て い る こ と に あ る . ス タ ッ ク に 情 報 を 書 き 込 む に は,ス そ こ に 情 報 を 書 き 込 む と い う,一
タ ッ ク の 先 頭 に 新 し い レ コ ー ド を 挿 入 し,
連 の 定 ま っ た 操 作 しか で き な い .ま
た,ス
タ
ッ ク か ら要 素 の 情 報 を 得 る に は,ス タ ッ ク の 先 頭 の 要 素 し か 読 む こ と は で き ず ,
し か も,読
ん だ 後 に は,こ
の 先 頭 の 要 素 は ス タ ック か ら 自動 的 に 除去 され て し
ま う. こ のwirite-insertの
操 作 を プ ッ シ ュ ダ ウ ン(pushdown)と
の 操 作 を ポ ッ プ ア ッ プ(pupup)と
呼 び, read-delete
呼 ぶ.ス タ ッ クS=a1a2…anに
む プ ッ シ ュ ダ ウ ン 操 作 を 実 行 す る と,S=aa1a2…anと
要 素 a を書 き込
な り,先 頭 は a と な り 全
体 の 長 さ が 1だ け 増 え る. ま た,S=a1a2…anか =a2a3…a
ら情 報 を 読 む に は,a1だ
nと な り,先
け を 読 む こ とが で き,同 時 にS
頭 の 要 素 が 除 去 さ れ て 一 つ 短 くな る.こ
の よ う に,ス
ッ ク は 書 き 込 ん だ 順 番 と 逆 の 順 番 で しか 読 み 出 せ な い こ と か ら,LIFOの
タ
名 が与
え られ て い る で あ る. ス タ ック の二 つ の 操 作 を procedure
pushdown(x:item;var
procedure
popup(var
S:stack);
x:item;var
S:stack);
と二 つ の 引 数 を持 つ 手 順 で 表 す こ と に す る. pushdownは
要 素 の 変 数 x の 内 容 を ス タ ック にプ ッ シ ュ ダ ウ ン す る.x の 値 は 変
化 しな い.popupは
ス タ ッ ク の 先 頭 の 要 素 を 読 み 出 し,そ の 値 を x に 複 写 し て か
ら 除 去 す る.
図4・12
配 列 を 用 い た ス タ ッ ク の 実 装 は,図4・12の
よ うに 要 素 の 型 の 配 列 S とス タ ッ
ク の 先 頭 の 位 置 を 表 す 配 列 イ ン デ ク ス の 型 変 数topSと ス タ ック へ の 2種 類 の 操 作pushdownとpopupは
で 実 現 さ れ る.
図4・13の
よ うに 実 装 され る.
図4・13
(a) pushdown(x,S)
(b) popup(x,S) 図4・14
図4・15
リ ン ク 構 造 に よ る ス タ ッ ク の 実 装 は,ス イ ン タ と して 表 現 で き(図4・14),二 装 さ れ る.注 popupの
意 す る こ と は,ス
タ ッ ク 自信 が 先 頭 の レ コ ー ドへ の ポ
つ の ス タ ッ ク へ の 操 作 は 図4・15の
ように実
タ ッ ク は 先 頭 の 要 素 し か ア ク セ ス で き な い し,
操 作 で も次 のtopはpred[S]に
よ り求 め られ る の で,先 頭 か ら末 尾 の 方
向 へ の リ ン ク が あ れ ば よ く,二 重 結 合 リ ス トを 用 い る 必 要 性 が な い こ とで あ る.
4.3.3
ス タ ック の 応 用 例
数 式 に お け る項 と演 算 子 との 関 係 を表 現 す る に は,3 種 類 の 方法 が あ る.そ れ らは,そ
の 関 係 を 言 葉 で 表 現 す る 言 語 の 性 質 に依 存 す る と思 わ れ る.こ
こで
は,1+2を
無 理 に 日 本 語 で 表 現 す る と, "た す こ と の 1 と 2" … …+1
,2…
"1 た す 2"
… …1+2…
"1
… …1
と 2 を た す"
… 前 置(prefix)表 … 中 置(infix)表
,2+…
… 後 置(postfix)表
現 現 現
の よ う に な り,こ の 言 葉 の 順 序 で 数 式 と して表 現 した もの と,そ の 名称 との 対 応 を示 して あ る. 日本 語 で の 前 置 表 現 は不 自然 だ が,ポ ー ラ ン ド語 で は項 と演 算 を表 す 動 詞 が この 順 序 で あ る の で,ポ
ー ラ ン ド式 表 現 と も呼 ば れ て い る.英 語 で は 中 置 表 現
で,日 本 語 で は後 置 表 現 が も っ と も自然 で あ ろ う.し か し,日 本 式 とは 呼 ば ず に,逆
ポ ー ラ ン ド式 表 現 と呼 ば れ て い る.
さて,一
般 の 数 式 は 中置 表 現 で あ るが,計 算 機 で 数 式 を 計 算 す るに は,後 置
表 現 が 多 く使 わ れ る.後 置 表 現 で は,数 式 が 括 弧 な しで表 現 で きる だ け で は な く,例 2の よ う に ス タ ッ ク を 用 い て う ま く数 式 の値 を求 め る こ とが で き るか ら で あ る. 【 例 1】
加 減 乗 除 だ け か らな る中 置 表 現 の 数 式 をス タ ッ ク を 用 い て後 置表 現 に変 換 す るPascalの
プ ロ グ ラ ム を考 え よ う.た だ し,数式 はA∼Zの
な る変 数 と,+,=,*,/の
う ちの 1文 字 か ら
四 則 演 算 記 号 お よ び 左 右 の 括 弧(,)だ
な り,入 力 レ コー ドの 1行 に書 か れ て い て,誤
けか ら
りは な い もの とす る.ま た,演
算 に は優 先 順 位 が な く,優 先 順 位 をつ け る に は すべ て 括 弧 をつ け な け れ ば な ら な い もの とす る.
図4・16(そ
の 1)
図4・16(そ
の 2)
図4・16(そ
図4・16の
の 3)
プ ロ グ ラ ム の 考 え 方 は,基 本 的 な 中 置 表 現
左 側 変 数 」 に 対 し,右
「右 側 変 数
側 変 数 は 読 み 込 ん だ ら そ の ま ま 出 力 し,演
ッ ク に プ ッ シ ュ ダ ウ ン し,後
演算記号 算記 号はスタ
に 右 側 変 数 を 読 み 込 ん で 出 力 し て か ら,演
算 記号
を ポ ップ ア ッ プ し て 出 力 す る.も
し,右
側 また は左 側 の 変 数 の と こ ろ が括 弧 で
く く ら れ た 数 式 で あ る と き は,そ
の 式 が 左 右 ど ち らで 出 現 した か を ス タ ッ クに
記 録 す る. そ し て,新
た な 数 式(括 弧 内)を 出 力 し た 後,ポ
た 左 右 ど ち ら か の 変 数 を 処 理 し た も の と して,数
ップ ア ッ プ し,記
式 の 処 理 を 続 け る.も
力 時 に 1行 の 終 わ りが 検 出 さ れ れ ば 処 理 を 終 わ る.図 popupは
図4・15の
録 されてい し,入
中 の 手 順,pushdownと
もの と 同 じ もの で あ る の で,こ の プ ロ グ ラ ム の 中 で は 省 略 さ
れ て い る. 図4・17に れ て い る.
幾 つ か の 入 力 数 式 と,そ れ に 対 す る こ の プ ロ グ ラ ム の 出 力 例 が 示 さ
図4・17
【例 2 】 上 の 例 1 で 求 め た 後 置 表 現 の 数 式 の 値 を 求 め る プ ロ グ ラ ム も,ス い る と 簡 単 明 り ょ う に な る.ア Step-1.も
し,数
み 込 む.そ Step-2.も
式 が 終 わ り な ら ば,終
も な け れ ば,数
し て,Step-1へ
の 場 合 は,a
戻 る.
が 変 数 で あ る か ら,こ
し て,Step-1へ
の 結 果 を ス タ ッ クに
の 変 数 の 値 を求 め て ス タ ッ ク
戻 る.
の ア ル ゴ リ ズ ム が 終 わ っ た と き,数
式 の 値 は ス タ ック の 先 頭 に格 納
さ れ て い る.こ の ア ル ゴ リズ ム を プ ロ グ ラ ム し た の が 図4・18で,こ evalは
式 を 1文 字 読
タ ッ ク か ら 続 け て 二 つ の 値 を取 り出
の 記 号 の 演 算 を そ の 2値 に 対 し て 行 い,そ
に 記 録 す る.そ と な る.こ
了.さ
れ を a と す る.
記 録 す る.そ Step-3.こ
ル ゴ リズ ム は,
し,a が 演 算 記 号 な ら ば,ス
し,そ
タ ッ ク を用
の 中の関数
変 数 を 引 数 と し,そ の 変 数 の 持 つ 値 を 関 数 値(実 数 型)と す る もの と す る.
図4・18(そ
の 1)
図4・18(そ
の 2)
4.3.4
キ ュー
キ ュ ー(queue)は
別 名FIFOリ
リ ス ト と も 呼 ば れ る.ス た の に 対 し,キ れ て い る.ス
ス ト(First
ュ ー は 書 き 込 み は 先 頭 に だ け,読
タ ッ ク の 場 合 と 同 じ よ う に,書
追 加 さ れ た 後 に そ こ に 書 き 込 ま れ,読 読 み 出 さ れ た 後,そ
Out
list)と か,待 ち 行 列
み 出 しは末 尾 に だ け と制 限 さ
き 込 む と き は,先
み 出 す と き は,末
頭 に 1 レ コー ド
尾 の レ コ ー ドの 内 容 が
の レ コ ー ド は 削 除 さ れ る.
つ ま り,キ ュ ー をQ=a1a2…anと a2…anと
In First
タ ッ ク が リ ス トの 先 頭 に だ け 読 み 書 き が 制 限 さ れ て い
す る と き,Q に 要 素 a を 書 き込 む と,Q=aa1
な り,元 の Q か ら情 報 を 読 み 出 す とanが
取 り出 さ れ,Q=a1a2…an-1
と な る. キ ュ ー はFIFOの
名 の よ う に,キ ュ ー に 記 録 さ れ た 順 番 で しか 読 み 出 す こ と が
で き な い.ま
くの 理 髪 店 で み られ る よ う に,次
た,多
店 で 一 番 長 く待 っ た,つ
ま り,待
に サ ー ビ ス を 受 け る の は,
っ て い る人 達 の 中 で 最 初 に きた 人 で あ る こ と
か ら 待 ち 行 列 と い う 名 前 が つ い た の で あ ろ う.
図4・19
配 列 上 で の キ ュ ー の 実 装 は,図4・19の 数topQ,tailQと
a:item;var
列 Q と先頭 と末 尾 を表 す 変
か ら 構 成 さ れ る.
キ ュ ー へ の 二 つ の 操 作,writequeue(a:item;var (var
よ う に,配
Q:queue)は
図4・20の
Q:queue),readqueue よ う に な る. top
Q=maxlengthに
図4・20
な っ て し ま っ た 見 か け 上 の オ バ ー フ ロ ー に 対 し て の 扱 い は,tailQ=1と う に 再 配 置 す る 方 法 と,Q[maxlength]とQ[1]が
なるよ
つ な が っ て 輪 を 成 して い る よ う
に プ ロ グ ラ ム 上 で 考 慮 す る 方 法 と 2種 類 あ る が,こ こ で は 後 者 を採 用 し て い る.
リ ン ク構 造 を 用 い た キ ュ ー の 実 装 は,ス は 大 分 異 な る.キ セ ス 点,つ ず,キ
タ ッ ク と似 て い る が,リ
ュ ー は 二 つ の ア ク セ ス 点 を 持 つ の で,ス
ま り,先
ン クの 構 造
タ ック の よ う に ア ク
頭 の ポ イ ン タ だ け で ス タ ック 全 体 を表 現 す る よ う に は ゆ か
ュ ー は 二 つ の ポ イ ン タ の 対 で 表 現 さ れ る.
二 つ の 操 作 の う ち,writequeue(a:item:var (1)
newitemrecordに
Q:queue)の
よ っ て 示 さ れ る新 し い 領 域 を 生 成 す る.
(2) newitemrecord↑.inf
← aを 実 行 す る.
(3) pred[Q.topQ]=newitemrecordと (4) Q.topQ
な る よ う に リ ン ク す る.
← newitemrecordを
で あg,readqueue(var (1)
動作 は
実 行 す る.
a:item;var
Q.tailQ=Q.topQで
Q:queue)の
あ れ ば,ア
ン ダ ー フ ロ ー 誤 り.
(2) a ← Q.tailQ↑.infを
実 行 す る.
(3) oldtailQ
Q.tailQ
← Q.tai1Q,
(4) dispose[oldtailQ]を
動 作は
← pred[Q.tailQ]を
実 行 す る.
実 行 す る.
と な る. こ こ で 注 意 す る の は,ス 置 がSUCC関
タ ッ ク の 場 合 は,時
間 の 経 過 と と も にア クセ ス の 位
数 の 向 き で(先 頭 か ら 末 尾 へ 向 か う)変 化 し て い っ た の に 対 し,キ ュ
ー の 場 合 は ,関
数predの
キ ュ ー に お い て も,二
向 き で あ る こ と で あ る.双
重 結 合(double
linked)リ
方 向 へ の 変 化 は な い の で,
ス トを 使 う 必 要 は な い が,リ
ス トの 末 尾 か ら 先 頭 の 向 き に リ ン ク 結 合 が 行 わ れ て い な け れ ば な ら な い.こ こ と は,キ ュ ーQ=a1a2…anを
表 現 す る の に,図4・21の
図4・21
の
よ う な リ ン ク構 造 に し
図4・22
な け れ ば な らな い こ と を意 味 して い る. こ の よ う な リ ン ク構 造 の場 合 の 二 つ の操 作 を実 現 す るプ ログ ラム は,図4・22 の よ うに な る.
4.3.5 キ ュー の 応 用 例 あ る 問 屋 で は,製 造 業 者 か ら入 荷 じた 商 品 を倉 庫 に保 管 し,小 売 業 者 に は 倉 庫 に あ る古 い商 品 か ら売 る こ と に して い る.倉 庫 の 入 荷,出
荷の要求 の記録 を
下 記 の よ う な仕 様 で 印 字 す るプ ロ グ ラ ム を作 りた い. そ れ ぞ れ の要 求 は,図4・23(a)の
よ うに,入 荷 の 要 求 に対 して は ‘+'記号
と 5桁 か ら な る製 造 番 号 お よび 個 数 か ら な る レ コー ドが 入 力 され る.こ の 店 で は,入 荷 した製 品 全 部 に 製 造 番 号 の後 ろ に 3桁 の 通 し番 号 を加 え て 製 品 番 号 と し て い る.出 荷 要 求 に 対 して は,‘-'記 号 と小 売 業 者 のID番 列),お
よび個 数 が 入 力 され る.
(a) 入 力 の 例
(b) 出力 の 例
図4・23
号(5 桁 の 文 字
こ れ ら の 要 求 の 記 録 の 出 力 は,図4・23(b)の
よ う に 左 側 に 入 荷 の 記 録,右 側
に 出 荷 の 記 録 を 印 字 す る も の と す る.た
庫 に は1000個
で き,オ
ー バ ー フ ロ ー,ア
だ し,倉
ン ダ ー フ ロ ー は な い も の と して よ い.こ
ュ ー を 用 い た プ ロ グ ラ ム の 例 は 図4・24の
図4・24(そ
よ う に な る.
の 1)
の 商 品 を格 納 の 問題 の キ
図4・24(そ
の 2)
第 4章 練習問題
1.図4・4に
示 さ れ た 配 列 上 の マ ル チ リ ス トの 基 本 操 作 と な る 各 関 数 を プ ロ グ
ラ ム せ よ-
2.式 (1) ax3
+ bx + c
(2)
(3)
を 後 置 表 現 お よ び 前 置 表 現 せ よ.た
だ し,xpはx,p#と
表 し,同
じ優 先 順 位 の
よ う な 配 列 上 の マ ル チ ス タ ッ ク を 用 い る 計 算 で,必
要 と され る ス
演 算 は 左 側 か ら 計 算 す る も の と す る.
3.図4・4の
タ ッ ク の 数 n は 変 わ ら な い も の とす る.n フ ロ ー した と き,そ
個 の ス タ ッ クの 丙 の 一 つ が オ ー バ ー
の ス タ ッ ク だ け を 配 置 し直 し て 対 処 す る よ り も,以
ー バ ー フ ロ ー が な る べ く起 こ ら な い よ う に 配 置 を し直 す ほ う が,効
,す
後 のオ
べ て の ス タ ッ ク を以 下 の 方法 で
率 の よ い こ と が 経 験 的 に わ か っ て い る.
そ の 方 法 は,各
ス タ ッ ク の 後 部 の 使 用 可 能 な 領 域 の 寸 法 を,次
の ように配分
し直 す こ と で あ る 。 (1)全
空 き領 域 の a%は
(2)残
り の(100-a)%は,そ
各 ス タ ッ ク に 均 等 に 分 配 す る. の時 点 での 各 ス タ ックの 長 さ に比例 す る よ う
に 配 分 す る. す な わ ち,全 空 き 領 域 の 寸 法 を S とす る と,i 番 目 の ス タ ッ ク の 長 さ はlists[i]・ T-lists[i]・Hと
な り,こ
の ス タ ッ ク に 配 分 さ れ る利 用 領 域 の 寸 法 は
で 与 え られ る.a の 値 は ス タ ッ ク の 利 用 方 法 に よ っ て 多 少 異 な る が 一 般 に1020%で
あ る.
オ ー バ ー フ ロ ー が 生 じ た と き の 再 配 置 手 順(procedure)を
4.図4・8に
示 さ れ た プ ロ グ ラ ム で,再
プ ロ グ ラ ム せ よ.
帰 的 に プ ログ ラ ム され て い る もの は そ
れ と 同 じ機 能 を 持 つ 繰 返 し的 プ ロ グ ラ ム へ,ま
た,繰
返 し的プ ロ グ ラ ム は 再 帰
的 プ ロ グ ラ ム に 書 き 換 え な さ い.
5.105ペ
ー ジ の キ ュ ー の 応 用 例 で,在
能 で あ る こ と を,ま
た,倉
庫 数 以 上 の 要 求 が あ っ た と きは 出荷 不
庫 の 最 大 収 納 量 が1000と
し て,在
庫量が最大値 を
超 え る入荷 要 求 に対 して 受 け入 れ 不 能 で あ る こ と を印 字 す る よ う にプ ロ グ ラム を 修 正 せ よ.
6.図4・25の
よ う に,線 形 リス トのtailのsuccessorと
し て,headへ
接 続 し て 得 ら れ る リ ス ト を 環 状 リ ス ト(circular list)と
い う .環
ポイ ンタ 状 リス トは
要 素 を 同 じ順 番 で 何 回 も ア ク セ ス す る 場 合 な ど に は 便 利 な デ ー タ 構 造 で あ る . 一方
,危
険 な デ ー タ 構 造 で も あ る.た
と え ば,環
状 の 周 の 長 さ を求 め る の に,
普 通 の 線 形 リ ス トの 長 さ を 求 め る 関 数 を 用 い る と,永
久 ル ー プ に 入 り計 算 が 終
わ ら な い こ と が 生 ず る.
図4・25
環 状 リ ス トの 基 本 的 な 操 作 で あ る 以 下 の こ と を 実 装 せ よ. ■ デ ー タ 読 み 出 し 環 状 リ ス ト L の 指 し て い る セ ル の 内 容 を x に 複 写 し,L を 現 時 点 の セ ル のsuccessorと procedure
す る.
readclist(var
L:clist;var
x:item)
■ デ ー タ の 書 き 込 み 現 時 点 の Lの 指 し て い る セ ル の 前 に 新 しい セ ル を挿 入 し,そ
の 内 容 を x と す る. procedure
writeclist(var
L:clist;x:item)
■ 周 の 長 さ を 求 め る 環 状 リス ト L の 周 の 長 さ を 求 め,整 の 値 を セ ッ トす る. procedure
lengthclist(L:clist;var
length:integer)
数 変 数lengthに
そ
[5] 木
5.1
構
造
木構造のデータ
組 織 化 され た デ ー タ の 多 くに は,構 成 デ ー タ 間 に 階 層構 造 が み られ る.た
と
え ば,全 国 の 市 町 村 の 名 称 を集 め た デ ー タ を考 え て み よ う.こ れ らの 名 前 を た だ で た らめ に並 べ る よ りは,組 織 的 に ま とめ た ほ うが,デ
ー タ と して の 使 い勝
手 は よ い こ とは い う まで もな い.名 前 を ア イ ウ エ オ 順 にす る こ と も一 つ の 方法 で あ る.こ れ は一 次 元 的構 造 を持 つ リス トで表 現 で き る.こ の場 合 は,個
々の
デ ー タ は ど れ も対 等 で あ り,階 層構 造 を な して いな い.一 方,市 町 村 名 を都 道 府 県 ご とに ま とめ,さ
ら に そ の都 道 府 県 名 を地 方 ご とに ま とめ る と い う組織 化
も考 え られ る.こ の 場 合 は,同
じ名 前 と して の デ ー タ で も地 方 名,県
名,市 町
村 名 とい う よ う に分 類 され,地
方 名 は県 名 の 集 ま りを表 し,県 名 は 市 町 村 名 の
集 ま りを表 す よ うに デ ー タ 間 に 包 含 関 係 が あ り,階 層 構 造 が生 ず る. 組 織 化 され た デ ー タ に お い て は,デ
ー タ 間 の 階 層 構 造 と選 択 分 岐 ま た は統 合
と は深 い 関係 に あ る.こ の よ う な デ ー タの 階 層 化 とそ れ らの 処 理 を含 め た抽 象 的 デ ー タ の 型 の 一 つ に 木(tree)構
造 が あ る.
木 構 造 は,各 階 層 に お け るデ ー タ要 素 と,そ れ らの 間 の 階 層 を表 現 す る関 係 と で構 成 され て い る.一 般 的 に,デ ー タ要 素 の 集 ま り と,そ れ らの うえ の 関 係 (2項 関 係)を 表 現 す るデ ー タ構 造 と して,グ
ラ フが あ る.木
もグ ラ フ の 一 種 で
あ る か ら,木
に 関 す る議 論 に は,グ
ラ フ 理論 の 用 語 が 使 わ れ るの が 普 通 で あ る
(グ ラ フ と し て の 木 に つ い て は,5.2節
を 参 照).
木 T は:
T=(V,E) と 表 現 さ れ,V は,頂 点(nodeま
た はvertex)と
り ,E は 弧(edgeま
呼 ば れ,頂
た はarc)と
a と b に 対 し,(a,b)が
点 と 頂 点 と の 対 の 集 合 で あ る.頂 点
E に 含 ま れ て い れ ば,「 点 a の 子 は b で あ る 」,ま た は
簡 単 に,「 a か ら b へ の 弧 が あ る 」 と い う.こ 子 の 関 係 を 導 入 し た 組 織 的 デ ー タ で,厳 (1)基
本:た
呼 ばれ る デ ー タ要 素 の 集 合 で あ
の よ う に 木 は,デ
ー タ要 素 間 に 親
密 に は 次 の よ う に 定 義 さ れ る.
だ 一 つ の 頂 点 か ら な る デ ー タ は 木 で あ る.こ
の と き,こ
だ 一 つ の 頂 点 を構 城 し て い る デ ー タ 要 素 は こ の 木 の 根(root)で (2)帰
納:T1,T2,…,Tnの
え,こ
の 新 し い 頂 点 か ら,そ
r2),…,(rn+1,rn)で 頂 点rn+1は,新 (3)限
定:す
あ る と い う.
そ れ ぞ れ が 木 で あ り,r1,r2,…,rnは
の 木 の 根 で あ る と す る と き,そ
の た
それぞれ
れ ら の ど の 木 に も 含 ま れ な い 頂 点rn+1を れ ぞ れ の 木 の 根 へ 向 か う 弧(rn+1,r1)
加
,(rn+1,
結 ん で 一 つ に ま と め た デ ー タ も ま た 木 で あ る.ま
た,
し く作 ら れ た 木 の 根 と な る. べ て の 木 は 上 の(1)を
も と に,(2)を
有 限 回適 用 して 得 ら
れ る も の に 限 る. こ の 定 義 の 方 法 は,一
見 した と こ ろ 正 し く木 を 定 義 し て い る の か ど う か と疑
い を 持 つ か も知 れ な い が,よ
く考 え る と非 常 に う ま い 定 義 法*で あ る こ と が わ
* こ の よ うな 定 義 法 は,帰 納 的 定 義 法 と呼 ば れ,基 的 帰 納 法 に 似 て,基
本,帰
され た もの が 存 在 す れ ば,新
定 の 3部 か ら成 る.こ れ は数 学
の よ うに して,上
し,す で に定 義
しい 対 象 が作 れ る こ とを示 して い る.こ の 仮 定 は,基 本 部 で す で に
定 義 さ れ た 対 象 の あ る こ との 保 証 が 得 られ て い るの で,次 る.こ
納,限
本 で もっ と も基 本 的 な定 義 対 象 を定 め て い る.帰 納 で は,も
々 と新 しい 対 象 を定 義 す る こ とが で き
限 の な い個 数 の 対 象 物 の 集 合 を定 義 で きる.(3)の
限 定 は,(1)と(2)
が 十 分 条 件 を 述 べ て い るの に対 し,こ の 二 つ の 条 件 を満 た さ な い もの の 存 在 を否 定 す る こ とに よ って 必 要 十 分 と して い る. 限 定 につ い て の わ か りや す い 例 をあ げ れ ば,「 犬 は ほ 乳 類 で あ る」 「猫 は ほ 乳 類 で あ る」 … … な どの 記 述 だ け で は,た
と えほ 乳 類 に含 まれ るす べ ての 動 物 に 対 して記 述 した と して も,ほ 乳 類
の 定 義 と して は 不 備 な 点 が 残 る.鶏 が ほ乳 類 か ど うか 判 定 で き な い か ら で あ る.最 後 に,「 こ れ で す べ て で ほ か に は あ りませ ん 」 と い う保 証 が な け れ ば な ら な い.
帰納 的 に実 行 さ れ るプ ログ ラム を帰 納 的 プ ロ グ ラム,ま
た は再 帰 的 プ ロ グ ラム と い う.
か る. また,図
式 で 表 現 され た 木 は,そ の 名 前 の 由 来 を示 す と と もに,直 感 的 な デ
ー タ の構 造 の 理 解 を助 け るの で ,広
く利 用 さ れ て い る.図 式 で 木 を表 現 す る に
は,頂 点 を 点 で,頂 点 間 を関 係 づ け る弧 は頂 点 を表 す 点 の 間 の 線 で 表 現 す る. 例 と して,
な る 木 を 図 式 で 表 現 す る と,図5・1(a)の
よ う に な る.こ の 木 の 根 は,頂 点 a で
あ る. ま た,T が 木 で あ る こ と を 定 義 に し た が っ て 示 す に は,図5・1(a)で 図 式 が 木 で あ る た め に は,(2)よ と に な る.頂
り図5・1(b)の
点 b だ け か ら な る 図 式 は(1)よ
も う 一 方 の 頂 点c,d,e,fか
式 は
1)に
よ り,木 で あ り,頂 点d,fか
ら な る 図 式 が 木 で あ る こ と か ら,木
(a)
2つ の 図 式 が 木 で あ れ ば よ い こ り,木
で あ る こ と が 保 証 さ れ る.
らな る 図 式 は,図5・1(c)の
こ と が わ か れ ば 木 で あ る こ と が(2)に
示 され た
2つ の 図 式 が 木 で あ る
よ り保 証 さ れ る.頂 点 e だ け か ら な る 図 ら な る 図 式 は 図5・1(d)の
頂 点 fだ け か
で あ る こ と が 確 か め られ る.
(b)
(c)
(d)
(e)
図5・1
図5・1(a)∼(d)の
図 式 表 現 は,木 の 根 が 下 に あ り,上 へ と伸 び て ゆ く の で,
植 物 の 木 と の 連 想 が あ る.し は,図5・1(e)の
か し,計
算 機 科 学 に お け るデ ー タ構 造 と して の木
よ う に 上 下 を 逆 に し て 描 か れ る の が 普 通 で あ る.そ れ は,木 構
造 の 根 に 近 い ほ う が 上 位 の 階 層 に あ る こ と か ら,図
で も上 位 に 置 く こ と に し て
い る もの と 思 わ れ る . リ ス トの 場 合 と 同 じ よ う に,木
で も頂 点 の 間 の 関 係 を 表 す 関 数 を 二 つ 導 入 し
よ う.頂 点 aの 親 をparent(a),頂
点 aの 子 供 の 集 合 をchildren(a)で
表 すこ と
に す る. 図5・1の
木 で は, parent(a)=φ,parent(b)=a,parent(c)=a,
parent(d)=c,parent(e)=c,parent(f)=d また children(a)={b,c},children(b)=φ,children(c)={d,e}, children(d)={f},children(e)=φ,children(f)=φ
と な る. こ の 例 か ら も わ か る よ う に,根
で あ る頂 点 は 親 を 持 た な い し,そ
て の 頂 点 は 根 の 子 孫 と な っ て い る.逆 供 を持 っ て い な い.こ に は,根
に,頂
点b,e,fは
の よ う な 頂 点 は,葉(leaf)と
は た だ 一 つ しか な く,葉
の木のすべ
親 を 持 っ て い る が,子
呼 ば れ て い る.空
で あ る 頂 点 に は 制 限 が な い が,必
で な い木
ず一つ以上
は あ る こ と が 容 易 に わ か る. こ こ で 幾 つ か の 木 に 関 す る 用 語 に つ い て 説 明 して お こ う. ■ 部 分 木(subtree)あ
る 木 の 頂 点 v に 対 し,children(v)に
を 根 と す る 木 を v の 部 分 木 と い う.図5・1の 点 と す る 木({d,f},{(d,f)})と ■ 深 さ(level)木
例 で は,頂 点 c の 部 分 木 は d を 頂
e を 根 と す る 木({e},φ)の
の 頂 点 の 深 さ は,次
二 つ で あ る.
の よ うに 定 義 され る.
(1)木
の 根 で あ る 頂 点 の 深 さ は 0で あ る.
(2)あ
る 頂 点 の 深 さ が k で あ る と き,そ
はk+1で
含 まれ る頂 点
の 頂 点 を子 供 で あ る頂 点 の深 さ
あ る.
ま た,木 の 深 さ は そ の 木 に 含 ま れ る 頂 点 の 深 さ の 最 大 値 で 与 え ら れ る. 図5.1で
頂 点 d の 深 さ は 2,こ
■ 順 序 木(ordered
tree)一
の 木 の 深 さ は 3 と な っ て い る.
般 的 な 木 の 定 義 で は,頂 点 vの 子 供children(v)
は 集 合 で 与 え ら れ た.し
か し,子
(v)は
供 の 順 列 で 定 義 す る.こ
集 合 で は な く,子
図5・2(a)(b)の tree)で
は,二
供 達 の 間 の 順 序 を 問 題 に す る と き はchildren
木 で,children(a)={b,c,d}と
の よ う な 木 を順 序 木 と い う. 考 え る非 順 序 木(un-ordered
つ の 木 は 同 等 と な る. 順 序 木 と 考 え る と,図(a)の
children(a)=(b,c,d),図(b)の (b,c,d)≠(d,c,b)と
木 で はchildren(a)=(d,c,b)と
木 で は, な る の で,
な り 異 な る 木 と な る.
わ れ わ れ が デ ー タ 構 造 と して 扱 う 木 は,順 序 木 の 場 合 が ほ と ん ど で あ る の で, 今 後 特 に 非 順 序 木 で あ る こ と の 指 定 が な い 限 り順 序 木 で あ る と し て お こ う.
(a)
(b)
(d)
(c)
図5・2
■ n-分 木(n-ary
tree)順
n 個 の 部 分 木(空
部 分 木 を 許 す)を
図5・2(c),(d)を え る と,図(c)の
序 木 の 特 別 な 場 合 と して,お の お の の 頂 点 が 常 に 持 つ と き,こ
の 木 を n-分木 と い う.
順 序 木 と す る と互 い に 同 等 で あ るが,そ れ ぞ れ 3-分 木 と考 木 に お い て はchildren(a)=(b,ε,c),図(d)の
木 に おいて は
children(a)=(ε,b,c)で
あ る か ら,こ の 二 つ の 木 は 同 等 で は な い.た
だ し,
εは 空 木 を 表 す も の と す る. ま た,n-分
木 の う ち で,葉
で な い 頂 点 は す べ て 空 で な い 部 分 木 を 持 ち,ま
た
葉 で あ る ど の 頂 点 も深 さ の 差 が 高 々 1以 下 で あ る よ う な 木 を 平 衡 木(ballanced tree)と
い う.
■ 先 祖(ancestor)と た 親,…
子 孫(decendant)あ
… を 総 称 し て 先 祖 と い う.逆
頂 点 を み た 場 合 を 子 孫 を い う.根 の 先 祖 で あ り,葉
5.2
る 頂 点 の 親,そ に,あ
の ま た 親,そ
の ま
る頂 点 の先 祖 で あ る頂 点 か らそ の
で あ る頂 点 は 自分 自 身 を 除 い て す べ て の 頂 点
は 子 孫 を 持 た な い 頂 点 で あ る と い え る.
グラフ構造としての木構造
こ の節 で は,木 が グ ラ フ構 造 の 特 殊 な例 で あ る との視 点 か ら,少
し解 説 を加
え るこ とに す る.グ ラ フ に関 す る デ ー タ構 造 や アル ゴ リズ ム は,多 岐 に わ た り 研 究 さ れ て い る.こ の こ とは,グ
ラ フ構 造 が 高 度 に抽 象 化 され た デ ー タ構 造 で
あ る こ と を示 す もの で あ るが,こ
こ で 扱 う に は あ ま りに も多 くの 内 容 が あ りす
ぎ る.グ ラ フ の ア ル ゴ リズ ム は,そ れ だ け で 本 書 よ り も大 部 な本 に な っ て い る ほ ど で あ る. こ こで は,グ ラ フ と しての 木 構 造 の よ く知 られ て い る事 柄 や 計 算機 科 学 に深 く関 わ っ て い る木 構 造 の 性 質 に つ い て,ご
く簡 単 に紹 介 す る に と どめ る の で,
さ ら に深 くま た は 広 くグ ラ フ一 般 に関 す る事 柄 に興 味 の あ る読 者 は,他 の 書 籍 を参 照 して も らい た い. グ ラ フ は,前 節 の木 と同 じ よ う に,頂 点 の集 合 V と項 点 間 の関 係 を表 現 す る 弧 の 集 合 E とで, G=(V,E) と 定 義 さ れ る. 二 つ の 頂 点a,bに た は,弧(a,b)が
対 し,弧(a,b)と
弧(b,a)は
同 じ意 味 に 解 釈 さ れ る と き,ま
存 在 す る と き は,い つ で も 弧(b,a)も
存 在 す る こ とか ら,弧(a,
b)と
弧(b,a)は,一
graph)と
つ の 弧 と 考 え られ る よ う な グ ラ フ を 無 向 グ ラ フ(undirected
い い,そ
う で な い と き は,有
ま た,二 つ の 項 点a,bに a1=a,an=b)は
向 グ ラ フ(directed
graph)*と
対 し,弧 の 列(a1,a2)(a2,a3)…(an-1,an)(た
a か ら bへ の 道(path)と
■ 無 向 木(undirected が 存 在 し,ま
ラ フ と し て 見 た と き に 有 向 で あ る か,無
ラ フ に 含 ま れ る 任 意 の 2 点 間 に は,必
た そ の 道 は た だ 一 つ しか な い と き,こ graph)グ
ず道
の グ ラ フ は 木 と 呼 ば れ る.
ラ フ の 頂 点 の 中 に 特 殊 な 1頂 点(根)が
そ の 頂 点 か ら そ の 他 の 任 意 の 頂 点 へ の 道 が 必 ず 存 在 し,そ な い と き,こ
さ が 2以 上
な っ た 定 義 が さ れ る. tree)グ
■ 有 向 木(directed
い い,長
い う.
グ ラ フ の 特 殊 な 場 合 で あ る 木 は,グ 向 で あ る か に よ っ て,異
だ し,
い う.道 に 含 まれ る 弧 の 数 を道 の 長 さ と
い う .始 点 と 終 点 の 頂 点 が 等 し い 長 さ 1の 道 を 環(loop)と の 場 合 は 環 路(cycle)と
い う.
あ り,
の 道 は た だ 一 つ しか
の グ ラ フ は 木 と呼 ば れ る.
【 例 】
四 つ の 都 市A,B,C,Dの
間 に は,A-C間,B-C間,C-D間
い る.こ の 状 況 を モ デ ル 化 し て,図5・3(a)の
に道 路 が ひ か れ て
よ う な グ ラ フ を 考 え よ う.こ の グ
ラ フ は,無 向 グ ラ フ と し た ほ うが 妥 当 で あ ろ う .な ぜ な ら ば,A-C間 す な わ ちC-A間
の 道 路 で も あ る か ら で あ る .こ
の道 路 は
の グ ラ フ は,
と表 現 され る無 向 木 で あ る. 次 に,行 列
を 考 え よ う.こ
の 行 列 は,行
* 数学 的 に は,弧
列,行
ベ ク トル,行
列 要 素 ス カ ラ と分 類 さ れ て お
の 集 合 は頂 点 V上 の 二 項 関係 Eで あ り,こ の 関 係 Eが .
す な わ ち 対 称 律 を満 たす と きは,無
向 グ ラ フ とな り,満 た さな い と き は,有
向 グ ラ フ とな る.
(b)
(a)
図5・3
り,そ れ らを グ ラ フ の頂 点,そ れ らの 間 の 関係 を弧 で表 せ ば 図5・3(b)の
よ うに
な る.こ の グ ラ フ は木 を成 し,そ の 木 は有 向 木 で あ る と考 え るの が 妥 当 で あ る. グ ラ フ と して の 木(無 向 木)は,い
ろ い ろ に定 義 で き る.以 下 の 定 義 は,い
ず れ も同 等 で あ る.そ れ ぞ れ,異 な った 視 点 か らの木 の性 質 を よ く表 して い る. (1)グ
ラ フの 中の 任 意 の 2頂 点 間 に は 必 ず 道 が存 在 す る と き,そ の グ ラ フ
は連 結 して い る とい わ れ る.頂 点 の 数 と弧 の 数 を それ ぞ れp,qと p=q+1が (2)あ
す る とき,
成 り立 つ 連 結 グ ラ フ は木 で あ る. る頂 点 か ら同 じ弧 を通 らず に 元 の 頂 点 へ 戻 る道 が あ る と き,こ の グ
ラ フ を環 路(cyclic)グ
ラ フ と い う.環 路 の な い グ ラ フで,p=q+1が
成
り立 つ グ ラ フは 木 で あ る. (3)環
路 の な い グ ラ フ で 任 意 の 2頂 点 間 を 弧 で 結 ん だ と き,必 ず 環 路 が で
きて し ま うグ ラ フ は木 で あ る. 特 に,有 向 木 にだ け注 目 して,こ 手法,た
とえ ば デ ー タ検 索,数
語 の 処 理 な ど には,ス
の 章 を設 け た理 由 は,数
多 くの計 算 処 理 の
式 な どの表 現 法 とそ の 数値 化 処 理,計
算機 用 言
タ ック と組 み 合 わせ た木 構 造 が 非 常 に 多 く登 場 し,そ の
威 力 を発 揮 して い る.こ の こ とは 偶 然 の一 致 で は な く,計 算機 言 語 や 計 算 の 理 論 と呼 ば れ る分 野 にお い て 理 論 的 に説 明 され て い るが,こ 味 の あ る 人 は計 算 の 理 論
*
た と え ば,UllmanとHopcroft共 な ど.
こ で は触 れ な い.興
オ ー トマ トン理 論 の 分 野 の 入 門 書*を 参 照 さ れ た い.
著(野 崎,木
村
他 訳)"言
語 と オ ー トマ ト ン",サ
イ エ ンス 社
5.3
木構 造の 操作
一 般 的 に 木 構 造 デ ー タ の 処 理 は,頂 対 し て 行 わ れ る.そ が,各
点 の 部 分 に 格納 され て い るデ ー タ要 素 に
の 処 理 の 種 類 は,多
岐 に わ た って い るの で 特 定 は で き な い
頂 点 に 対 し て 順 に 処 理 を 施 す と い う 場 合 が しば し ば 生 ず る.こ の 順 序 は,
当 然,木
の 構 造 に 関 係 し て 定 め ら れ る で あ ろ う.こ
す る と,次
の 順 序 に関 す る 手 順 を大 別
の 3種 に な る.
こ れ ら は 木 の 走 査(traversing)と だ け で は な く,あ
呼 ば れ て い て,木
る 条 件 を満 た す ま で,項
全 体 に わ た る処 理 の 場 合
点 を 順 次 処 理 す る よ う な 場 合 で も,
こ の 3種 の 走 査 法 の い ず れ か の 応 用 と な っ て い る. 木 の 走 査 処 理 に お い て は,頂 点 V に 適 用 さ れ る 処 理 をF(V)で T の 走 査 方 法 は,次
表 現 す る と,木
の よ う に な る.
■ 先 行 順 走 査(preorder
traversing)ま
ず,最
を 適 用 し,次 に rの 部 分 木 を 左 か らT1,T2,…,Tnの
初 に T の 根 rに 対 し,F(r) 順 に 処 理 し,こ の 木 の 走 査 を
終 了 す る. ■ 中 間 順 走 査(inorder
traversing)ま
と も左 に 位 置 す る 部 分 木T1を て か らT2,T3,…Tnの
Tnを
処 理 して か ら,次 に T の 根 rに 戻 りF(r)を
順 に 処 理 を し,こ
■ 後 行 順 走 査(postorder
ず 最 初 に T の 根 の 部 分 木 の 内 で もっ 実行 し
の 木 の 走 査 を 終 了 す る.
traversing)最
初 は T の 根 rを通 過 してT1,T2,…,
こ の 順 番 で 処 理 した 後,r に 戻 っ てF(r)を
適 用 して この 木 の 走 査 を終 了 す
る. こ の 走 査 方 法 は 帰 納 的 に 記 述 さ れ て い る の で,実 み よ う.図5・4の か.先
木 に お い て,関
行 順 走 査 の 場 合 は,ま
す る,そ の 次 に,b
の 次 に は,ま
数 Fが どの よ うな 順 番 で適 用 され る で あ ろ う
ず こ の木 の 根 で あ る頂 点 a に対 して 関 数 F を適 用
ず 左 端 の 部 分 木 の 根 で あ る b に 対 して F を 適 用 す る.そ
の 左 端 の 部 分 木,つ
同 様 に し てd,jの
例 で そ の 動 き を再 確 認 し て
ま り,d
を 根 と す る木 を 先 行 順 走 査 す る.
順 で F を 適 用 し,次 に d の 2番 目 の 部 分 木 でe,f,lの
順 で処
図5・4
理 さ れ,b
を 根 と す る 部 分 木 の 走 査 が 終 了 す る.次
に,a
の 2番 目 の 部 分 木 と
し て c を 根 と す る木 の 走 査 がc,g,m,r,s,n,h,i,o,p,t,qの 木 の 先 行 順 走 査 を 終 わ る.そ
順 で 処 理 さ れ,こ の
の 他 の 走 査 順 に 対 し て も 同 様 で あ る.3
種 の走 査
で F が 適 用 さ れ る 順 番 を 示 す と, 先 行 順 走 査:abdjkeflcgmrsnhioptq 中 間 順 走 査:jdkbeflarmsgnchoiptq 後 行 順 走 査:jkdelfbrsmnghotpqica と な る.
【例 1】
先行順 走査の応用
与 え ら れ た 単 語 x が,Pascalで に,予
約 語 を 図5・5の
使 用 され る予 約 語 で あ るか 否 か を調 べ るた め
よ う に 木 構 造 で 表 現 し た と き,与
す る 対 象 で あ る 木 の 根 r を 引 数 と して,x そ う で な い と き に はfalseを
え ら れ た 単 語 x と探 索
が 予 約 語 で あ っ た と き に はtrueを,
値 とす る 関 数word_matchingは,図5・6の
よ うに
プ ロ グ ラ ム さ れ る. こ の プ ロ グ ラ ム 中 でget_1_subtree,get_r_subtreeは,引 右 部 分 木 の 根 を値 と す る 関 数 で あ り,null_treeは た,頂
数 rの 左 部 分 木, 空 木 を 表 す もの とす る .ま
点 の デ ー タ 構 造 は い くつ か の フ ィ ー ル ドか ら な る レ コ ー ドで,頂
予 約 語 は r ↑.reservedwordで
ア ク セ ス で き る も の と す る.
点 rの
図5・5
図5・6
この例 で は,頂 点 に対 す る処 理(予 約 語 を比 較 す る こ と)は,比 とな っ た 時 点 で 走 査 を停 止 す るが,そ また,こ の 例 の 場 合,同
較 結 果 がyes
れ まで は 先 行 順 の走 査 を して い る.
じ頂 点 に 対 す る関 数 で,中 間 順 走 査 法 ま た は後 行順
走 査法 を適 用 して も正 しい解 答 を得 るプ ロ グ ラ ム と な る.し か しな が ら,こ の 問 題 に関 して は三 つ の 探 索 法 の う ちで 先 行 順 走 査 法 が もっ と も効 率 が よい.た だ し,後 で 学 ぶ 2分探 索 法 の よ う に,木 の 構 造 を工 夫 す る こ とに よ り,さ らに 効 率 の よい 方 法 も考 え られ て い る.
中間 順走査の応用
【例 2】
図5・7(a)に
示 した よ うな迷 路 が あ る.こ の 種 の 迷 路 は環 状 の通 路 が な く,あ
る地 点 で の 分 岐 路 は最 大 2で あ る もの とす る と,図5・7(b)の 口 を根,袋
小 路 と出 口 を葉,分
よ うに,迷 路 は 入
岐 点 を内 部 頂 点 とす る木 構 造 で 表 現 す るこ とが
で き る.
(b)
(a)
図5・7
この よ う な迷 路 の 入 口か ら入 って 出 口へ と 出 る確 実 な 方 法 と して は,ど ち ら か の 手 を壁 に つ け な が ら歩 い て 行 く と,い ら れ て い る.図5・7(a)に
は,右
つ か は 出 口へ と到 達 で きる こ とが 知
手 を 壁 に つ け な が ら歩 い た 軌 跡 が 示 さ れ て い
る.
この 種 の 迷 路 が 与 え られ た と き,上 に 述べ た 方 法 で 出 口 まで 到 達 す る過 程 を 模 倣 す るプ ロ グ ラ ム は 中間 順走 査法 を応 用 して 図5・8の
よう に書 くこ とが で き
る.こ の プ ログ ラ ム で は,出 口 を求 め て迷 路 の 中 を歩 くさ ま を模 倣 す るだ けで, 正 しい通 路 を 求 め て 出 力 す る もの で は な い.
図5・8
この プ ロ グ ラ ム で の 中 間 順 走 査 法 で の頂 点 に対 す る処 理 関 数 Fは,訪 れ た 頂 点 が 出 口で あ るか い な か を検 証 す る こ とで あ る. 走 査 の 途 中 で解 が 得 られ る よ う な問 題 に 対 し,再 帰 的 プ ロ グ ラ ム で は Fが 何 回 か 再 帰 的 に呼 ば れ た とこ ろ で,求 め る解 答 が 得 られ た と して も,正 常 に終 了 す る ため に は,も
との 最 上 位 の 関 数 ま で戻 る こ とが 必 要 で あ る.前 の 例 で は,
解 が 得 られ た 後 に 残 りの 木 の走 査 は しな い もの の,深 い レベ ル で 得 られ たtrue と い う値 を トップ レベ ル の 関数 まで 受 け継 い で,最 終 的 に は トップ レベ ル の 関 数 の 値 と して 計 算 され な け れ ば な らな い. この プ ログ ラ ム例 で は,再 帰 的 プ ログ ラ ミン グ を 用 い て い な い の で,結 果 の 判 明 した時 点,す
な わ ち出 口の 見 つ か っ た と こ ろ で即 座 に 計 算 を停 止 で き る.
しか しな が ら,再 帰 的 プ ロ グ ラム で は,各 関 数 呼 び 出 し レベ ル で の 計 算 位 置, デ ー タ が 計 算 シス テ ム 内 の ス タ ッ ク に保 存 され て い る の で,も 戻 る こ とが で き るが,こ
との 計 算 環 境 に
の プ ロ グ ラ ム で は 自分 の 中 に ス タ ッ ク を用 意 し,上 の
レベ ル の環 境 が 復 元 で きる よ うに,根 か ら現 時 点 まで の 履 歴 を保 存 す るこ とが 必 要 に な る. 【 例 3】
後 行順走 査の応 用
数 式20-30×((50/25)+(100/4))図5・9(a)の
ように 木 構 造 で 表 現 さ れ る.
(a)
(c)
(b)
(d)
図5・9
(e)
(f)
こ の よ う に,木 の 葉 に 当 た る頂 点 に は 整 数 値 が,そ の 他 の 内部 頂 点 に は 演 算 記 号 が 格 納 され て い る木 が 与 え られ て,そ の 数 式 の値 を計 算 す る と い う 問題 で あ る.後 行 順 走 査 を適 用 す れ ば,図5・9(b)か
ら(f)の 順 に それ ぞ れ の数 式 の 部 分
の 値 が 求 め られ て,最 後 の根 に格 納 され て い る値 が 求 め る解 答 と な っ て い る.
木構 造の 実 装
5.4
木 構 造 の 実 装 も,線 形 リス ト と同 じよ う に,配 列構 造 に よ る もの,リ
ン ク構
造 に よ る もの,ま た は,そ の 両 者 の 組 合 せ に よ る もの な ど,非 常 に 多 くの 実 装 の 方法 が 考 え られ て い る. 配列 を用 い た 木構 造 の 実 装 は,走 査 の 容 易 さ よ り も記 憶 領 域 の 節 約 を 目 的 と す る場 合 が 多 い.リ
ン ク構 造 に よ る実 装 は,処 理 途 中 で木 の構 造 が 変 化 して 行
く よ う な場 合 とか,各 頂 点 の 子 供 の 数 が 不 定 数 で あ る と き に利 用 され る.
5.4.1
一般 的木の実装
一般 的 な 木 の 実 装 で 問題 とな るの は,各 頂 点 か ら子 供 の 頂 点 へ の 分 岐 数 が 定 ま っ て い な い こ とで あ る.以 下 の 実 装例 で は,こ の よ う な 問題 を どの よ う に解 決 して い る か注 意 して い た だ き た い. 【実 装 1】 この 実 装 法 は配 列 を 用 い て い る.木 は 頂 点 を表 現 す る レコ ー ドの 配 列 で; type node_range=1..maxnode; node=record inf:content; parent:node_range end;
tree=array[node_range]of
node:
の よ うに 表 現 さ れ る.各 項 点 を表 現 す る配 列 要 素 は,頂 点 に付 随 した 情 報 を 格 納 す るフ ィー ル ドinfと そ の頂 点 の 親 を表 す 配 列 要 素 の 添 字 を格 納 す る た め の フ ィール ドparentと また,同
の 二 つ の フ ィー ル ドか ら成 る レ コー ドで 表 現 さ れ て い る.
じ親 を持 つ頂 点 ど う しで は,そ の 頂 点 の 格 納 位 置 を示 す添 字 が 小 さい
ほ ど左 に 位 置 す る もの とす る.図5・10(a)に
示 され た木 は,こ の 実 装法 で は 同
図(b)の よ うに な る.
(a)
(c)
(b)
図5・10
木 の 処 理 に お い て,ほ 査 に対 して は,弧
とん どの 場 合 が根 か ら葉(親
か ら子 供)の
方向への走
の情 報 を用 い る が,逆 方 向 の 走 査 に 対 して は,後
に述 べ る よ
う に ス タ ッ ク な どの 木構 造 とは別 の デ ー タ構 造 を利 用 して,子 供 方 向 か ら親 の 方 向 の 頂 点 の 巡 回 が 行 わ れ るの が普 通 で あ る.一 般 的 に弧 の 情 報 は 親 の 頂 点 の レ コー ドに格 納 して あ るの が 普 通 で あ るが,こ
の場 合 は 一 つ の 親 頂 点 につ なが
る子 供 は 不 定 個 あ るの で レコ ー ドの 寸法 も一 定 とは な らな い. しか しな が ら,図5・10(b)の
実 装法 にお い て は,各 頂 点 が 唯 一 の 親 を持 つ こ
と を利 用 して,子 供 か ら親 方 向の 弧 の 表 現 をす る こ と に よ っ て頂 点 の レ コー ド 長 を一 定 に で き,実 装 が 容 易 に な る.そ の 代 わ り,操 作 性 は非 常 に 悪 くな る こ と に な る. 【実 装 2】
この 実 装 法 は,配 列構 造 と リ ン ク構 造 の 組 合 せ に よ って い る.配 列 の 構 造 自 身 は,実 装 1と大 差 な いが 頂 点 の レ コー ドのchildrenの
フ ィー ル ドは その 頂
点 の 子 供 を左 か ら順 に結 合 した リス トへ の ポ イ ン タ に な っ て い る.こ
うす る こ
と に よ り,弧 の 表 現 が 親 か ら子供 の 方 向 に な る の で,前 の 実 装法 と比 較 す る と 構 造 的 に は 複 雑 とな っ て い るが,操 作 性 は大 分 改 善 され る.
図5・10(a)の
木 を こ の 実 装 法 で 表 現 す る と 同 図(c)の
よ う に な る.
【実 装 3 】
リ ン ク構 造 を用 い た木 の 実 装 法 は,直 感 的 で は あ るが,や
は り,不 定個 数 の
子 供 の 表 現 に は 工 夫 が 必要 で あ る. 以 下 の 例 で は,実 装 2 と同 じ よ うに,各 頂 点 に 子 供 の リス トを持 つ よ うに し て い る.デ ー タ の構 造 は,
で あ り,図5・11は こ の 場 合,木
図5・10(a)の
木 を,こ の 実 装 方 法 で 表 現 した もの で あ る.
は そ の 根 へ の ポ イ ン タ で 表 現 さ れ て い る.
図5・11
5.4.2
n-分 木 の 実 装
n-分木 と一 般 の 木 との 実 装上 の相 違 は,各 頂 点 の 持 つ 部 分 木 の 数 が n以 下 で あ る こ とか ら,頂 点 を表 す レ コー ド内 に そ の 頂 点 の 子供 の デ ー タ を含 め て も固 定 長 に す る こ とが で きる こ とで あ る.こ の 相 違 は,実 装 の 簡 易 化 に大 き く貢 献 す る.配 列 を 用 い た 実 装 は; type
node_range=1..maxnode; node=record inf:content; subtree1,subtree2,…,subtree_n:node_range
end;
な る構 造 で 表 現 され る.た だ し,木 の 根 は最 初 の 添 字 の頂 点 で あ る と して お く. また,リ
ン ク構 造 に よ る実 装 は;
type tree=↑node;
node=record inf:content; subtree1,subtree2,…,subtree_n:tree
end; と表 現 さ れ る.
配 列 お よ び リン ク構 造 を用 い た 実 装 は,各 頂 点 か らの 分 岐 数 が 固 定 され た こ と に よ り,一 般 的 な木 の 実 装 よ り も簡 易 化 さ れ て は い るが,考
え方 は ま っ た く
同 じで あ る こ とが わ か る. ま た,配 列 を利 用 した 実 装 で は,他 の構 造 の 実 装 の と き と同 じ よ う に,要 素 す なわ ち木 の 場 合 は頂 点 が 動 的 に 除 去,挿
入 され る よ う な操 作 で は 効 率 が 悪 く
な る こ とは,容 易 に想 像 で き よ う.図5・12(a)の ぞ れ 同 図(b),(c)の
よ う に実 装 さ れ る.
3分 木 は,上 の構 造 で,そ れ
(a)
(b)
(c)
図5・12
5.4.3
配 列 を 用 い た平 衡 n-分 木 の 実 装
深 さ p の 平 衡 n-分 木 に 対 し,根(深 n+1.深 考 え る.i
さ 0)に 1,深 さ 1の 頂 点 の 左 か ら2,3,…,
さ 2 の 頂 点 も 同 様 に,n+2,…,n2+n+1と と 番 号 づ け ら れ た 頂 点 の 深 さ k と,そ
j番 目 と す る と k は;
を 満 た す k で 与 え ら れ,j
は;
番 号 づ け を した 場 合 を の 深 さ の 頂 点 を左 か ら数 え て
j=i-(nk-1)/(n-1) と して 得 ら れ る.こ の と き,頂 点 iの 子 供 で も っ と も左 に あ る 頂 点 はk+1の さ で 左 か ら 数 え てn(j-1)+1番
深
目 に あ る こ と に な る.こ の こ とか ら,頂 点 iの
子 供 の 頂 点 は 左 か ら 順 に;
と番 号 付 け られ る こ と に な る(第 5章 練 習 問題 6参 照).ゆ え に,平 衡 n-分木 で は,頂 点 に上 述 の よ うな 番 号 づ け をす る こ とを 定 め て お けば,頂 点 の 番 号 を知 るこ と に よ っ て計 算 で そ の 子 供 の番 号 を求 め る こ とが で き る. こ の場 合 の 実 装 は,n
と木 の 深 さの値 さ え決 まれ ば,各 頂 点 の 情 報 を配 列 の
その 頂 点 に 与 え られ た 番 号 の 位 置 に格 納 す るだ け で,弧 の情 報 は な くと もよ い こ とに な る. ま た,図5・5の
よ うに最 大 の 深 さ の頂 点 をす べ て左 に 寄せ て配 置 す る こ とが
で きれ ば,配 列 は頂 点 の個 数 だ け用 意 す れ ば よ く,さ ら に記 憶 領 域 の 効 率 的 利 用 が で き る. こ こ に紹 介 した 実 装 方 法 は,原 理 的 に は,n-分 木 に一 般 に 共 通 して 適 用 で き るが,平 衡 した 木 で な い場 合 は,記 憶 領 域 の む だ 使 い とな るの で,平 衡 性の 悪 い n-分木 の 場 合 に使 用 さ れ る こ と は ほ とん どな い.
図5・13
例 と し て,図5・5の う.Pascalの
深 さ 5の 平 衡 2分 木 を こ の 方 法 で 実 装 す る こ と を 考 え よ
予 約 語 は35個
tree=array
あ り,そ
れ ぞ れ10文
字 以 内 で あ る か ら;
[1..35] of
packed array [1..10] of char; な る 配 列 に 図5・13の
よ う に 実 装 で き る.こ の 木 のelseを
部 分 木 の 根 は,弧
の 情 報 が な く て も,elseの
2・9+1=19か
らT[19]のnilを
5.5
格 納 して い る頂 点 の 右
頂 点 の 添 字 が 9 で あ る こ と か ら,
持 つ 頂 点 と 知 る こ と が で き る.
木の操作の実装
木 構 造 デ ー タ に対 す る操 作 は,そ の 処 理 の 目的 が 多 岐 に わ た っ て い るが,そ れ らを総 合 す る と,先 行 順 処 理,中
間 順 処 理,後
行 順 処 理 の どれ か,ま
た は,
そ の 変 形 と して 分 類 で き る こ とは 前 に述 べ た.こ れ らの操 作 は,次 に 示 した 3 種 の 関 数 の 組 合 せ で表 現 で き る; (1)F(x):頂
点 x 内 の 情 報 に 対 す る 処 理.
(2)next_subtree(x):頂
点 x の 部 分 木 の 内 で,未 処 理 の もの を 与 え る.
(3)parent(x):頂 F(x)の
点 x の 親 頂 点 を 与 え る.
実 装 は,木 が 何 を 表 現 して い る か,ど の よ う な 処 理 を し よ う と して い
る か に よ っ て,千 差 万 別 で あ る.こ
こ で は,た だ 抽 象 的 にF(x)と
な 実 装 に つ い て は議 論 し な い が,F(x)の
し て,具 体 的
値 は 頂 点 x を 処 理 した 後 の 頂 点 の 値 で,
x と 同 じ型 を 待 つ も の と す る. next_subtree(x)の
値 は 部 分 木 の 根 で あ り,x と 同 じ型 で あ る.x の 未 処 理
の 部 分 木 が な い 場 合 は,定 が 複 数 の 場 合 に,ど
数 木null_tree(空
れ を 値 と し て 取 る か は,特
の 未 処 理 部 分 木 の 内 で,も
(1)頂
に,こ
処 理の 部分木
と わ りの な い 場 合 は,x
っ と も 左 に 位 置 す る も の と し て お く.
関 数next_subtreeとparentは,そ が で き る け れ ど,実
木)を 値 と す る.未
れ ら の 機 能 上 か ら は,明 確 に 区 別 す る こ と
装 に 関 して は,多
点 x の 部 分 木 の 内 で,ど
く機 能 を 共 有 し て い る.そ
れ が 処 理 済 み で,ど
の 理 由 は,
れが未処理 で あるか を
どの よ うに して知 る か? (2)一
般 の 木 構 造 で は,任 意 の 頂 点 の 子 供 は簡 単 に求 め られ るが,子 供 か
ら親 を求 め る こ とは,容 易 で は な い. の 2点 の 問 題 に 対 す る解 決 方 法 に 多 くの 類 似 点 が あ る か らで あ る. こ れ らの 問題 の 解 決 方法 の 一 つ は,木 構 造 自身 に これ らの情 報 を組 み 込 む こ とで あ る.た
と え ば,3 分 木 の 頂 点 の構 造 を;
record inf:contents;
subtreel,subtre2,subtree3:tree; processed:integer; parent:tree end; と す れ ば,あ
る 頂 点 レ コ ー ドのprocessedフ
ィ ー ル ド を 0 に 初 期 設 定 して お き
部 分 木 を 一 つ 処 理 す る ご と に こ の 値 を 一 つ ず つ 増 加 し て お け ば,next_subtree の 値 は 容 易 に 求 め る こ と が で き,ま
た,親
の 情 報 を 持 っ て い る の で,parentの
値 を 得 る 問 題 も た や す く解 決 す る. し か し,こ
の 解 決 方 法 は,記
憶 容 量 の 不 経 済 性 と,後
に述 べ る巧 妙 な 方 法 が
あ る こ と か ら あ ま り利 用 さ れ て は い な い. 2番 目 の 方 法 は,木
構 造 の 中 に こ れ ら の 情 報 を持 つ の で は な く,プ
の 中 に こ れ らの 情 報 を 格 納 す る機 能 を 組 み 込 む 方 法 で あ る.プ 現 在 走 査 中 の 頂 点 を 表 現 す る 変 数current_nodeと,そ
ログラムの中 に
の 頂 点 の どの 部 分 木 まで
処 理 し終 わ っ て い る か を 表 現 す る 変 数lastprocessed_subtreeが
あ れ ば,木
ど の よ う に 実 装 され て い る に して も,関 数next_subtree(current-node)を す る こ と は 可 能 で あ る(lastprocessed_subtreeは
ロ グ ラム
が 計 算
関 数next_subtreeの
自由 変
数 と し て 参 照 さ れ て い る もの と す る). 説 明 を わ か りや す くす る た め に,図5・14の 中 で,頂
2分 木 を 中 間 順 に 処 理 して い る途
点 f に 始 め て 到 達 し た 状 況 に あ る も の と仮 定 し よ う.こ
の 変 数 は;
の と きの 二 つ
current_node=f,lastprocessed_subtree=null と な っ て い る は ず で あ る.た は(null,left,right)の
だ し,2
分 木 の 場 合 は,lastprocessed_subtree
内 の ど れ か で あ る と す る.こ
は,next_subtree(f)を
の 時 点 に 続 く処 理 の 進 行
計 算 して 次 の 頂 点 で あ る k を 得 て,k
木 へ と 処 理 の 対 象 と な る 頂 点 が 移 っ て 行 く こ と に な る.こ
を根 とす る部 分
の こ と は,
current_node:=k;lastprocessed_subtree:=null;
を 実行 す る こ とを 意 味 す る が,k
を根 とす る部 分 木 が す べ て処 理 し終 わ っ た 後
に,再 び 頂 点 fに 戻 っ た と き, current_node=f,lastprocessed_subtree=left と な っ て い な け れ ば な ら な い.こ
の た め に は,処 理 が 頂 点 fか ら k に 移 る 前 に,
再 び こ の 頂 点 に 戻 る と き の こ と を 考 慮 し て,current_node,lastprocessed_sub treeの
値 を 保 存 して お か な け れ ば な ら な い.再
で に 処 理 済 み と な っ て い る は ず で あ る か ら,こ
び 戻 っ た と き は,部
分 木 kはす
の 記 録 は;
current_node=f lastprocessed_subtree=left と す べ き で あ る.
以上 の 事 柄 か ら,記 録 してお か な け れ ば な らな い 情 報 は い か な る もの か と考 え る と,将 来 再 び 訪 れ る可 能 性 の あ る頂 点 の 名 称 と,将 来 訪 れ た と き に最 新 の
図5・14
処 理 済 み と な る で あ ろ う部 分 木 で あ る.図5・14の
頂 点 fを走 査 中で あ る と きに
は,頂 点 a に対 して, curren_node=a,lastprocessed_subtree=left; 頂 点 cに対 して は, current_node=c,lastprocessed_subtree=left;
で な け れ ば な ら な い. さ ら に,頂
点 a に 対 す る 記 録 は,頂
点 c の 記 録 よ り も先 に 作 ら れ,頂
点 cの
記 録 が 不 要 に な っ て 除 去 さ れ る ま で は,a の 記 録 が ア ク セ ス さ れ る こ と は な い. 以 上 の こ と か ら,こ
れ ら の 記 録 は,二
つ の 頂 点 が 各 レ コ ー ド に格 納 で き る よ
う な ス タ ッ ク 構 造 が 適 し て い る こ と に な る. ス タ ッ ク が 図4・14の
よ う な リ ン ク 構 造 で;
type stack=↑item;
side=(null,left,right); item=record c_node:tree; processed:side; next_item:stack end; の よ う に,ま
た,そ
の ス タ ッ ク 上 の 操 作pushdown,
る も の と す れ ば,rtを
popupも
根 とす る木 の 中 間 走 査 の 手 順 は 図5・15の
る.
図5・15(そ
の 1)
別 に 実 装 され て い よ うに 実 装 で き
図5・15(そ
の 2)
さて,最 後 に 紹 介 す る方法 は,原 理 的 に は 前 述 の ス タ ッ ク を用 い る方法 と同 じで あ るが,Pascalの
プ ログ ラム を実 行 す る メ カ ニ ズ ム を 巧 妙 に利 用 す る方 法
で あ る. Pascalの
プ ロ グ ラム の あ るブ ロ ッ ク を計 算 して い る途 中 で,手 順 や 関 数 の 引
用 に よ りさ らに 1レベ ル 深 い ブ ロ ッ ク に実 行 の 制 御 が 移 る と き,そ の 手 順 ま た は 関 数 を計 算 し終 わ った 後 で,再 び 元 の ブ ロ ッ クで の 計 算 を続 け て 実 行 で き な け れ ば な らな い. こ の た め に,元 の ブ ロ ック 内 で,新 と同 じ変 数 名 が あ る場 合,元
しいブ ロ ッ クで 定 義 され て い る地 域 関 数
の ブ ロ ック の そ れ らの 変 数 の 値 は,再 び そ の ブ ロ
ック に 制 御 が戻 る ま で保 存 され て い な け れ ば な ら な い.こ れ らの 変 数値 の 保 存 に は,ス
タ ック が 利 用 され るの が 普 通 で あ る.
こ こ で 論 じ る木 の 処 理 に必 要 とされ る ス タ ッ ク を,こ のPascal実 用 意 され た ス タ ッ ク,お よび そ の ス タ ックに 対 す るpushdown,popupの 新 しい手 順 ま た は 関 数 の 引 用,手
行の ために 操 作 も,
順 また は関 数 か らの 戻 り時 の 処 理 で 代 用 し よ
う とい う もの で あ る. 具 体 的 に は,一 連 の保 存 した い状 態 の 中 で の 処 理 を一 つ の 手 順 また は 関 数 で 記 述 し,そ れ よ り も深 い レベ ル へ の状 態 の 変 化 に は,そ の 手 順 ま た は関 数 の 再 帰 的 引 用,ま
た そ れ よ り も浅 い レベ ル へ の 帰 還 に は手 順 また は 関 数 の終 了 と し
て 実 装 す れ ば よい. 一 つ の 手 順 ま た は 関 数 の 中で,そ
れ 自身 を引 用 す れ ば,そ の 引 数 で あ る変 数
とそ の ブ ロ ック の 地 域 変 数 は新 しいブ ロ ック で も定 義 さ れ て い るの で,古 い 値 は 必 ずpushdownさ popupさ
れ るこ とに な る.引 用 した手 順 が 終 わ れ ば,そ れ らの 変 数 は
れ て元 の 値 に戻 る.
例 と して,n-分 木 の 中 間順 走 査 を再 帰 的 手 順 を 用 い て実 装 す る と,一 つ の 頂 点 の 処 理 を す る間 の 状 態 を保 存 しな け らば な らな い の で,こ れ が 手 順 の 処 理 範 囲 を決 め る.こ の 場 合 の 記 憶 しな け らば な ら な い情 報 は,処 理 して い る頂 点, 処 理 済 みの 部 分 木,ま
た は,次 に処 理 す べ き頂 点 の二 つ で あ る.こ の 例 で は,
前 者 を 引数 と し,後 者 を地 域 変数 とす れ ば,
procedure var
inorder_traversing(var
x:tree);
y:tree;
begin if x<>nil
then
begin
y :=next_subtree(nil); inorder_traversing(y); x:=F(x); y :=next_subtree(y) while
y<>nil
do
begin
inorder_traversing(y);
y :=next_subtree(y) end end
end; と な る.
{end of inorder_traversing}
第 5章
1.木 の 帰 納 的 定 義 に従 って,空
練習問題
で な い木 に は根 が た だ 一 つ,ま
た,葉 が 一 つ
以上 あ る こ とを証 明 せ よ.
2.木 構 造 を 図 で は な く式,ま
た は 文 章 で 表 現 す る方法 を調 べ,そ の 表 現 を入
力 し,リ ン ク構 造 の 木 を作 る手 順(procedure)を 言 語Lispの
実 装 せ よ(ヒ ン ト:プ ログ ラム
S-式 表 現 な どが その 一 例 とい え る).
3.あ る 2進 木 の 相 異 な る 2種 類 の走 査 順 が与 え られ れ ば,そ の 木 の構 造 は一 意 に定 ま る.3 種 類 の 走 査 順 の 内 か ら任 意 の 2種 類 を選 び,そ
れ らの頂 点 の 走
査 順 番 か ら木 を得 る ア ル ゴ リズ ム を示 せ.
4.後 行 走 査 の 応 用例(p125)の
数 式 を順 次 評 価 す る(値 を 求 め る)プ
を実 装 せ よ.た だ し,数 式 は,整 数 と+-*/の
ログラム
演 算 記 号 と左 右 の 括 弧(,)か
らな っ て お り,80文 字 以 内で 1レ コー ドの テ キ ス トフ ァ イ ル に不 定 個 数 あ る も の とす る.
5.リ ンク構 造 の 2-進 木 を複 写 す る ア ル ゴ リズ ム を考 え よ.そ の ア ル ゴ リズ ム の 計 算 時 間 は複 写 す る木 の頂 点 数 が 同 じで も木 の 構 造 に依 存 す るか.依 存 し な い場 合 は,頂 点 数 に 対 す る,ま た,依 存 す る場 合 は最 も効 率 の 悪 い 場 合 を想 定 して頂 点 数 n に対 す る計 算 時 間 のO(n)表
現 を求 め よ.
6.配 列 上 に格 納 さ れ た 平 衡 n-分 木 に お い て,頂 点 iの 子 供 の 項 点 は 左 か ら 順に
(i-1)n+2,(i-1)n+3,…,in+1
と な る こ と を 証 明 せ よ.
[6] 整
6.1
列
データの処理と整列
電 子 計 算 機 で 行 わ れ る計 算 に は 、 数 少 な い デ ー タ に対 して 多 くの 演 算 を繰 り 返 す こ と よ り も,数 多 くの デ ー タ に対 して 同 じ よ うな 演 算 を適 用 す る こ との ほ うが 多 い. 多 くの デ ー タ を扱 うプ ロ グ ラ ム の 中 で は,そ れ ぞれ の デ ー タ は どの よ うに 区 別 され て い るの で あ ろ うか.
図6・1
もっ と も簡 単 な の は,個 々 の デ ー タ を 区 別 す る必 要 が な く,全 体 と して の 情 報 が あれ ば よい場 合 で あ る.た
と えば,実
数 の 集 合 に対 し,そ れ らの総 和 を求
め る よ うな場 合 に は,個 々 の デ ー タ は そ れ ぞ れ の 値 な どの性 質 に関 係 な く全 体 で 幾 つ の デ ー タ が あ るか が わ か っ て い れ ば,そ れ らを どん な 順 番 で も よい か ら 一 列 に並 べ 順 に 加 えて い け ば ,求 め る答 え が 得 られ る.ま た,処 理 す るデ ー タ
の 順 序 が あ らか じめ わ か っ て い て,そ の 順 序 に並 べ られ た デ ー タ が 与 え られ て い る場 合 も前 同様 で あ る. こ の よ う に,デ processing)と
ー タ を そ の 順 番 に 処 理 し て ゆ く方 法 を 順 次 処 理(sequential い う.順 次 処 理 の 方 法 を模 式 化 す る と,図6・1の
ー タ の 先 頭 か ら一 つ の デ ー タ を 取 り 出 し処 理 を 加 え,そ る こ と が な け れ ば 廃 棄 さ れ,さ
よ うに未 処 理 デ
の デ ー タ は再 度 使 わ れ
も な け れ ば 既 処 理 デ ー タ と し て 前 と 同 じ順 番 に
保 存 さ れ る.
次 に,デ ー タ に は処 理 順 序 定 ま っ て い る の で あ るが,デ
ー タ が その 順 序 で は
与 え られ て い な い 場 合 が あ る.こ の場 合 に は,二 つ の 方法 が 考 え られ る.
(b)
(a)
図6・2
そ の 一 つ は,デ ー タ を必 要 とす る た び に そ の デ ー タ を探 し求 め て,処 方法 で あ り(図6・2(a)),他
理す る
方 は まずす べ て のデ ー タを処 理 の 順 序 に 整 列 させ
て か ら順 次 処 理 を す る 方法 で あ る(図6・2(b)). ど ち らの 方 法 が よ い で あ ろ うか.フ
ロー チ ャ ー トか らみ る と,後
者 のほう
が 簡 単 で プ ロ グ ラム も階層 的 に作 りや す い し,ま た,ア ル ゴ リズ ム の 効 率 か ら み て も,第
2章 で議 論 した よ う に,次 々 に 必 要 なデ ー タ を選 ぶ 際 に,以 前 の 選
択 の 際 の 計 算 結果 を利 用 す る こ とが で き る場 合 が 多 い こ とな ど を考 え る と後 者 の ほ うが 優 れ て い る.
図6・3
最 後 の 例 は,計 算 に必 要 なデ ー タ が,あ
らか じめ わ か っ て い な い で 処 理 す る
時 点 で 判 明 す る場 合 で あ る.こ の 場 合 に は,図6・2(a)の い.あ
方法 を採 らざ る を得 な
らか じめ 処 理 の順 に並 べ て お け な い の で あ る か ら,必 要 な デ ー タ が 定 ま
っ て か らい か に早 く抽 出 で き るか とい う こ とが 問題 とな る.探 順 序 関 係 が定 義 さ れ て い れ ば,図6・3の
し求 め る基 準 に
よ う に探 索 の 対 象 とな る デ ー タ を探 し
求 め る基 準 の 順 序 に 整 列 させ て お くと,デ ー タ を探 す 際 の 効 率 を よ くす る こ と が で き る. 上 記 の 三 つ の場 合 を ま とめ る と,多 数 の デ ー タ集 合 か ら,デ ー タ を抽 出 す る と き,選 択 の基 準 に順 序 が 定 義 され て い る場 合 に は,デ ー タ を そ の順 に並 べ て お くと便 利 で あ る こ とが わ か る. 単 にデ ー タ の抽 出だ け で は な く, (1)同 (2)
(3)デ
種 類 の デ ー タ は ひ と ま と め に す る.
デ ー タ集 合 か ら特 定 の 要 素 を抽 出 す る. ー タ集 合 ど う しが等 しい か 否 か を検 証 す る.
と い う よ う な,種 々の デ ー タ操 作 の 中 で 最 も基 本 的 な もの に対 して も整 列 した デ ー タ は威 力 を発 揮 す る. 統 計 的 な 資 料 に よ る と,汎 用 の 計 算 機 の計 算 時 間 の うち の25%以 タ の 整 列 に 費 や され て い る とい わ れ るほ どで,こ 度 で 使 用 さ れ て い るか,ま
上 は,デ ー
の こ とは 整 列 が い か に 高 い頻
た 次 節 で 議 論 す る よ う に整 列 自身 が いか に時 間 の か
か る計 算 で あ るか を示 す もの で あ る. そ の ため に,種 々 の 効 率 向 上 の ため の 工 夫 が こ ら され,多
くの ア ル ゴ リズ ム
が 考 案 され て い る.こ れ らの ア ル ゴ リズ ム を学 ぶ こ と も大 切 で あ るが,こ
れら
の 考 え方 の 糸 口は,ア ル ゴ リズ ム 改 善 の手 段 を議 論 す る う え で は大 層 有 益 で あ る.
6・2
整列に関する基礎
デ ー タ の 整列 の 問 題 を一 般 化 す る た め に,対 象 とな るデ ー タ の表 現 方 法 を 定 め て お こ う. 最 初 に 整 列 の 対 象 と な る 個 々 の デ ー タ を レ コ ー ド(record)と る.こ
こ で の レ コ ー ドは,Pascalの
と して こ の 用 語 を 用 い る が,特
レ コ ー ド型 デ ー タ よ り は抽 象 化 さ れ た 概 念
に 区 別 す る必 要 は な い.
個 々 の レ コ ー ドは 幾 つ か の フ ィー ル ド(feild)に そ の う ち の 一 つ は,整
呼ぶ こ とにす
分 け ら れ て い る(図6・4(a)).
列 の 基 準 と な る 情 報 が 格 納 さ れ て い る は ず で あ る.整
の 基 準 と な る デ ー タ を 整 列 の 鍵(key)と
呼 ぶ こ と に す る.
鍵 は た だ 一 つ の フ ィ ー ル ドに 格 納 さ れ て い る と は 限 ら な い が,以 は た だ 一 つ の フ ィー ル ドに 格 納 さ れ て い る もの と仮 定 す る.ま
R.key, と 記 述 す る こ と に す る.
R.inf
後 の議 論 で
た,鍵
ィ ー ル ドは,ひ と ま と め に し て 情 報 フ ィ ー ル ド と呼 ぶ(図6・4(b)).レ の 鍵 部 お よび 情 報 部 を そ れ ぞ れ
列
以 外の フ コ ー ドR
(a)
(b) 図6・4
レ コ ー ドの 数 を n と した と き,各 レ コ ー ドに 0か らn-1ま を ふ っ た 集 合 を フ ァ イ ル(file)と フ ァ イ ル 型 と は 異 な る.こ ー ドの 集 合 を 意 味 し,フ
呼 ぶ.こ
で 一 次 元 的 に番 号
こ で の フ ァ イ ル は,Pascalに
こ で の フ ァ イ ル は,一
おけ る
次 元 的 順 序 関 係 を持 っ た レ コ
ァ イ ル と い う よ り は む しろ 線 形 リ ス ト と い っ て よ く,
レ コ ー ド ま た は レ コ ー ド間 の 構 造 や そ の 記 憶 場 所 に は,特 注 意 す べ き で あ る*.R0,R1,…,Rn-1か
別 な 規 定 は な い点 に
らな る フ ァイ ル F は
F=R0R1…Rn-1
と表 現 さ れ る.
整 列 の 問 題 で,フ 合,つ
ァイ ル の す べ て の レ コー ドが ラ ン ダ ム にア ク セ ス で き る場
ま り,す べ て の レ コー ドが 主 記 憶 装 置 に格 納 され て い る場 合 と,各 時 点
で は あ る 限 られ た範 囲 の レ コー ドしか ア ク セ ス で きな い 場 合 ,つ
ま り,フ ァイ
ル が 大 きす ぎて 二 次 記 憶 装 置 に あ り,整 列 の デ ー タ が 主 記 憶 領 域 に は一 部 しか 格 納 で きな い よ うな 場 合 が あ る.前 者 の よ うな 場 合 の整 列 を内 部 整 列(internal sort)と い い,後 者 を外 部 整 列(external 整 列 に つ い て学 ぶ こ とに す るの で,特
sort)と い う.本 書 で は,主 と して 内 部 に こ とわ りの な い 限 り整 列 とい っ た ら内
部 整 列 を意 味 して い る. 整 列 させ る フ ァイ ル の お の お の の レ コ ー ドの 鍵 部 は,整 列 の基 準 とな る順 序 が 定 義 さ れ て い な け れ ば な らな い .順 序 を定 め る こ と を数 学 の 言 葉 を借 りて正 確 に 定 義 す る と,鍵 の 集 合 K の上 に次 の条 件 を満 足 す る関 係 〓 が定 め られ て い る こ とで あ る.
*
フ ァ イ ル の 概 念 と し て は,こ
タ は,順
次 フ ァ イ ル(sequential
の 章 で の も の の ほ う が 一 般 的 で,Pascalに file)と
呼 ば れ る フ ァ イ ル の 一 種 で あ る.
お け る フ ァ イル 型 デ ー
a と bが 〓の 関 係 に あ るこ と をa〓bと
書 くこ とに す る と
(1)任
意 の K の 元 a に 対 し,a〓aが
成 り立 つ.
(2)任
意 の K の 元a,bに
対 し,a〓b,b〓aが
(反 射 律) 成 り立 て ば,a=bが
立 つ.
(3)
成 り
(反 対 称 律) 任 意 の K の 元a,b,cに
対 し,a〓b,b〓cが
成 り 立 て ばa〓cが
立 つ. (4)任
成 り
(推 移 律) 意 の K の 元a,bに
対 し,a〓bま
た はb〓aが
成 り立 つ.
上 の 四 つ の 条 件 を満 た す関 係 を,順 序 関 係 ま た は全 順 序 関係 とい う.た ば,実 数 や 整 数 の 集 合 上 の大 小 関 係 は順 序 関係 で あ るが,ジ
とえ
ャ ンケ ンの 三 つ の
手 の 間 の 「あ い こ ま た は よ り強 い 」 とい う関係 は順 序 関係 で は な い. なぜ な らば,「 A は B よ りも強 い 」 とい う関 係 をA〓Bと れ ば,石
〓紙,紙
〓 ハ サ ミで あ る が 石 〓ハ サ ミ と は な らず,推
な い か らで あ る.ま た,あ 係 は,(1)∼(3)の
記 述 す る もの とす 移 律 を満 た さ
る集 合 の部 分 集 合 の 族 に お け る部 分 集 合 間 の 包 含 関
条 件 は満 足 す るが(4)を 満 た さな いの で 順 序 関係 とは い え な
い.
条 件(1)∼(4)の
す べ て を満 足 して い る関 係 が 定 義 され て い る集 合 は,ど の よ
うな 集 合 で も整 列 の 鍵 集 合 とな り う る し,ま た(1)∼(4)の
どれ か 一 つ で も満
た さ な い よ うな 関 係 で は整 列 の鍵 とす る こ と は で きな い. い ま,「 よ り小 さい か ま た は 等 し い」 とい う順 序 関 係 と双 対 関 係 に あ る 「よ り大 きい か また は等 しい 」 とい う関 係 を考 え る と,こ れ も ま た順 序 関 係 で とな る,一 般 に あ る順 序 関 係 の 双 対 関係 もま た順 序 関 係 とな る こ とが わ か っ て い る の で,整
列 問 題 で昇 順 か 降 順 か に こだ わ る こ とな く,ど ち らか 一 方 だ け で議 論
して も一 般 性 を 欠 くこ と は な い. また,フ
ァイ ル の 中 に は等 しい 鍵 が 複 数 個 あ る場 合 が考 え られ る.こ の 場 合
ほ とん ど の ア ル ゴ リズ ム で は,そ れ らの 間 の順 番 は別 の 要 因 か ら固定 さ れ て い る.た
とえ ば,こ れ らの 鍵 の等 しい レ コ ー ド間 で は,元 の フ ァ イル で の 順 番 が
保 存 され る よ うに 整 列 させ られ る とい う よ う に.こ の こ と は,同
じ鍵 で もな ん
らか の 順 序 が つ け られ て い る と考 え る と,元 か らす べ て の鍵 は 異 な っ て い る と
仮 定 して も よい.以 後 の議 論 で は,常
に昇 順 に 整 列 させ るこ と と フ ァ イ ル 内 の
す べ て の鍵 は相 異 な っ て い る もの と仮 定 して お く. 個 々 の アル ゴ リズ ム につ いて の検 討 に 入 る前 に,整 列 の 基 本 的 性 質 を調 べ て お こ う.フ ァ イル 中 の 二 つ の レ コー ドRiとRjを
入 れ 換 え る労 力 を単 位 とす る
と,無 作 為 に並 べ られ た レ コー ドの フ ァ イル を整 列 させ る の に 必 要 な労 力 の平 均 値 は,フ ァ イル の 寸 法 を nに対 してO(n2)で
あ る こ とが計 算 で き る(付 録 B参
照).こ の こ とは,整 列 の ア ル ゴ リズ ム に な ん の 細 工 も しな け れ ばO(n2)以
上の
労 力 を 必 要 とす る こ と を意 味 して い る.
6.3
挿入法による 整列
6.3.1
挿入法 による整列 の基本
挿 入 法 に よ る整 列 は,別 名 ブ リッ ジ プ レー ヤ ーの 方 法 と も呼 ば れ,そ の 基 本 的 考 え 方 は トラ ンプ ゲ ー ム な どで 行 わ れ て い る よ うに,す で に整 列 させ られ て い る デ ー タ集 合 の 中 に新 た に 正 しい 順 番 に な る よ う に挿 入 す る とい う とこ ろ に
図6・5
図6・6
あ る.
た と え ば,図6・5の
よ う な16個
整 列 さ せ る に は,図6・6の Finか
よ う に,ま
ら最 初 の レ コ ー ド227を
目 の レ コ ー ド546を さ れ た 位 置),そ 同 様 に985を のFoutが
の 3桁 の 整 数 か ら な る フ ァ イ ル を 挿 入 法 で ず 最 初 に 出 力 フ ァ イ ルFout=φ
取 り出 しFout=(227)と
取 り出 し,Foutの
す る.次
と お き,
にFinか
ど の 位 置 に 挿 入 す べ き か を 計 算 し(^で 示
こ に 挿 入 す る. 取 り 出 し … … と い う よ う に 順 次 計 算 し,Fin=φ
とな っ た時 点 で
求 め る フ ァ イ ル で あ る.
以 上 を ま と め る と,
――挿 入 法 に よ る整 列 の 基 本 アル ゴ リズ ム ― ― Step1:Fout←
Step2:も
Step3:Finの Step4:Foutに Step5:Step2へ
と な る.
ら 2番
φ.
しFin=φ
な ら ば,Foutを
出 力 し て 停 止 す る.
先 頭 の レ コ ー ドを 除 去 し,そ
の レ コ ー ドを R と す る.
お け る R の 位 置 を み つ け 挿 入 す る. 戻 る.
6.3.2 ま ず,最
基 本的挿入法 によ る整 列アル ゴリズムの実装 初 に 配 列 型 の フ ァ イ ル の 場 合 を 考 え て み る.配
を 挿 入 法 で 配 列Foutに
列Finに
整 列 さ せ る手 順 を 実 装 し た の が 図6・7で
あ るデ ー タ あ る.
配 列 型 の フ ァ イル は,ラ ン ダ ム ア クセ ス が で き る利 点 が あ る が,新 しい レ コ ー ドを挿 入 す る と き に は ,挿 入 点 か ら後 の レ コ ー ドの位 置 を一 つ ず つ ず ら して 挿 入 され る レコ ー ドの 格 納 場 所 を確 保 す る必 要 が あ る. この 点 を考 慮 して,図6・7の
ア ル ゴ リズ ム で は,Foutの 末 尾 か ら先 頭 の 方 向
に レコ ー ドの鍵 の 比 較 を行 っ て 同 時 に移 動 が で き る よ う に な っ て い る点 に 注 意 して い た だ きた い.
図6・7
次 の 実 装例 は,リ イ ル は図6・8の
ン ク構 造 の フ ァイ ル に対 す る もの で あ る.入 力 とな るフ ァ
よ うな構 造 で あ り,Foutに 並 べ 換 え の終 わ った 同 形 式 の フ ァ イ
ル を 出力 す る.こ の 場 合 は,フ 実 装 され た手 順 は 図6・9に
ァ イル の 寸 法 を表 す 引 数 は 必 要 で は な い . 示 され て い る.
図6・8
図6・9
この 二 つ の ア ル ゴ リズ ム の 計 算 時 間 を レ コー ドの 鍵 の 比較 の 回数 だ け に注 目 し 1回 の 比 較 を 単 位 と して表 現 して み よ う. 双 方 の 手 順 中 で レ コ ー ドの鍵 ど う しの比 較 は(2)で 示 さ れ た 文 が 1回 実 行 さ れ るご と に 1単位 時 間 が 消 費 され る.現 在Foutの 寸 法 が iで あ る時 点 を仮 定 す
る と,双
方 の(2)のWHILE文
り,(1)の
が 実 行 さ れ る 平 均 値 は,Foutの
文 に よ る繰 り返 し は,i
が 1か らn-1ま
長 さの半 分 で あ
で とな るの で総 比較 回数
Tins.sortは,
とな り,双 方 の ア ル ゴ リズ ム と も に計 算 増 加 率 はO(n2)の
6.3.3
計 算 時 間 で あ る.
シェルの方法
挿 入 法 の 欠 点 は,配 列 型 の デ ー タ構 造 を用 い る と き,挿 入 す る レ コー ドの場 所 を確 保 す るた め にす で に 整 列 の終 え た部 分 の レ コ ー ドを移 動 しな け れ ば な ら な い 点 に あ る.単
に挿 入 場 所 を みつ け るだ け で あ る な らば,2 分 探 索 法(p183
参 照)を 用 い れ ばO(logn)で
可 能 で あ る.
逆 に挿 入 の 容 易 な リ ンク構 造,た
とば最 適 化 した 2分 木 を用 い る と,や は り
図6・10
O(log
n)で
挿 入 点 を 見 い だ す こ と が で き,挿 入 も簡 単 に 行 え る.し か し な が ら,
レ コ ー ド を 追 加 し て し ま っ た 後 の 木 は,す 最 適 化 す る の に はO(n2)の
で に 最 適 な 木 で は な く な り,そ
時 間 が か か っ て し ま う(p195参
配 列 型 の 入 力 フ ァ イ ル を 幾 つ か に 分 割 す る と,移 を 利 用 す る 改 善 法 がD.Shellに
れ を
照).
動 の 回 数 は少 な くな る こ と
よ っ て 考 え ら れ た.こ
の 方 法 は,入
を分 割 す る代 わ り に,配 列 の 要 素 を1,1+h,1+2h,…
力 フ ァ イル
とい う よ う に h個 お き に
取 って 1ブ ロ ック と考 え,2,2+h,2+2h,…;…;(h-1),(h-1)+h,(h-1)+ 2h,…
と い う h個 の ブ ロ ッ ク ご と に 整 列 を 行 う.
次 に,よ り小 さ い h の 値 で 同 様 な こ と を 繰 り返 し,h=1と 最 後 に 整 列 した フ ァ イ ル が 得 ら れ る.こ
で 表 す こ と に す る.図6・5のFinに
な る ま で 続 け る と,
の と きの hの 取 る値 の順 番 を
対 し
H:h4=8,h3=4,h2=2,h1=1 と す る と,h=8に
対 して は,
B41=(227,340)→(227,340) B42=(546,876)→(546,876) B43=(985,308)→(308,985)
B47=(075,124)→(075,124)
とな り,右 辺 の 矢 印 は書 くブ ロ ッ ク を整 列 させ た後 の ブ ロ ック を示 して い る. h3=4,h2=2,h1=1と い る.そ
して 同様 な こ とを繰 り返 す状 況 が 図6・10に
示 され て
こで は,一 つ の 孤 で 結 ば れ た 要 素 が 一 つ の ブ ロ ッ ク を成 して い る.
こ の ア ル ゴ リズ ムの 特 徴 は,実 際 に は一 次 元 的 に 配 置 され て い るデ ー タ を h 個 お きに 取 る こ とに よ って 実 質 的 に は h個 の ブ ロ ッ ク に分 割 を し,デ ー タ 数 を 少 な く して 整 列 させ,そ
れ ら を統 合 す る と き に は,実 質 的 に は な に もせ ず に元
の 一 次 元 的 に配 置 され た 1組 の デ ー タ と考 え る こ とに あ る. こ の ア ル ゴ リズ ム は,大 変 巧 妙 で 計 算 効 率 を 高 め る こ とは わ か って い る が, ご く特 殊 な 場 合 を 除 い て そ の 動 作 の 解析 に成 功 して い な い.シ
ェル の アル ゴ リ
図6・11
ズ ム の 実 装 例 を 図6・11に
示 す.
6.4 入 れ換え法 による整 列 6.4.1
入 れ換え法 による整列の基本 原理
入 れ 換 え法 に よ る整 列 は,そ の 名 の とお り,並べ た い順 序 に な い 二 つ の レ コー ド(こ の 二 つ の レ コー ドは反 転 に あ る とい う)の 位 置 を 入 れ 換 え る とい う操 作 が 基 本 と な っ て い る.た
とえ ば,左 か ら小 さ い順 に並 べ た い 場 合 に,あ
る二 つ の
レ コー ドの 左 側 の レコ ー ドの 鍵 が,右 側 の そ れ よ り も大 き い と き,こ の二 つ の レ コー ドを 入 れ 換 え る こ とで あ る.こ の 入 れ 換 えの 動 作 をフ ァ イル の 中 に 反 転 (付 録 B参 照)が な くな る まで 繰 り返 せ ば,整 列 が 終 了 す る.
反 転 を見 つ け る方 法,ま
た反 転 に あ る レ コー ドが な くな っ た こ とを確 認 す る
方 法 の 相 違 に よ り,い ろ い ろ な ア ル ゴ リズ ム が 考 え 出 され て い る. 幾 つ か の 方法 を紹 介 し よ う.並 べ 換 え る フ ァ イル を F0=R00R01…R0,n-1
と し て,こ
れ を レ コ ー ドの 鍵 の 小 さ い 順 に 整 列 させ る も の と す る.も
純 で わ か りや す い 方 法 は,ま ん で,R0よ
ず,R0を
固 定 し て 他 方 をR1,R2,…,Rn-1と
り も 小 さ い 鍵 を 持 つ レ コ ー ド をR0と
っ と も単 順次 選
入 れ 換 え て得 られ た フ ァ イル
F1=R10R11…R1,n-1
はR10が
最 小 の 鍵 を持 つ レ コー
R13,…,R1
,n-1と 順 次 比 較
ド と な っ て い る.次
に,R11を
固 定 し て,R12,
し 入 れ 換 え を し て,
F2=R20R21…R2,n-1
を 得 た と す れ ば,R21はR22,R23,…,R2,n-1の
中 で 最 小 の 鍵 を 持 つ レ コ ー ドつ ま
り,全 体 で 2番 目 の も の と な る.こ の 方 法 をn-1回 べ ら れ た フ ァ イ ル が 得 ら れ る.ア Step
1:For
i:=0
Step
2:For
j:=i+1
Step
3:If
Ri>Rj
to
then
こ こ でRi←
→RjはRiとRjと
ズ ム は,Step
3のif文
Ri←
さ い順 に並
ル ゴ リズ ム は
n-2 to
繰 り返 せ ば,小
do n-1
Step do
Step
2
and
then
terminate.
3.
→Rj.
を 入 れ 換 え る こ と 表 現 し て い る.こ の ア ル ゴ リ
で 入 れ 換 え の 行 わ れ る 回 数 は,比 較 の 回 数 よ り も少 な い
の で,こ の ア ル ゴ リズ ム の 計 算 時 間 の オ ー ダ は 比 較 の 回 数 に よ り定 ま りO(n2) と な る こ と が 容 易 に わ か る.
6.4.2
バ ブ ル ソ ー ト(bubble
sort)
前 の ア ル ゴ リズ ム と同 じ よ う な簡 単 で わ か りや す い ア ル ゴ リズ ム と して バ ブ ル ソ ー トが あ る.ア ル ゴ リズ ム を簡 単 に 紹 介 し よ う.前 例 と同 じよ うに整 列 さ せ るフ ァ イル F0=R00R01…R0,n-1
に 対 し,ま ず 最 初 に n 番 目 の レ コ ー ド とn-1番
目 の レ コ ー ド と を 比 較 し,反 転
で あ れ ば 入 れ 換 え を行 い,そ n-1番
うで な けれ ば そ の ま ま入 れ 換 え を行 わ な い.次
目の レ コー ドとn-2番
は
目の レ コー ドとを比 較 し… …,と い うように 2番
目 と 1番 目の レ コー ドまで 比較 入 れ 換 え を行 う.こ の 時 点 でR0に は ち ょう ど泡 が 浮 か び上 が っ て くる よ うに,こ の レ コー ドの 中 で 最 小 の鍵 を持 つ レコ ー ドが 浮 か び上 が っ て きて い るは ず で あ る. 次 の ス テ ップ で は,前 と同 じよ うに n番 目 とn-1番
目の レ コー ドを比 較 す る
こ とか ら始 め て,前 の ス テ ップ で 入 れ 換 えの 起 こ っ た最 後 の位 置 の 直 後,す わ ち前 の 回で の 最 後 に起 こ っ た入 れ 換 え の位 置 が,k 番 目 とk-1番 ドとの 間 で あ っ た な らば,k+1番 これ で,第
目の レコー
目 と k番 目の と ころ まで比 較 入 れ換 え を行 う.
2ス テ ップ が 終 わ る.
こ の 時 点 で,最 後 に入 れ 換 え の あ った と こ ろ よ り上 の 部 分 は,す て い る.そ
な
して,同
じよ うに次 の ス テ ップ へ と進 み,入
で に整 列 し
れ 換 えの 起 こ らな くな
る まで 次 々 に ス テ ップ を繰 り返 せ ば,す べ ての レ コー ドは順 に整 列 し終 った こ とに な る. この ア ル ゴ リズ ム の 計 算 時 間 は,前 の アル ゴ リズ ム と同 じ よ う にO(n2)で あ るが,前
者 が,1
は
ス テ ップ の デ ー タ の走 査 が 単 に 残 りの レコ ー ドの 内 か ら最
小 の もの を見 つ け るだ け で,次 の ス テ ップ の 走 査 に は前 の 走 査 の 結 果 が な ん ら 利 用 さ れ て い な い.こ れ に反 して,バ ブ ル ソー トで は最 後 に 浮 か び 上 が っ て く るの が 残 りの レ コ ー ドの 中で 最 小 の もの で あ るが,最
小 の レコ ー ドが 見 つ か る
まで に行 わ れ た入 れ 換 え操 作 は,次 の ス テ ップ で の 労 力 を軽 減 して い る. 以 上 の 理 由 か ら,同 じO(n2)の
アル ゴ リズ ム で は あ って も,前 の ア ル ゴ リズ
ム よ り はバ ブ ル ソー トの ほ うが 優 れ て い る こ とが わ か る.簡 単 な 整 列 の プ ログ ラ ム を作 る と き に,ど あ る が,同 た い.も
う い う わ け か前 者 の ア ル ゴ リズ ム を使 う人 が 多 い よ うで
じ程 度 に簡 単 で よ り効 率 の よいバ ブ ル ソ ー トを使 用 す る こ とを勧 め
ち ろ ん,こ
れ らの ア ル ゴ リズ ム の 実 装 が 簡 単 だ か ら とい って も,多 数
回 の 使 用 が 予 測 され るプ ロ グ ラム の アル ゴ リズ ム と して は適 当 で は な い.こ の よ うな場 合 に は,後 述 の もう少 し複 雑 な ア ル ゴ リズ ム に よ っ て よ り高 い効 率 が 得 られ るの で,そ
ち らを採 用 す べ きで あ る.
図6・12
6.4.3
bubble
sort
program
ク イ ッ ク ソ ー トの ア ル ゴ リズ ム の 原 理 と 実 装
入 れ 換 え法 に よ る整 列 の 計 算 時 間 の短 縮 方 法 の 一 つ と して,前
に計 算 した 結
果 を利 用 す る方 法 と してバ ブ ル ソ ー トを紹 介 した が,さ ら に有 効 な 方法 と して, デ ー タ分 割 法 に よ る高 速 化 を図 っ た ア ル ゴ リズ ム と して 有 名 な の が ク イ ック ソ ー ト(quick sort)で あ る. デ ー タ分 割 法 に よ るア ル ゴ リズ ム の 改 善 法 を,整 列 の ア ル ゴ リズ ム に適 用 す る場 合 を 想 定 して復 習 す る と, (1)デ
ー タ の ブ ロ ックへ の分 割
(2)各
ブ ロ ッ ク ご との 整 列 の 処 理(主 処 理)
(3)ブ
ロ ック の統 合
で あ っ た. ク イ ッ ク ソ ー トの 場 合 は,主
と し て 第 1ス テ ップ の デ ー タ 分 割 の と こ ろ に ア
ル ゴ リズ ム の よ さ の 秘 密 が か く さ れ て い る .ま 説 明 し よ う.
ず,最
初 に分 割 の 方法 につ い て
い つ もの よ う に,整 列 の対 象 と な る フ ァイ ル を F0=R00R01…R0
と す る.こ ドをRpと
の フ ァ イ ル の 中 か ら 任 意 に 一 つ の レ コ ー ド を取 づ出 す .こ し よ う.Rpと
レ コ ー ドはRpの を 行 う.そ
,n-1
残 りの 各 レ コ ー ド と を 比 較 し,Rpよ
左 側 に,大 き な 鍵 を持 つ レ コ ー ドは 右 側 に な る よ う に 入 れ 換 え
の 結 果 得 ら れ た フ ァ イ ル は, F1=R10R11…R1
,k-1RpR1,k+1…R1,n-1
の よ う に な る.F1の るF12=R1,k+1…R1
う ち,Rpよ
り も左 に あ るF11=R10R11…R1
,n-1の 二 つ の サ ブ フ ァ イ ル は,も
れ てF'11,F'12と
な っ た と す れ ば,こ
F'12と す る と,フ つ ま り,F0を
,k-1と,右
にあ
しそ れ ぞ れ が 整 列 させ ら
れ ら を 統 合 し て,一
つ の フ ァ イ ルF'11Fp
ァ イ ル は 求 め る整 列 の 済 ん だ フ ァ イ ル と な る.
整 列 さ せ る と い う 問 題 は,(1)上
に 分 割 す る こ と,(2)F11とF12の と,(3)こ
の レコー
りも小 さ い鍵 を持 つ
の よ う に二 つ の サ ブ フ ァイ ル
二 つ の サ ブ フ ァ イ ル を そ れ ぞ れ 整 列 させ る こ
れ ら の サ ブ フ ァ イ ル と選 ば れ た レ コ ー ド を 適 当 な 順 番 に 並 べ て 一 つ
の フ ァ イ ル に す る と い う 問 題 に 変 換 で き た こ と に な る. F11とF12の
整 列 に対 し て も,こ
の 整 列 問 題,F12か 返 し て ゆ く と,最
らF121とF122の
の 考 え 方 を 適 用 す れ ば,F11か
らF111とF112
整 列 問 題 と に 置 き 換 え ら れ る.こ
れ を繰 り
後 に は 分 割 さ れ た サ ブ フ ァ イ ル が た だ 一 つ の レ コ ー ドか ら な
る フ ァ イ ル と な る.た
だ 一 つ の レ コ ー ドか ら な る フ ァ イ ル は,す
ん だ フ ァ イ ル と み な さ れ る の で,そ
でに整列の済
れ まで分 割 を進 めて しま えば実 際 にサブ
フ ァ イ ル を 整 列 さ せ る 必 要 は な く な っ て し ま う(図6・13参
照).
さて,こ の 方 法 で の 計 算 時 間 は どの よ う に な って い る で あ ろ う か.精 密 な 解 析 につ い て は,他
の 文 献 を参 照 して い た だ く と して,こ
こでは半分直感 に頼 る
計 算 時 間 の 解 析 を試 み る. ア ル ゴ リズ ム の 中で,も っ と も頻 繁 に 実行 され る演 算 は 二 つ の レ コー ドの鍵 の 比 較 回 数 で あ り,こ れ が 計 算 時 間 の オ ー ダ に も っ と も影 響 を与 え る .こ の 比 較 回 数 の 平 均 値 を求 め て み よ う. 最 初 の ス テ ッ プ で の 比 較 の 回 数 は,Fpと
他 のn-1こ
の レ コ ー ドと を 比 較 す る
図6・13
の で,そ
の 回 数 はn-1(≒n)回
で あ る .括 弧 の 中 の 値 は,n が 十 分 大 き い 場 合
の 近 似 値 で あ る .こ の 近 似 値 を 用 い て も計 算 時 間 の O 関 数 は 変 わ ら な い こ と は 容 易 に わ か る.そ
し て,Fpは
そ れ ぞ れ(n-1)/2(≒n/2)で
任 意 に 選 ん だ の で,F11とF12の あ る.n/2の
長 さの フ ァイ ル 2個 を さ らに 分 割 す る
の に 必 要 な 比 較 の 回 数 は,((n/2)-1)*2≒nと に は お お よ そ n 回 の 比 較 回 数 が 必 要 と さ れ る.各 ド に な る ま で に は,log2(n)レ 較 回 数 はO(n
log n)回
の 取 り方 で 定 ま り,そ
な る.つ ま り,1 レベ ル の 分 割 サ ブ フ ァイ ル が 唯 一 の レ コー
ベ ル の 分 割 が 必 要 で あ る か ら,全
体 と して の 比
と な る.サ ブ フ ァ イ ル の 統 合 分 割 は,配 列 の 添 え 字 区 間
の 操 作 回 数 は 統 合 ブ ロ ッ ク の 数 に 比 例 し,比
も小 さ い オ ー ダ で あ る.ゆ と な る こ と が わ か る.
長 さの 期 待 値 は
え に,こ
の ア ル ゴ リズ ム の 計 算 時 間 はO(n
較 回数 よ り log
n)
ク イ ック ソー トの ア ル ゴ リズ ム を 実 装 す るの に は,大
き く分 け て二 つ の 方 法
が あ る.読 者 自身 もす で に お 気 づ きの こ と と思 うが,こ
の ア ル ゴ リズ ム は 再 帰
的 に考 え,か つ 記 述 す る と非 常 に簡 単 に な る. 実 装 方法 の 一 つ は再 帰 的 プ ロ グ ラ ム と して 実 装 す る もの で,簡 単 で か つ わ か りや す い. も う一 つ の 実 装 方 法 は,大
き な デ ー タ に適 用 さ れ,ま た 使 用 頻 度 の 高 い ア プ
リケ ー シ ョンプ ロ グ ラ ム パ ッケ ー ジな どの 整 列 プ ロ グ ラ ム に 多 く見 られ る もの で,再
帰 的 プ ロ グ ラ ミ ング を用 い ず に,自
らの プ ロ グ ラ ム 内 の ス タ ック を用 い
て 必 要 最 小 限 の デ ー タ をス タ ッ クす る こ とで ス ピー ドア ップ を図 っ て い る.見 た 目 に は相 当複 雑 な ア ル ゴ リズ ム に見 え るが,考
え方 は 同 じで あ る.
ま た,分 割 時 の 分 岐 点 とな る レコ ー ドの 選 択 方 法 に も,ブ ロ ッ クの 最 初 の レ コー ドを取 る方 法,ブ
ロ ッ クの 真 ん 中 に 位 置 す る レコ ー ドを取 る方 法 な どが あ
図6・14
quick
sort
program
る.被 分 割 ブ ロ ック の レ コ ー ドの 配 置 が統 計 的 に ラ ン ダム で あ れ ば,ど も同 じで あ るが,実
ち らで
際 に は整 列 の 済 ん で い た フ ァ イル を 多 少修 正 し,再 度 整 列
す る な ど とい う場 合 が 多 いの で,後 者 の よ うな 中 点 の レコ ー ドを取 る方 法 が 取 られ る. ブ ロ ック の最 初 の レ コー ドを分 岐 レ コー ドに選 ぶ 方法 を取 っ た場 合,す 整 列 の済 ん だ フ ァイ ル に 適 用 す る と,最 悪 の 効 率 と な り,O(n2)の な っ て し ま う.ま た,同
でに
計算 時 間 と
じ値 の 鍵 が 比 較 され た と きに は,そ の 二 つ の レ コ ー ド
を入 れ換 え た ほ うが早 い アル ゴ リズ ム とな り,そ の よ うな 実 装 が され て い る も の が 多 い こ と に も注 意 が 必 要 で あ る. 図6・14に
6.5 6.5.1
再 帰 的 プ ロ グ ラ ミン グの 実 装例 を示 す.
その他の方法による整列 選 択法 による整 列
選 択 法 に よ る整 列 の 基 本 は,す べ ての デ ー タ の 中か ら最 小 の 鍵 を持 つ レコ ー ドを探 し出 して,そ
れ を新 しい フ ァ イル の第 1番 目 に配 置 し,次 に 残 りの 中 か
ら最 も小 さ い鍵 を持 つ レ コ ー ドを探 し出 して,そ れ を 2番 目 に配 置 す る.以 下 同様 に順 次 並 べ て行 く方 法 で あ る. こ の 手 法 の 計 算 時 間 は,k 個 の デ ー タ の 中 か ら最 小 の もの を見 つ け るの に平 均k/2回
の 鍵 の 比 較 を しな け れ ば な らな い の で,全 体 で
と な りO(n2)と
な る こ と が 容 易 に わ か る.よ
リ ズ ム で は あ ま り よ い と は い え な い が,こ が あ る.も
っ と も よ く知 ら れ て い る の は,ヒ
っ て,基
本 原 理 そ の ま まの ア ル ゴ
の 方 法 に も改 善 さ れ た ア ル ゴ リズ ム ー プ ソ ー ト(heap
sort)と
呼ばれ
る ア ル ゴ リ ズ ム で あ る.
こ の ア ル ゴ リズ ム で の 計 算 時 間 の 高 速 化 は,以 前 の ス テ ップ の 計 算 結 果 を利 用 す る 方法 で あ る.前 の 計 算 結 果 を利 用 で きる よ うに す る た め に,フ 中 か ら最 小 の 鍵 を持 つ レ コー ドを探 し求 め る方 法 に工 夫 が して あ る.
ァイルの
(a)
(b)
(c)
(d)
図 6・15 多 くの デ ー タ の 中 か ら も っ と も強 い(も っ と も 小 さ い)も の を 求 め る 方 法 と し て よ く知 ら れ て い る の は トー ナ メ ン ト法 で あ る.簡 メ ン ト勝 ち 抜 き表 の 例 を 図6・15(a)に ドが 求 め る 最 強(最
小)の
ち 残 っ た デ ー タ の 中 に,2 が 高 い.こ
単 な デ ー タ 集 合 で の トー ナ
示 した.こ の 表 の 頂 上 に 位 置 す る レ コ ー
も の で あ る こ と は い う ま で も な い.上
の ほ う ま で勝
番 目 に 強 い も の が あ る と は 限 ら な い が,そ
の 結 果 を う ま く利 用 す る こ と に よ り,効
の可能性
率 を上 げ よ う とい うの が ヒ
ー プ ソ ー トの 着 眼 点 で あ る .
まず 最 初 に,ト ー ナ メ ン ト表 を少 し改 良 しよ う.ト ー ナ メ ン ト表 で は上 位 の 位 置 に勝 者 を 記 入 す る が,こ で き る.さ らば,勝
こ に敗 者 を記 入 す るこ とに して も同 じ こ とが 表 現
ら に よ い こ とに,同
じデ ー タ が 何 回 も 出現 す る こ とが な く(な ぜ な
ち抜 き戦 で は各 デ ー タ は 1回 しか 負 け な い か ら),ま た優 勝 者 は 最 後
に 負 け た もの とす れ ば,n 個 の デ ー タ に 対 して n個 の記 入 場 所 が あ れ ば よ い. 前 の 例 を この 方法 で表 現 す る と図6・15(b)の
よ う にな る.
さ て,す で に気 づ か れ た か も しな いが,図6・15(b)の
トー ナ メ ン ト表 は勝 者
の 頂 点 近 くの 変 形 を 除 け ば,広 義 の 平衡 2分 木 とな っ て い る.総 数 の わ か って い る 多 くの デ ー タ を,効 率 よ く格 納 す るの に よ い方 法 は,配 列構 造 を 用 い る こ とで あ る こ とは す で に 述 べ たが,木 構 造 の 実 装 に も第 5章5.4節
の配 列 で 述 べ
た よ うに配 列 を用 い て 実 装 す る方 法 が あ る.勝 者 の 頂 点 の部 分 で の 変 則 を トー ナ メ ン ト表 の解 釈 を多 少 変 えて,図6・15(c)の
よ うに木 の左 側 の 部 分 木 の根 を
一 つ ず つ 左 下 に ず ち して平 衡 2分 木 とす る.こ の よ うに,平 衡 2分 木 を配 列 を 用 いて 実 装 した ものを ヒー プ(heap)*と
い う.配列 名 A の配 列 に図6・15(c)の
分 木 を実 装 した状 態 を図6・15(d)に
示 した(第 5章練 習 問 題 6参 照).
さ て,ヒ
ー プ ソ ー ト は 二 つ の 操 作 か ら な っ て い る.そ
の 一 つ は,ト
2
ーナ メ ン
ト表 の 頂 点 の レ コ ー ド(残 りの デ ー タ の 内 最 小 の も の)を 取 り 出 し て 出 力 フ ァ イ ル に 並 べ,そ
の 代 わ り に,ま
く こ と で あ る.二
つ 目 は,ト
だ トー ナ メ ン ト表 に な い レ コ ー ドを 表 の 頂 点 に 置 ー ナ メ ン ト表 の 頂 点 が 入 れ 替 わ っ た と き に,新
い 頂 点 の レ コ ー ドを 適 当 な 位 置 に 配 置 し直 し て,正 こ と で あ る.こ 図6・16は
しい トー ナ メ ン ト表 とす る
の 二 つ 目 の 操 作 を シ フ テ ィ ン グ(shifting)と トー ナ メ ン ト表 の 勝 者075を
れ 換 え た も の を,正 入 者(丸 印)は,そ
し
呼 ん で い る.
取 り出 し,ト ー ナ メ ン ト表 外 の340と
入
し い 表 に 変 換 す る シ フ テ ィ ン グ の 過 程 を 示 す 例 で あ る.新
の 子 孫(最 大 二 つ)で そ れ よ り も小 さ い も の が あ る 限 り,そ
(a)
(b)
の
(c)
図 6・16 * ヒー プ に は,堆 積 物 とい う意 味 が あ る.デ ー タ を集 め た もの とで も い う意 味 で 用 い られ た 名 称 で あ ろ うか.第
9章 で もヒー プ とい うデ ー タ構 造 が 出 て く るが,こ
あ って も異 な っ た デ ー タ構 造 で あ る.多 で は な い.
分,別
こで の ヒ ープ と 同 じ名 前 で は
々に 命 名 され た もの で あ ろ うが,そ
の由来は定か
小 さ い ほ う と(二 つ と も よ り小 さ い と き は 二 つ の 内 の 小 さ い ほ う と)入 れ 替 わ る と い う の が,表
を 正 し く直 す 方 法 で あ る.
さ て,ヒ ー プ ソー トの 実 装 で は,デ ー タの 配 置 が 工 夫 され て い る.い ま ま で の い ろ い ろ な整 列 ア ル ゴ リズ ム の 実 装 の と き に見 られ た よ う に,入 力 フ ァ イル と出 力 フ ァ イル は 配 列 型 の デ ー タ で あ り,そ れ ら は一 つ の 配列 を共 用 して い る. そ れ ば か りで は な く,途 中 で使 用 され る トー ナ メ ン ト表 の 2分 木 も ヒー プ の 形 式 で,ま
た,ト
ー ナ メ ン ト表 に まだ 組 み 入 れ られ て い な いデ ー タや,ト
ーナ メ
ン ト表 の 頂 点 か ら取 り出 して並 べ た 出 力 フ ァ イル の 1部 分 さ え も,み な 同 じ一 つ の 配 列 内 で 処 理 され て い る. た だ 注 意 す る こ と は,ヒ べ た い 順 番 と 逆 の,す
ー プ ソ ー トの シ フ テ ィ ン グ の ア ル ゴ リ ズ ム で は,並
な わ ち 小 さ い 順 に 並 べ た い と き に は,大
プ の 頂 点 に く る よ う に プ ロ グ ラ ム す る.こ ー プ の 先 頭 に 出 て く る が ,こ の よ う に す る の は,メ
う す る と,も
きい もの が ヒ ー
っ と も大 き い も の が ヒ
れ を 取 り出 し て 配 列 の 後 ろ 側 か ら並 べ て く る(こ
モ リ の 使 用 方 法 と も 関 連 し て い る)手 法 を 取 っ て い る か
ら で あ る. ヒ ー プ ソ ー トの 計 算 時 間 の 解 析 は 練 習 問 題 とす る が,結 O(nlogn)で
あ る こ と が 知 られ て い る.し
イ ッ ク ソ ー トよ り も効 率 が よ く な い(ク 均 で 約 2倍)の で は あ る が,ヒ ル に も,常 にO(nlogn)の
か しな が ら,同
論 だ け を述 べ る と, じO(nlogn)の
イ ッ ク ソ ー トの 計 算 時 間 と比 較 して 平
ー プ ソ ー トの ほ う は,ど
の よ う な配 置 の フ ァ イ
計 算 時 間 で あ る こ と の 利 点 と,二
デ ー タ に 対 す る 外 部 整 列(external
sort)に
高 い ア ル ゴ リ ズ ム で あ る.図6・17に
ク
次 記憶 装 置 内の
も 適 用 で き る こ とか ら,利 用 価 値 の
ヒ ー プ ソ ー トの 実 装 例 を 示 す .
図 6・17(そ
の 1)
図 6・17
6.5.2
(そ の 2)
併合法 による整列
併 合 法 に よ る整 列 は,す で に 整 列 の 済 ん で い る い くつ か の フ ァ イ ル を,一 つ の 整 列 の 終 えた フ ァ イル へ の併 合 す る手法 を応 用 して 整列 を行 う. 複 数 の 整 列 した フ ァ イル を併 合 す る一 方 法 は,図6・18に
示 す よ う に,各 フ ァ
イ ル の 先 頭 の レ コー ドを取 り出 して,そ れ らの 中 で トー ナ メ ン トで そ れ らの 中 の 勝 者 を取 り出 す.こ
れ は,す べ て の フ ァ イル 中 で最 小 の 鍵 を持 つ レ コ ー ドで
(1)
各 フ ァ イ ルの 先 頭 レ コー ド間 で の トー ナ メ ン ト 勝 者 は 出 力 リス トの 先 頭 へ 移 動 す る
(2)
(1)のRvの
代 わ りに,File
取 り出 し,ト
kの
次 の レ コー
ー ナ メ ン ト表 の 先 頭 に 置 き,シ
テ ィ ン グ を 行 う と,次
ドを フ
の 出 力 リス トへ の レ コー
ドが 得 ら れ る
図 6.18 あ る.勝
者 を取 り 出 し,出
次 に,先
力 リ ス トに 並 べ る .
の 勝 者 を 出 し た フ ァ イ ル の 2番 目 の レ コ ー ド を トー ナ メ ン ト表 の 先
頭 に 入 れ て,ト
ー ナ メ ン ト表 を シ フ テ ィ ン グ す る.そ
ー ドは 全 体 で 2番 目 の 鍵 を 持 つ レ コ ー ドで あ る
.こ
の 結 果,先
頭 に くる レ コ
れ を取 り 出 し て 出 力 リス ト
に 並 べ る.
以 下 同 様 に して,す べ て の フ ァ イル が 空 に な る まで 続 け れ ば,各 時 点 で の 勝 者 を順 に並 べ て 一 つ の 整 列 した フ ァ イル へ と併 合 で き る.こ こ で の トー ナ メ ン ト法 に は,前 節 の ヒー プ ソ ー トが 応 用 され て い る. 少 し横 道 に そ れ る が,外
部 整 列(external
sort)に
ヒ ー プ ソ ー トが 役 立 つ と述
べ た が,そ わ ち,併
の 具 体 的 な方 法 が,こ
の フ ァ イ ル の 併 合 法 に示 唆 さ れ て い る.す な
合 法 で の 入 出力 各 フ ァイ ル は,順 次 ア ク セ ス しか され て い な い.こ
の
こ と は外 部 フ ァ イ ル で あ っ て も よい こ とを 意 味 して い る. さ て,こ
こで の併 合 法 に よ る整 列 は,内 部 整 列 で あ るか ら,ア ク セ ス の 方 法
に と らわ れ る こ とが な い.ま た そ の た め に,ヒ ー プ ソー トの 助 け を借 りな け れ ば な らな い の な ら,最 初 か ら ヒー プ ソ ー トを使 っ た ほ うが よい こ とは 明 らか で あ る. い ま,併
合 す る フ ァ イ ル が 二 つ の 場 合 を 考 え る と,ト
め る と こ ろ は,二
つ の レ コ ー ドの 鍵 を 1回 比 較 す る だ け で よ い.そ
させ る フ ァ イ ル を,た らの フ ァ イ ル は,す き,一
ー ナ メ ン トの 勝 者 を 求 こ で,整
列
だ 一 つ の レ コ ー ドだ け か ら な る フ ァ イ ル に 分 割 し(こ れ
で に 整 列 した フ ァ イ ル で あ る),そ
つ の フ ァ イ ル に な る ま で 併 合 を 続 け れ ば,整
れ を二 つ ず つ併 合 して 行 列 が 終 了 す る(図6・19参
照).
こ の整 列 の ア ル ゴ リズ ム の計 算 時 間短 縮 の 着 眼 点 は,す で に明 らか な よ う に, 分 割 法 で あ る.し か し,今 まで に 出現 した 分 割 法 が,ク イ ッ ク ソ ー トの よ う に, 分 割 時 に主 要 な 計 算 処 理 が あ り,分 割 され た 部 分 フ ァ イル を一 つ に併 合 す るの に は 計 算 労 力 を使 っ て い な い の に対 し,こ の 方法 は,分 割 は 非 常 に簡 単 で あ る が,部 分 フ ァイ ル の 併 合 時 に 主 要 な処 理 をす る 点 が,他 の もの と対 照 的 で あ る.
図 6・19
次 に,こ の 併 合 法 に よ る整 列 の 計 算 効 率 に つ いて,例
に よ っ て 直観 的 な方 法
で 考 察 して み よ う. 最 初 に,二
つ の フ ァ イ ル の レ コ ー ド数 の 和 が 一 定 で あ る と き,こ
イ ル を 併 合 す る の に も っ と も 効 率 の よ い の は,そ
れ らの フ ァ
れ ぞ れ の レ コ ー ド数 が ど の よ
う に な っ て い る と き で あ る か を 考 え て み よ う. 総 数 を n と し,一 方 の フ ァ イ ル の レ コ ー ド数 を k と す れ ば,他 方 はn-kで
あ
る.い ま,長 さ n の 順 に 並 べ ら れ た フ ァ イ ル を 得 る ま で の 計 算 時 間 がf(n)で
あ
る と す る と,関
数 fの オ ー ダ は
O(f(n))>O(n) で あ る(逐 次 計 算 方 式 で は,線 形 の オ ー ダ 以 下 の 整 列 アル ゴ リズ ム は,存 在 しな い).こ の 条 件 の 下 で は,二 つ の フ ァ イル の 長 さ が 等 しい と き に,計 算 時 間 が 最 小 とな る こ とが 証 明 で き る(第 6章 練 習 問 題 6参 照). こ の 結 果 は,フ
ァ イ ル を併 合 す る と き に は,フ
ァ イル の 大 きさ が で き るだ け
等 しい もの ど う しで 併 合 す る の が 得 策 で あ る こ と を 意 味 し て い る.も
っ と も小
さ い フ ァ イ ル の 長 さ は 1で あ る か ら,フ ァ イ ル の サ イ ズ は 併 合 さ れ る ご と に1, 2,4,…,2k-1,2kと
増 加 し て 行 く.同
じ長 さ の フ ァ イ ル を す べ て 併 合 し て,倍
長 さ の フ ァ イ ル に す る 過 程 を 1段 階 と す れ ば,整 n で あ る か ら,こ
の
列 させ る フ ァイ ル の 大 き さが
の フ ァ イ ル を た だ 一 つ の レ コ ー ドか ら な る サ ブ フ ァ イ ル に 分
割 して,最 後 に 一 つ の 整 列 し た フ ァ イ ル に な る ま で に は,log2n段
階 の処 理 が 必
要 と さ れ る. さ て,1
段 階 で の レ コ ー ドの 鍵 の 比 較 回 数 を 考 え よ う.い
ま併 合 す る前 の 各
フ ァ イ ル の 長 さ が k で あ る と す る と,フ ァ イ ル の 数 はn/kで ル 二 つ を 一 つ に 併 合 す る の に 必 要 と す る鍵 の 比 較 回 数 は2k-1回 n/k個
の フ ァ イル を2kの
長 さ の フ ァイ ル に 併 合 す る に はn/(2k)回
あ る.こ の フ ァ イ で あ る.ま た, の併 合が 必要
で あ る.よ っ て,こ の 段 階 で の 併 合 に 必 要 な 比 較 の 回 数 は(2k-1)n/(2k)と りO((2k-1)n/(2k))=O(n)で,各 がlog2nで
段 階 で一 定 の オー ダで あ る.全 体 の 段 階 数
あ る か ら,こ の ア ル ゴ リ ズ ム の 計 算 時 間 はnlognの
図6・20(b)は,リ
な
ン ク 構 造 の 線 形 フ ァ イ ル を,併
オ ー ダ と な る.
合 法 に よ る整 列 の アル ゴ リ
ズ ム の 再 帰 的 プ ロ グ ラ ミ ン グ に よ る 実 装 例 で あ る.こ ル を 表 現 す る の に,図6・20(a)の
こ で は,複
数個 の フ ァ イ
よ うな フ ァ イル の 集 合 をフ ァ イル の ポ イ ン タ
の リ ス トで 表 現 し て い る. こ の よ う に,ポ
イ ン タ 型 の デ ー タ 構 造 に は,再
帰 的 プ ロ グ ラ ミング が わ か り
や す くで き上 が っ た プ ロ グ ラ ム も簡 単 で 読 み や す い .し ロ グ ラ ム の 実 行 に は,そ
か し な が ら,再
帰 的プ
の プ ロ グ ラ ム ブ ロ ッ クの 地 城 変 数 を すべ て ス タ ッ ク に
プ ッ シ ュ ダ ウ ン す る の で,実
行 効 率 を 考 慮 す る と き に は,必
だ け の ス タ ッ キ ン グ で 済 む よ う に,繰
り返 し型 の プ ロ グ ラ ム に 書 き直 す よ う に
し た ほ う が 高 速 と な る.
(a)
図 6・20
要最小 限のデー タ
(そ の 1)
(b)
図 6・20(そ
の 2)
6.5.3
複 合ア ルゴ リズム による整 列
前 節 ま で に種 々 の 整 列 ア ル ゴ リズ ム を学 ん で きた が,効 ム の ほ とん ど は分 割 法 に よ る高 速 化 を図 っ て い る.そ
率 の よ い ア ル ゴ リズ
して,そ れ らの ア ル ゴ リ
ズ ム で は,分 割 は フ ァ イル が た だ 一 つ の レコ ー ドか ら な るフ ァ イル に な る まで 続 け られ,そ の 結 果,第
2章2.3節
で 述 べ た分 割 ・処 理 ・統 合 の 3段 階 の うち,
本 来 の 機 能 で あ る 第 2段 階 の処 理 を省 略 で き る よ う に考 慮 され て い る. しか しな が ら,工 夫 を こ ら した ア ル ゴ リズ ム は大 き な フ ァイ ル に対 して は, 大 変 大 きな 効 果 が あ るが,小
さ な フ ァ イル に対 して は,む
リズム の ほ うが 効 率 が よ い.つ て 0関 数 を 用 い た が,こ
しろ,簡 素 な アル ゴ
ま り,お お よ その アル ゴ リズ ム の 評 価 関 数 と し
れ は レ コー ド数 nの フ ァ イル の整 列 に要 す る時 間 関 数
f(n)の 項 の 中 で もっ と も大 きな nのべ き乗 を表 現 して い る.も ち ろ ん,こ の こ と は 単 一 の ア ル ゴ リズ ム ど う しの 優 劣 を云 々 す るに は,も っ と もよ い評 価 基 準 で あ る.だ が,小
さい 寸法 の フ ァ イル に対 して は,各 項 の べ き乗 の 大 き さ よ り も
む しろ係 数 の 大 き さの ほ うが 問題 と な っ て く る.複 雑 な ア ル ゴ リズ ム で は,定 数項 や,小
さ なべ き乗項 の係 数 が 大 き くな る傾 向 に あ るの で,簡
ズ ム の ほ うが,短
単なアル ゴ リ
い 計 算 時 間 とな っ て く る.
以 上 の 結 果 を簡 単 に グ ラ フ で表 現 す る と,図6・21の
よ うな 傾 向 と な る.分 割
法 に よ り改 善 され た ア ル ゴ リズ ム で は,実 際 に は整 列 を行 わず に,分 割 また は 統 合 をす る時 間 と な っ て い る.フ
ァイ ル が あ る程 度 小 さ くな る と,改 善 され た
アル ゴ リズ ム よ り も簡 単 な ア ル ゴ リズ ム の ほ う が速 くな るの で あ るか ら,分 割 は こ の 寸 法 に 達 した 時 点 で 停 止 し,各 部分 フ ァ イル は 簡 単 な ア ル ゴ リズ ム で整 列 を 行 っ た ほ うが 得 策 とな る.つ
ま り,分 割法 に よる 高 速 化 ア ル ゴ リズ ム は,
第 2章2.3節
で示 した よ うに,3
ス テ ップ と し,分 割 した 部 分 フ ァ イル の 整 列
は簡 単 な,た
とえ ば,バ
で は,図6・21で
ブ ル ソー トの よ うな もの を使 用 す べ きで あ る.
の 高 速 化 アル ゴ リズ ム と簡 単 な アル ゴ リズム の 計 算 時 間 の グ
ラ フ が交 差 して等 し くな るの は,フ ァイ ル の レ コ ー ド数ncが 幾 つ の と きで あ ろ うか.こ れ は,使 用 す る計 算機 や,順 序 比 較 の 計 算 の 方法,フ
ァイ ル や レ コ ー
ドの 実 装 方 法 な ど に依 存 す るの で い ちが い に は明 言 で きな い が,筆 者 の 実験 に よ る と,レ コ ー ドが整 数 だ けか らな る フ ァ イル 場 合 で,10∼20個 以 上 で は高 速 化 ア ル ゴ リズ ム が 有利 で,そ
の レ コ ー ド数
れ 以 下 の レ コ ー ド数 の フ ァ イル に 対
して は,簡 単 な アル ゴ リズ ム の ほ う に分 が あ る よ うで あ る.市 販 の 整 列 ア ル ゴ リズ ム で もこ の 数 は 利 用 者 が場 合 場 合 に よ っ て,自 由 に 与 え られ る よ う に な っ て い る もの もあ る.
図6・21
第 6章
1.相
異 な る k個 の 要 素 の 置 換(順
練習問題
列)を
す べ て 求 め る で き るだ け速 い ア ル ゴ
リ ズ ム を探 し 出 し て 実 際 に 計 算 し て み よ(ヒ ム と して は,TrotterのACM
2.シ
Collected
ェ ル の 方 法 に よ る 整 列 で,ブ
ン ト:高
Algorithms
速 置 換 生 成 ア ル ゴ リズ
No.115(1962)な
ロ ッ キ ン グ 間 隔 の 数 列H:h1,h2,…,hnを,
20=1,21,22,…,2n-1:30=1,31,32,…,3n-1;40=1,41,42,…,4n-1と 算 時 間 が ど の よ う に 変 化 す る か,実
3.バ
ブ ル ソ ー ト は,フ
し た と き,計
際 に 計 算 す る こ と に よ り 比 較 せ よ.
ァ イ ル の 一 端 か ら も う 一 方 の 端 に 向 か っ て 隣 接 した 反
転 関 係 に あ る 要 素 を 入 れ 換 え て ゆ き,最
後 に 入 れ 換 え の あ っ た 点 が,次
の 対 象 と な る フ ァ イ ル の 端 を 定 め る と い う走 査 手 順 を,フ な る ま で 繰 り返 す.こ
どが あ る).
の と き,6.4.2項
ァイ ル の 寸 法 が 0に
の バ ブ ル ソ ー トの ア ル ゴ リ ズ ム で は,
反 転 して い る 要 素 の テ ス トは 常 に 定 ま っ た 端 か ら 行 わ れ て い る が,一 固 定 して い る 必 要 は な い.た 22は0∼9の ゆ き,次
と え ば,2
の走査
般 的には
つ あ る端 を 交 互 に 替 え て も よ い.図6・
数 か ら な る フ ァ イ ル を 最 初 は 下 端 か ら上 端 に 向 か っ て 比 較 を して の 走 査 で は 上 端 か ら 下 端 に 向 か っ て と い う よ う に 交 互 に し て い る.こ
の よ う な 整 列 法 を カ ク テ ル シ ェ ー カ ー ソ ー ト と 呼 ん で い る.以
下 の 問 い に答 え
よ. (1) カ ク テ ル シ ェ ー カ ー ソ ー ト とバ ブ ル ソ ー ト と を 比 較 し て,そ れ ぞ れ の 長 所 短 所 を 述 べ よ. (2) カ ク テ ル シ ェ ー カ ー ソ ー ト手 順 を 実 装 せ よ.
図6・22
4.ク
ィ ック ソー トの アル ゴ リズ ム につ い て,次
(1)整
列 の 対 象 とな るフ ァ イル 中 に,同
の各 問 に 答 え よ.
じ値 の検 索 鍵 を持 つ レ コー ドが あ
る場 合 を 想 定 しよ う.ク イ ッ ク ソ ー トの アル ゴ リズ ム の 中 で,同
じ値 の 鍵
を比 較 した 時 に は,そ れ らの 要 素 は 入 れ 換 え た 方 が,計 算 速 度 が 上 が る. そ の 理 由 を考 え よ. (2)サ
ブ ブ ロ ッ クへ の 分 割 の 境 界 と な るべ く選 ば れ る要 素Rpを,常
す るブ ロ ッ クの 先 頭 の要 素 に選 ん だ 場 合,す
に分 割
で に 整列 の 済 ん で い るフ ァ イ
ル に対 して この アル ゴ リズ ム を適 用 す る とO(n2)の 計 算 時 間 が か か る こ と を 証 明 せ よ.
5.ヒ
ー プ ソ ー ト と併 合 法 に よ る ソ ー トの ア ル ゴ リ ズ ム を 組 み 合 わ せ て,複
個 の 順 次 ア ク セ ス フ ァ イ ル を,一
数
つ の 順 次 ア ク セ ス フ ァ イ ル へ と整 列 さ せ る外
部 ソ ー トの ア ル ゴ リ ズ ム を 考 え よ.
6.デ ー タの 寸 法 を n と し,この デ ー タ に対 す る計 算 時 間 がf(n)(O(f(n))>O(n) と す る)で あ る ア ル ゴ リ ズ ム が あ る.こ の デ ー タ をn1個
とn2個(n1+n2=n)の
デ ー タ に分 割 して,そ
れ ぞ れ に こ の ア ル ゴ リズ ム を適 用 し,併 合 す る と同 じ結
果 が 得 られ る とい う.こ の と き の計 算 時 間g(n)は g(n)=k・n+f(n1)+f(n2)(k:定
と な る も の と した と き,g(n)を
数)
最 小 に す るn1,n2を
求 め よ.
[7] 検
7.1
検
索
と
索
は
この 章 の 主題 を 一 言 で表 現 す れ ば,「 情 報 の 記 憶 お よび 検 索 の 方法 」 とい う こ とが で き る.情 報 を どの よ う に記 憶 装 置 内 に格 納 して お くの か,ま
た,そ の
中 の 必 要 な デ ー タ を どの よ うに して 見 つ け だ す の か とい う こ とで あ る. わ れ わ れ は,プ
ロ グ ラム をで きる だ け 一 般 的 に 作 りた い と願 っ て い る.そ の
た め に は,個 々 の プ ログ ラム は あ る特 殊 な 状 況 を想 定 して作 る よ り も,で き る だ け一 般 化 す る こ と を考 え る. こ こで は,入
力 デ ー タ を得 る 方法 に注 目 して み よ う.デ ー タ も,個 々の 計 算
に対 して,そ の 解 法 に 合 わ せ て 用意 され る こ と もあ るが,計 算 が 巨大 と な りシ ス テ ム 化 され て くる と,入 力 デ ー タ を準 備 す る こ と と,こ れ を 用 い て 計 算 す る こ とが 分 業 化 して くるの は 必然 的 な傾 向 で あ る. そ うな る と,デ ー タ を準 備 す る側 は,個 々 の 計 算 に と らわ れ ず デ ー タ の表 現 して い る現 象 や 状 況 を正 確 に 記 述 す る よ うな デ ー タ の 収 集 を し よ う とい う捕 え 方 を す る し,デ ー タ を使 用 す る側 は,そ の よ うに して 集 め られ たデ ー タ の 中 か ら必 要 な もの だ け を選 び 出 して 使 う とい う こ と にな る.そ
こで,多
くの デ ー タ
集 合 の 中 か ら必 要 とす るデ ー タ を探 し出 す こ と,す な わ ち,情 報 の検 索 が 重 要 な意 味 を な して く る.
さ て,デ ー タ の検 索 で は,ど の よ うな こ とが 問題 と な る で あ ろ うか.た
とえ
ば,現 在 販 売 さ れ て い る 出版 物 の デ ー タ か ら あ る特 定 の 本 を検 索 す る と きに, 本 文 を 記 憶 して い て,そ い.書
の文 と一 致 す る もの を見 つ け よ うな ど とい う人 は い な
名 とか著 者 名 な どの 手 が か りか ら検 索 す るの が 普 通 で あ る.つ ま り,書
名 は 多 少 の 文 学 的(?)な
情 報 を含 む で あ ろ うが,他
の 本 と区別 す る ため,つ
ま
り,検 索 の 手 が か り とな るた め につ け られ て い る と もい え る. わ れ わ れ の使 用 す るデ ー タ 集 合 は,単
に そ れ が 持 っ て い る内 容 情 報 だ け で は
な く,そ の 情 報 が検 索 しや す い よ うに検 索 の 手 が か り と して の 情 報 を も含 ん で い る.こ の 2種 類 の 情 報 は,明 確 に 区 別 で き る と は限 らな い.本 の 著 者 名 な ど は,重 要 な 主情 報 の 一 つ で あ る に もか か わ らず,同 時 に検 索 の 鍵 と して も大 き な役 割 を果 た して い る. しか しな が ら,問 題 を一 般 化 して 扱 う た め に,以 下 の論 にお い て は,検 索 の た め の 鍵 情 報 と,本 来 の デ ー タ の表 現 して い る情 報 と を区 別 して扱 う こ とにす る.検 索 され るべ き個 々 の デ ー タ を抽 象 的 に record
key:searchkey; cont:contents end で 定 義 され る レ コ ー ド と考 え る(図7.1参 報 を,contは,そ
照).こ
の デ ー タ の 持 つ 内 容 情 報 で,そ
型searchkey,contentsは
こ でkeyは,検
索 の た め の鍵 情
れ ぞ れ の フ ィ ー ル ドの デ ー タ
特 定 さ れ た デ ー タ 型 で は な く,形 式 的 な 意 味 し か 持
た な い も の と し て お く.
図7・1
この レコ ー ドの 形 式 は,前 章 で扱 った 整 列 問題 の デ ー タ要 素 と同 じで あ るが, 整 列 の た め の 鍵 が,順 序 関 係 の 定 義 され て い る集 合 で な け れ ば な らな か っ た の に対 して,探 索 の た め の 鍵 は,必 ず し も順 序 が 定 義 さ れ て い る必 要 は な い.た だ し,個 々 の レ コー ドが 鍵 だ け で 区 別 認 識 が で き る よ うに,す べ て の レ コ ー ド デ ー タ に は 異 な る鍵 が 割 り振 られ て い る もの と仮 定 して お く.ま た,レ
コー ド
の 集 合 を抽 象 的 な意 味 で の フ ァイ ル と呼 ぶ こ とに す る. 検 索 に対 して も,整 列 の と き と同 じよ う に,フ
ァイ ル 全 体 が 主 記 憶 装 置 内 に
格 納 可 能 な 場 合 の 内 部検 索(internal search)と,フ
ァ イル 全 体 が 主 記 憶 装 置 に
入 りき れ な い で 二 次 記 憶 装 置 内 に あ る場 合 の 外 部 検 索(external 区別 され るが,本
search)と に
章 で は 主 と して 内部 検 索 を扱 う こ と にす る.
また,た だ 一 般 的 に 検 索 と呼 ば れ て い る機 能 に もい ろ い ろ な定 義 が あ るか ら, こ こで は ご く基 本 的 な機 能 で検 索 と定 義 を して お こ う)ま ず最 初 に,対 象 とな る デ ー タ 群 つ ま りフ ァイ ル に は,二 つ の 場 合 が 考 え られ る. そ の一 つ は,フ
ァ イル が 常 に一 定 数 の レコ ー ドを持 っ て お り,ア ク セ ス の 頻
度 な どの 統 計 的 な 性 質 も変 わ らな い場 合 で あ り,他 方 は,フ 索 頻 度 な どの 統 計 的 な値 が,ア
クセ ス の 状 況 に よ って 変 化 す る場 合 で あ る.前
者 の よ うな フ ァイ ル を静 的 フ ァイ ル(static file),後 namic
file)と 呼 ぶ.以
後,特
ァ イル の 数 や,検
者 を動 的 フ ァ イル(dy
に こ とわ りの な い場 合 は,検
索 の 対 象 とな っ て
い るの は 静 的 フ ァ イル で あ る もの とす る. 今 まで は,検 索 す る こ とは 対 象 の フ ァイ ル の 中 か ら必 要 な 情 報 を取 り出 す こ と と して い た が,実 際 に は そ の情 報 自身 が 欲 しい の で は な く,そ れ が フ ァイ ル 中 に存 在 す る か否 か,ま
た は,ど
こ に格 納 され て い るか な どの 情 報 を知 るた め
に検 索 を行 う こ と も あ り う る.そ こで,検 索 す る と い う こ とは,次 の 二 つ の情 報 を求 め る こ と と定 義 す る. ■success検 ■position求
索 の結 果 求 め る レコ ー ドが フ ァ イル 内 に 存 在 した か 否 か. め る レ コー ドの 位 置.
successは 検 索 に成 功 した か 失 敗 で あ っ た か を表 現 す る もの で,型 な い が,Boolean型
と考 え て よい. positionは,検
は特 定 し
索 に成 功 した と きに の み 定
義 され,フ
ァイ ル 内 の 位 置 を表 現 す る変 数 で あ る.検 索 アル ゴ リズ ム が 実 装 さ
れ る と きに は,こ
れ らの 二 つ の 情 報 は一 つ に ま とめ る こ とが 可 能 で あ る.た
と
え ば,フ ァ イ ル が 正 の整 数 の 添 え字 を持 つ 配 列 で あ る と き,success=falseで あ る こ と をposition=0で
表 現 す る もの とす れ ば,検 索 の 結 果 はpositionだ
け
で 十 分 で あ る.し か しなが ら,こ の 時 点 で は,こ の 2種 の 情 報(変 数)の 型 を特 定 した くな い の で,別
々 に扱 うこ と にす る.
さ て,検 索 シ ス テ ム を設 計 す る う えで,ど
の よ うな 問 題 が 生 じて くるで あ ろ
うか. (1)検
索 に要 す る時 間 を で き るだ け短 くす る.
(2)内
容 の情 報 に比 較 して フ ァイ ル をで き るだ け小 さ くす る.
(3)検
索 の た め の 鍵 を簡 単 か つ 覚 えや す くす る.
な ど が あ る.こ れ ら は,互 い に相 反 す る要 求 とな る こ と もあ り,場 合 場 合 に よ っ て優 先 順 位 も変 わ る で あ ろ うが,一 般 に は(1)の 検 索 時 間 の短 縮 が もっ と も 重 要 な 項 目で あ る.い ろ い ろな デ ー タ構 造 を利 用 した り,フ ァ イル を あ る順 序 に 整 列 させ て お くの は,フ ァ イル の要 素 の 素 早 い検 索 を可 能 に す るた め で あ る. 前 章 で 学 ん だ よ うに,整 列 は時 間 の か か る仕 事 で あ るが,静 対 す る検 索 で あ れ ば,フ
的 な フ ァ イル に
ァ イル 作 成 時 に 1回 整 列 させ て お け ば,以 後 の 検 索 で
の 高 速 化 を 図 る こ とが で き る.個 々 の検 索 で 節 約 で きる時 間 は 少 な く と も,1 回 作 成 され た フ ァ イル に対 す る検 索 回 数 は 非 常 に膨 大 な もの とな るの で,整 列 に か か っ た 時 間 以 上 の 節 約 が 可 能 で あ る し,ま た,た
と えそ うで な く と も,検
索 時 間 の 短 縮 は利 用者 の サ ー ビ ス 向上 に大 き く貢献 す る. 第 2の 項 目は,検 索 の対 象 とな る フ ァ イル が 非 常 に大 き くな る場 合 に特 に 重 要 な項 目 とな る.与 え られ た計 算機 資 源 で要 求 され て い る検 索 シ ス テ ム の構 成 が 可 能 で あ る か否 か,ま
た は フ ァ イル を縮 小 す る こ とに よ っ て 内部 検 索 が 可 能
とな り,ひ い て は大 幅 な検 索 時 間 の 縮 小 が 可 能 とな るか な どの 問題 解 決 の 有 効 な 手 段 で あ る. 一 例 と して100万 そ れ ぞ れ に20ビ
以 下 の 素数 の フ ァイル を考 え る.素 数 の 数 は78498個
ッ トの格 納 領 域 が 必 要 で あ る とす る と,フ
あ り,
ァイル の大 き さ は,
1569960ビ
ッ ト と な る.素 数 が す べ て 奇 数 で あ る*1こ と を 利 用 す る と約500000
ビ ッ ト に で き る こ と が 知 ら れ て い る.ま な り,そ の1/2が64未
た,100万
以下 の素数 間の差 は偶 数 と
満 で あ る こ と を 利 用 す る と,471000ビ
ッ ト以 下 に で き
る*2.
こ の よ うに フ ァ イル を圧 縮 す る と,当 然検 索 時 間 が大 き くな る が,必 要 とす る フ ァ イル が 実現 で き るか否 か,ま
た は 内 部 フ ァ イル で 実現 で き るか否 か が 問
わ れ て い る場 合 に は,い か に 有 効 か が 知 れ るで あ ろ う.
7.2順
次
検
索
検 索 と して も っ と も簡 単 な方 法 は,し の 鍵 とを比 較 し,等
らみ つ ぶ しに探 し求 め る鍵 と レ コ ー ド
しい鍵 の 有 無 を調 べ る方 法 で あ る.フ
ァ イル が順 次 フ ァイ
ル で あ る と きは,こ の し らみ つ ぶ しの 順 番 は フ ァ イル の レ コー ド順 とな る.探 し求 め る情 報 の 鍵 を K と し,フ ァ イル を
とす る と,順 次 検 索 の ア ル ゴ リズ ム は ― ― 順 次 検 索 の ア ル ゴ リ ズ ム ―― Step
1:Set
Step
2:lf
i
←
Ri.key=K
terminate Step
3:If
0. then the
i=n-1
set
success
←
true,position
←
iand
algorithm. then
set
success←false
and
terminate
the
algorithm. Step
4:Set
i
←i+
1
and
goto
Step
順 次 検 索 は 直 観 的 で わ か り や す い が,ア あ ま り よ い 方 法 と は い え な い.こ
*1数 *2
Art
Wesiey(1973)よ
り.
of
ル ゴ リ ズ ム の 効 率 の 面 か ら 見 る と,
の 検 索 ア ル ゴ リズム で最 も実 行 回数 の 多 いの
学 で は 2 を 素 数 と し な い.計 D.Knuth:The
2.
算 機 に 関 連 し た 分 野 で は,2
Computer
Programming
Vol
も素 数 とす る こ とが 多 い
.3 Sorting
and
.
Searching,Addison
は,Step
2に お け るRi.key=Kの
値 を計 算 す る こ とで あ る.そ こで,こ の ア
ル ゴ リズ ム の 計 算 時 間 の 評 価 には,こ の 鍵 の 比較 回 数 を用 い る こ とに す る. ア ル ゴ リズ ム の 評 価 の基 準 と な る数 量 と して,も 時 間 で あ る.そ
こで,統 計 的 な 仮 説 と して,フ
検 索 され る確 率 は ど れ も等 し く1/nで
っ と も重 要 な の が 平均 計 算
ァ イル の 中 の 個 々 の レ コー ドが
あ る とす る.し か し,こ の 仮 説 は検 索 が
成 功 に終 わ る場 合 を想 定 して い るが,検 索 が 不 成 功 に終 わ る場 合 も考 え な け れ ば な らな い.だ
が,検 索 が 不 成 功 に終 わ る の は,そ の よ うな 検 索 が 行 わ れ る こ
とが 予 測 で き な い か らで あ り,統 計 的 な仮 定 を立 て に くい.ま
た,検 索 鍵 を照
合 して検 索 す る場 合 に は,検 索 の 対 象 が フ ァイ ル に存 在 す る と き と,そ うで な い と きに は ア ル ゴ リズ ム の 中 で の 扱 い が 異 な る こ とが 多 い.そ
こで,以 後 の検
索 鍵 の 比 較 法 に よ る検 索 の 場 合 に は,検 索 の 結 果 が 成 功 で あ った か,不 成 功 で あ っ た か に よ っ て 別 々 に扱 うこ とに す る. ま ず最 初 に,成 功 に終 わ る場 合,最 初 の レコ ー ドが 検 索 され て い る レ コー ド で あ る と き は,鍵 の 比 較 は 1回,2 番 目の レコ ー ドの 場 合 は 2回,…,最
後の
レ コ ー ドで あ る と き は,n 回 とな りそ の 平 均 は,
と な り,不 成 功 に終 わ る と きは,常
に n個 の レコ ー ドす べ て と比較 さ れ た 後 の
時 点 で 結 論 が 出 され る.ゆ え に,常 に一 定 回数 の 比 較 が行 わ れ て,
と な る.ゆ
え に
で あ る.ま た最 小 の場 合 と最 大 は
で あ る こ とは 容 易 に わ か る. この 検 索 の 方 法 は,探
し求 め る レ コー ドの 鍵 を フ ァ イル 中 の レ コー ドの鍵 と
比較 す る こ と に よっ て い て,フ
ァイ ル や検 索 の アル ゴ リズ ム に特 別 の 工 夫 を こ
らす こ とな く,た だ 直 観 的 な 方法 に よ って い る.こ の 場 合,検
索 に要 す る時 間
は フ ァ イル の大 き さ に比 例 す る.つ ま り,な ん の 工 夫 もな い検 索 は,対 象 とな る デ ー タの 大 き さに 比例 す る とい う至 極 あ た りま えの 結 論 を得 た. しか し,各 種 の デ ー タ ベ ー ス*が 多 くの 人 々 に使 用 さ れ る よ うに な っ た現 状 で は,フ
ァ イル の大 き さ に比 例 す るア クセ ス タ イ ム で は 実 用 的 使 用 にた え られ
な い.そ
こ で フ ァイ ル の 大 き さに あ ま り依 存 しな い検 索 ア ル ゴ リズ ム が要 請 さ
れ る よ う に な る.
7.3
2
分
検
索
検 索 の鍵 が,た だ 等 しい か 否 か とい う こ とだ け しか判 定 で き な い もの とす る と(検 索 の た め だ け な らば,こ
の性 質 だ け で十 分 で あ る),鍵
を比 較 す る こ とに
よ る検 索 の 手 段 と しは,前 節 の し らみ つ ぶ し法 しか な い.し か し,検 索 鍵 に順 序 関 係 が 定 義 され て い る と,そ の 順 序 関 係 を利 用 して,よ
り速 い検 索 速 度 の ア
ル ゴ リズ ム が 考 え られ る. 実 際 の検 索鍵 の 場 合,鍵 く らで も あ る.た
の 意 味 の うえ で は 順 序 関 係 に な っ て い な い もの は い
と え ば 形 状 を検 索 の 鍵 に した 場 合 に 「円 形 」,「長 方 形 」,
「正 方 形 」,「三 角形 」,…の 形 状 間 に は,順 序 関 係 は 存 在 しな い.し
か しなが
ら,す べ て の鍵 は,計 算 機 の 内 部 で は 2進 数 で 表 現 され て い るの で あ る か ら, 鍵 の 意 味 に無 関 係 で よい の な らば,常
に順 序 関 係 が 定 義 され て い る と考 え て よ
い.た だ 注 意 す る こ と は,こ れ らの 計 算 機 内部 表 現 を用 い た順 序 関 係 は,計 算 機 また は使 用 す る ソ フ トウ ェ ア に よ って 定 義 が 変 わ る可 能 性 が あ る こ とで あ る.
7.3.1 配 列 構 造 の フ ァ イル に お ける 2分 探 索 フ ァイ ル A は,配 列 構 造 の リス トに検 索 鍵 の 小 さ い順 に整 列 して い る もの と す る.い ま,探 索 す る情 報 の 鍵 を K と し,探 索 す る フ ァ イル の 範 囲 を添 字 の 上
* デ ー タベ ー ス(database)と
は,多 くの 情 報 を蓄 え た フ ァイ ル(複 数 の 場 合 もあ る)と そ の フ ァ イ
ル の 検 索 や デ ー タの 修 正 除 去 な どの 管 理 プ ロ グ ラ ム とか らな る ソフ トウ ェア シ ス テ ム で あ る.
限topと
下 限bottomで
表 現 す る も の と す る.2
分 探 索 法 の ア ル ゴ リズ ム の 要
旨 は, (1) も しtop
ら ば,success←falseと
(2) フ ァ イ ル の 中 間 の 位 置(top+bottom)div (3) も しA[middle].key=Kな
し て 終 了. 2を 求 めmiddleと
す る.
らば,success←true,position←middle
と して 終 了. (4) も しA[middle].key>Kな
ら ば,求 め る レ コ ー ドが こ の フ ァ イル に あ る
と す れ ば,こ の 区 間 の 前 半 に あ る は ず で あ る か らtop←middle-1と
し,
こ の 新 区 間 で 再 度 こ の ア ル ゴ リズ ム を 繰 り返 す. (5) も しA[middle].key
ら ば,求 め る レ コ ー ドが この フ ァ イ ル に あ る
と す れ ば,こ の 区 間 の 後 半 に あ る は ず で あ る か らbottom←middle+1と し,こ
の 新 区 間 で 再 度 こ の ア ル ゴ リズ ム を 繰 り返 す.
こ の ア ル ゴ リズ ム の 実 装 例 を 図7・2に
示 し た.
図7・2
7.3.2
2分 木 構 造 の フ ァイ ル にお ける 2分 探 索
リン ク構 造 を利 用 した 線 形 リス トは,リ ス トの 中間 点 を求 め る こ とは 不 得 意 で あ るか ら,2 分 探 索 に は 適 した デ ー タ構 造 と は い え な い.し か し,そ れ に代
図7・3
わ っ て リンク構 造 の 2分 木 は,ま さ に 2分 探 索 に最 適 な デ ー タ構 造 で あ る. 2分 探 索 に使 用 され る 2分 木 は,図7・3に 部 分 木 へ の ポ イ ン タ,探 索 鍵,内
示 した よ うに,木 の 頂 点 は左 右 の
容 情 報 の フ ィー ル ドか ら成 って お り,木 の 各
頂 点 は 中 間順 走 査 の 順 に 整 列 して い る もの とす る. ―― 2分 木 構 造 に お け る検 索 アル ゴ リズ ム― ― Step
1:も
Step 2:も
し検 索 木 が 空 で あ れ ば 検 索 は 「不 成 功 」 と して停 止 す る. しK=Krootで
あ れ ば,検 索 は 「成 功 」と して 停 止 す る.た だ し,
図7・4
Krootは 検 索 木 の 根 の レ コ ー ドの 鍵 と す る. Step
3:も
しK
ら ば,根
の 頂 点 の 左 部 分 木 に 対 し検 索 を 続 け る.
Step
4:も
しK>Krootな
ら ば,根
の 頂 点 の 右 部 分 木 に 対 し検 索 を 続 け る.
こ の ア ル ゴ リ ズ ム の 実 装 例 を 図7・4に
示 す.
こ の よ う な 2分 探 索 木 を 作 る 方 法 は,以
下 の よ う に 示 さ れ る.こ
こ で は,頂
点 と な る レ コ ー ド を 鍵 の 順 に整 列 させ て そ の 順 番 で 頂 点 を 区 別 す る もの とす る. た と え ば,図7・5で
頂 点 に 記 入 さ れ た 数 が k で あ る と す る と,こ
の頂 点 に は k
番 目 の 鍵 を持 つ レ コ ー ドが 格 納 さ れ て い る こ と を 意 味 す る.
図7・5
― ― 2分 木 を 作 る ア ル ゴ リ ズ ム ― ― Step
1:対
象 と す る レ コ ー ドの 数 が 0で あ っ た ら,求 め る 木 は 空 木 と な る. 0で な い と き に は,Step
2以 下 を 実 行 す る.
Step
2:要
素 とな る レ コー ドを その 鍵 の 順 に並 べ る.
Step
3:こ
の 木 の根 を
Step
4:項
点 の レ コ ー ドよ り 小 さい 鍵 を持 つ 「n/2〓-1の
「n/2〓
の レ コ ー ドと す る. レ コ ー ドに 対 して
この ア ル ゴ リズム を適 用 し,そ の 木 をStep
2で 作 っ た根 の左 部 分 木
とす る. Step
5:頂
点 の レコ ー ドよ り大 きい鍵 を持 つ 〓n/2」 の レ コー ドに対 して,こ
の アル ゴ リズ ム を適 用 し,そ の 木 をStep2で
作 っ た根 の右 部 分 木 と
す る.こ の 時 点 で木 は 完 成 して い るの で ア ル ゴ リズ ム を停 止 す る. この アル ゴ リズ ム の 実 装例 を図7・6に
示 す.こ の プ ロ グ ラム で は探 索鍵 の 順
に並 べ 替 え られ た レ コー ドが 格 納 さ れ て い る 配列 A か ら,各 レ コ ー ドに左 右 の 部 分 木 へ の ポ イ ン タ を 加 えて探 索 木 の構 造 に 変 換 す る もの で あ る. 以上 で 2分 検 索 法 に お け る フ ァイ ル の 実 装 に,配 列 構 造 と木 構 造 との 2種 を 示 した が,実
際 問題 で 2分 検 索 を適 用 す る の は,配 列 構 造 に対 して の こ とが 多
図7・6
い.木 構 造 は,配 列 構 造 に 比 較 して 自由 度 が 大 きい の で,次 節 で述 べ る最 適 検 索 木 を 用 い るほ うが 有 利 で あ る.
7.3.3
2分 検 索 法 の 計 算 時 間 の 解 析
2分 検 索 法 ア ル ゴ リズ ム の 計 算 時 間 の 解析 に は,2 分 木 構 造 の 場 合 を想 定 し た ほ うが 考 え や す い.前 に紹 介 した 2分 木 に,検 索 が 不 成 功 に終 わ る個 々 の 場 合 を配 慮 して,図7・7の
よ う な 2分 木 の モ デ ル を考 え る.こ の 2分 木 は 2種 類
の 頂 点 を持 っ て い る.丸 い頂 点 は 葉 で な い もの で(内 頂 点:internal ぶ),フ
nodeと
呼
ァイ ル 内 の各 レ コー ドを表 現 して い る.
これ ら は,中 間 順 走 査 の順 に整 列 して い る.葉 で あ る頂 点(外 頂 点:external nodeと
呼 ぶ)は,検 索 時 に そ れ ら に到 達 す る と不 成 功 と され る頂 点 で,内 頂 点 n
の 左 に 接 続 して い る外 頂 点 探 索 鍵 K がkeyn-1
区 間 に あ る こ と を,
ま た右 に接 続 して い る外 頂 点 は,探 索 鍵 Kがkeyn
区間 にあ るこ
とを意 味 して い る. 検 索 に成 功 す る場 合 の それ ぞ れ の 検 索 鍵 の 出 現 確 率,つ が 終 了 す る確 率 は 等 し く,ま た 不 成 功 に 終 わ る場 合,つ
図7・7
ま り各 内 頂 点 で検 索 ま り各 外 頂 点 で検 索 が
終 了 す る確 率 も等 しい もの とす る. まず,最 初 に 図7・7の と き,外 頂 点 の 数 はn+1と
2分 木 の性 質 を調 べ て お こ う.内 頂 点 の 数 が nで あ る な る こ とは 容 易 に わ か る.い ま あ る頂 点 vで検 索
が 終 了 した とす る と,そ こ に 到 達 す る ま で に 実 行 さ れ た 鍵 の 比 較 回 数compv は, (1)
と な る.こ
こ でVrは
木 の 根 を 表 現 し て い る.い
ま,
と す る と, (2) と な る. (2)式 の 証 明: (ⅰ)n=0の
ときCOMPext=COMPint=0で
あ るか らCOMPext=COMPext+2n
は 成 り立 っ て い る. (ⅱ)内 頂 点 の 数 が n の と きCOMPext=COMPint+2nが す る.こ
の と き,任 意 の 外 頂 点 を 内 頂 点 に 図7・8の
頂 点 は 一 つ 増 え る.ま
成 り立 っ て い る と仮 定 よ う に 変 え た と き,内
た 元 の 外 頂 点 の 根 か ら の 道 の 長 さ を k と す れ ば,外
頂 点 の 道 の 長 さ の 総 和 は k で あ る もの が 一 つ 減 り,k+1で つ 増 え る.内
頂 点 に 関 し て は,元
あ る ものが 二
の 外 頂 点 が 内 頂 点 と な っ た の で k増 加
す る. こ れ ら を 以 下 に ま と め る と,
と な り,や
は り (2')
が 成 り 立 つ.
(証 明終)
図7・8
図7・7の
2分 木 が 先 に 示 し た ア ル ゴ リ ズ ム に よ っ て 作 ら れ た と す る.
q=「log2(n+1)〓
とす れ ば,外 頂 点 は q レベ ル に2(n+1)-2q頂
ル に2q-(n+1)頂 +1で
点,(q-1)レ
点 あ る(第 7章 練 習 問 題 2参 照).「log2(n+1)〓=log2n」
あ る か ら,(1),(2)よ
り,
と な り,平 均 値 は
で あ り,と
も にO(log
n)の
平 均 計 算 時 間 と な る .以
検索 成功の場合 :
上 ま と め る と,
最 小 時 間 1 最 大 時 間 log2n 平 均 時 間 log2n-1+(log2n+2)/n
検 索不成功 の場合:
最 小 時 間 log2n-1 最 大 時 間 log2n 平 均 時 間 log2n
と な る.
ベ
7.4
最 適 2分 木 検 索
前 節 で学 ん だ 2分 検 索 は,フ
ァ イル 中 の お の おの の レ コ ー ドの 検 索 され る確
率 が すべ て 等 しい とい う仮 定 の も と に そ の 効 果 を発 揮 す る.一 般 的 に は,各 レ コー ドの 検 索 さ れ る確 率 は等 しい とは 限 らな い .た に 空 白(_で 示 す 〉を 加 えた27文
と えば,英
文 中の A か ら Z
字 の アル フ ァベ ッ トの 出現 確 率 は,表7・1の
よ
うに 各 文 字 に よ っ て大 き な差 が あ る.
表7・1
ア ル フ ァベ ッ ト頻 度 表
こ れ らの 文 字 を 2分 検 索 法 に よ る検 索 木 は 図7・9(a)の 索 の場 合 の 平 均 鍵 比 較 回 数 は4.22回
よ う に な り,成功 検
とな る.
この 場 合 の 検 索 木 の 改 善 方法 と して,頻 度 の 高 い 文 字 を検 索木 の 根 に 近 い 位 置 に配 置 す る方 法 が 考 え られ る.こ の 方 法 で検 索 木 を作 る と,図7・9(b)の に な り,鍵 の 平 均 比 較 回 数 は3.997回 の もの と同 じ(本 章7.3節
よう
とな り,検 索 の ア ル ゴ リズ ム は 2分検 索
の 2分 木 に対 す る検 索 アル ゴ リズ ム,お よび 図7・4参
(a)中
間 分 割 法 に よ る検 索 木
(b)頻
度 優 先 法 に よ る検 索 木
図7・9
照)で あ るの に もか か わ らず 計 算 時 間 は大 分 改 善 され て い る. こ の よ う に,同 わ っ て くる.で
じア ル ゴ リズ ム で あ って も検 索 木 が 異 な れ ば 計 算 の効 率 も変
は,ど の よ う な構 造 の検 索 木 で あ れ ば もっ と も効 率 が 高 くで き
るで あ ろ うか.最
適 木 は 求 め る こ とが で き るの で あ ろ うか.
最 適 木 を求 め る アル ゴ リズ ム の 検 討 に 入 る前 に,最 適 とい う基 準 は,今 と同 じ よ う に,与
まで
え られ た検 索 確 率 で 各 レ コー ドが ア クセ ス され た と きの平 均
鍵 比 較 回 数 が 最 小 と な る検 索木 を最 適 2分 検 索 木 と呼 ぶ こ とに して お こ う. 検 索 の 対 象 とな る レ コ ー ド数 を nと し,そ れ ぞ れ の レ コ ー ドは 木 の 内頂 点 と して表 現 され る.内 頂 点 は,そ の 検 索 鍵 の 小 さ い順 にIN1,IN2 れ ぞ れ の 頂 点 が 検 索 され る確 率 をp1,p2,…,pnと
,…,INnと し,そ
す る.こ の と き,外 頂 点n+1
個 をEN0,EN1,EN1,…,ENnと
し,そ れ ぞ れ の 外 頂 点 の 表 現 して い る 区 間 に 検 索 鍵
の 落 ち る 確 率 をq0,q1,q2,…,qnと
す る.こ
の とき
が 成 り立 つ. 最 適 化 の 目標 で あ る鍵 の 比較 回 数 C は
と表 現 さ れ る.た だ し,上 式 で のlevel[N]は
頂 点 N の レベ ル を 表 現 して い る.
C を最 小 に す る ア ル ゴ リズ ム の 実 現 の基 本 原 理 は,「 最 適 な 2分 検 索 木 の い か な る部 分 木 も ま た そ れ 自身 で 最 適 とな って い る」 とい う事 実 で あ る.こ の こ と は,も
し,最 適検 索 木 の あ る部 分 木 が最 適 と は な っ て い な い と仮 定 す る と,
そ の 部 分 木 を最 適 な部 分 木 で 置 き換 え て で き る検 索 木 は,最 適 検 索 木 よ りも少 な い平 均 比 較 回 数 とな り,こ れ は,元 の 木 が最 適 で あ る こ とに 矛 盾 す るこ とか ら明 らか で あ る.こ の 事 実 を利 用 して,小
さい最 適 部 分 木 か ら よ り大 きな最 適
部 分 木 を順 次 得 る方 法 を考 え る こ と に あ る. Tk,m(k<m)は
内 頂 点INk,INk+1,…,INmと,外
な る部 分 木 を表 現 して い る.w(k,m)は
頂 点EN0,EN1,EN2,…,ENmか
ら
こ の 部 分 木 に 検 索 走 査 が 入 っ て く る確 率
で,
で 表 さ れ,c(k,m)は
こ れ らの 部 分 木 の 中 で 最 適 な もの の 鍵 比 較 回 数 の 平 均 を表
現 す る も の と す る(図7・10(a)参
照).c(k,m)は,外
頂 点 で は鍵 が 比 較 す る
こ と が な い の で, c(k,k)=0 で あ り,こ の 部 分 木 の 根 と な り う る 頂 点 はINk+1か で,そ
らINmま
で の うちの いず れ か
の 中 で 比 較 回 数 の 平 均 値 が 最 小 と な る も の で,
とな る.な ぜ な らば,い
ま この 部 分 木 の 根 がIN1で あ る とす る と,検 索 走 査 が
こ の 部 分 木 に入 っ て くれ ば,IN1で 確 率 はw(k,m)で
必 ず 1回 の鍵 の 比 較 が 行 わ れ る の で,そ
の
あ る.IN1で の比 較 で 成 功せ ず に,さ らに検 索 が 続 く場 合 はIN1
(a)
(b)
図7・10
の 左 ま た は 右 部 分 木 へ と検 索 走 査 が 移 っ て 行 く.そ 合 の 平 均 比 較 回 数 を,c(k,1-1),c(1,m)と
れ ぞれの部分木 の最適 な場
す れ ば,こ の 部 分 木 で の 平 均 比 較 回
数 は w(k,m)+c(k,1-1)+c(1,m) と な る(図7・10(b)参 あ る か ら,Tk,mの
照).こ の 部 分 木 の 根 とな りう るの はINk,INk+1,…,INmで 中 で 最 適 部 分 木 と な る の はc(k,m)が
と な る と き で あ る.以
上 を ま とめ て
c(k,k)=0 … … …(3)
と な り,こ
の 二 つ の 式 が 最 適 2分 木 を 得 る ア ル ゴ リズ ム を 表 現 し て い る.し
し,こ の 式 の 表 現 して い る と お り に 再 帰 的 に プ ロ グ ラ ム す る と,同 し てc(k,m)を てのk,mに
か
じk,mに
対
何 回 も計 算 す る こ と と な り,途 方 も な く計 算 時 間 が か か る.す べ 対 してc(k,m)を
保 存 して お く記 憶 場 所 を 用 意 して お くと効 率 を上 げ
る こ と が で き る. c(k,m)の
計 算 回 数 は,0≦k≦n,1<kで
あ る す べ て の 組 合 せ に 対 して で
あ る か ら,必 要 とす る 記 憶 容 量 は(n-1)n/2≒n2/2でO(n2)の ま た,(3)式 ゆ え に,全
を 計 算 す る 回 数 は 与 え ら れ たk,mに
オ ー ダ とな る.
対 し てm-k+1回
で あ る.
体 と して
で あ り,c(k,m)を
記 録 し て お い た と し て も こ の ア ル ゴ リズ ム で はO(n3)の
計算
時 間 が か か る. 実 際 に 用 い ら れ て い る ア ル ゴ リズ ム は,こ の 方 法 の 詳 し い 説 明 と 解 析 は 省 略 し,そ
の 手 法 を さ ら に 改 良 して い る.そ
の着 眼 点 の 定 性 的 説 明 に と どめ て お こ
う. い ま,図7・11(a)のTi,j-1内
頂 点INrを
こ の 右 端 の 外 頂 点ENj-1を (b)の
根 と す る 最 適 部 分 木 で あ る と す る.
内 頂 点 に 変 え て,二 つ の 外 頂 点 を 付 け 加 え,図7・11
よ う な 最 適 部 分 木 を 求 め る と,そ の 根INr'は,元
移 動 す る の で,r≦r'が
成 立 す る こ と 容 易 に わ か る.
こ の 事 実 を 利 用 し て,頂 求 め る と き に は,(3)式
の 根 の 位 置 よ り も右 に
点 の 少 な い 部 分 木 に新 た に 頂 点 を追 加 した最 適 木 を で の 最 小 点 を 求 め る た め に 探 す 根 と な る頂 点 の 範 囲 が
縮 小 で き る. 図7・11(c)のTi,j-1,Ti+1,jが INr'で
あ る と す る と,INr≦INr'で
と も に 最 適 部 分 木 で あ り,そ れ ぞ れ の 根 がINr, あ る.こ
の 二 つ の 最 適 部 分 木 を もとに して,
(a)
(b)
(c)
図7・11
Ti,jの最 適 な もの を求 め る とき,根 r"を求 め るため の(3)式 のminを
探 す範 囲 は
rと r'の間 の範 囲 に縮 小 す る こ とが で き る.こ の 改 善 を加 え る と最 適 2分 探 索 木 を求 め る アル ゴ リズ ム の 計 算 時 間 はO(n2)に 図7・12は,以
改 善 で き る.
上 の ア ル ゴ リズム の 設 計 法 に従 っ て実 装 され た最 適 2分 探 索 木
を 求 め る手 順 で あ る.こ の プ ロ グ ラム で の デ ー タの 表 現 は; 配 列 p[i]
(1≦i≦n):内
頂点へ の検索確率
配 列 q[i]
(0≦i≦n):外
頂点 への検索確率
配 列 r[i,j]
(0≦i<j≦n):部
分 木Ti,jの 根 で あ る 頂 点 番 号
配 列w[i,j]
(0≦i≦j≦n):部
分 木Ti,jが 検 索 さ れ る 確 率
配 列c[i,j]
(0≦i≦j≦n):部
分 木Ti,jで
で あ り,Ti,jの はi=jの
頂 点 間 の 関 係 は す べ てr[i,j]に
と き は 空 木 で あ り,i<jの
の 根 はr[i,r[i,j]-1]で,右
の平均比較回数
含 ま れ て い る.す
場 合,頂
点 はr[i,j]で,r[i,j]の
部 分 木 の 根 はr[r[i,j],j]で
図7・12(そ
の 1)
な わ ちTi,j 左 部分木
表 現 さ れ て い る.
図7・12(そ
こ の プ ロ グ ラム に,表7・1の
の 2)
デ ー タ を 与 え て(q(i)=0,0≦i≦nと
す る),英
字 ア ル フ ァ ベ ッ トの 各 文 字 へ の 最 適 2分 検 索 木 を計 算 し て み る と,図7・13の
よ
う に 求 め る こ と が で き る. こ の と き の 平 均 比 較 回 数 は3.285と
な り,図7・9の
さ くな っ て い る こ と が わ か る で あ ろ う.
図7・13
二 つ の 場 合 よ り もか な り小
7.5 デ ィジタル検 索 検 索 鍵 が 与 え られ た と き,そ れ と等 しい鍵 を持 つ レ コー ドの 有 無 を調 べ,も しあ る とす れ ば,そ
の 位 置 を見 つ け 出 す とい うの が,検
索 の 定 義 で あ っ た.
前 節 ま で の 検 索 の 方 法 は,な ん らか の順 番 に従 っ て 順 に レ コー ドを取 り出 し, そ の レ コ ー ドの 鍵 と照 合(matching)す
る手法 を取 っ て い る.こ の 方 法 で は,検
索 が 成 功 で あ るか 不 成 功 で あ る か の 判 定 が さ れ て か ら,レ コ ー ドの位 置 が 確 定 した. こ れ に対 して,検
索 鍵 を表 現 して い る符 号 か ら直 接 また は代 数 的 な計 算 をす
る こ と に よっ て 検 索 の 対 象 とな る位 置 を求 め る方法 が あ る.そ の 位 置 に レ コー ドが あ れ ば,検 索 は 成 功 で あ り,な け れ ば 不 成 功 と な る.こ の よ うな検 索 方 法 を デ ィジ タ ル 検 索(digital
7.5.1
search)と
呼 ん で い る.
デ ィ ジ タ ル 検 索木
検 索 に便 利 な木 構 造 をデ ィジ タ ル検 索 に取 り入 れ た例 と して有 名 な の が デ ィ ジ タ ル 検 索 木(trie構
造*)で あ る.
デ ィ ジ タル 検 索 木 は,文 字 とか 数 字 とか の 記 号 の 不 定 長 の 列,つ
ま り,単 語
ま た は 短 文 を鍵 とす る検 索 に適 して い る.鍵 が n種 類 の 記 号 の 列 か らな って い る とす る と,trie構
造 は 本 質 的 に は n分 木 の 構 造 と な っ て い る.鍵 の 照 合 に よ
る木 の 検 索 と本 質 的 に異 な る とこ ろ は,あ
る頂 点 か ら次 の 頂 点 へ と検 索 が 移 っ
て行 くと きの 次 の 頂 点 を選 ぶ 基 準 が,鍵 の 照 合 で 決 まる の で は な く,鍵 を構 成 して い る符 号 列 に よ って 決 ま る こ とで あ る.た
と え ば,英 単 語 が 検 索 の 鍵 で あ
る場 合 の デ ィ ジ タ ル検 索 木 を考 え て み よ う. 各 頂 点 は 図7・14の
* E.Fredkinが はtreeと
よ う に,検 索 す る内 容 と次 の 検 索 の ため の ポイ ンタ配 列 か
提 唱 した 方法 で,名 前 の 由来 はretrievalの
同 じで あ っ た が,混
中 のtrieを
同 を避 け るた め に近 年 で はpieと
取 った もの で あ る.発 音
発 音 す る よ うに な った.
(a)デ
ィジ タル 検 索 木 の 頂 点 の 定 義 例
(b)デ
(c)デ
ィ ジ タル 検 索 木 の 頂 点
図7・14デ
ィ ジ タル検 索 木 の 例 ィジ タ ル 検 索 木
ら な っ て い て,配 列 の添 え字 は鍵 の 記 号 とな って い る. 図7・14(c)の
検 索 木 で,単 語treeを 鍵 とす る レ コー ドを検 索 す るた め には,
最 初 に検 索 木 の 根 に お い て最 初 の 文 字 tの フ ィー ル ドの ポ イ ンタ を た ど り,次 の 頂 点 で 文 字 rに 対 す る ポ イ ン タ を,と い う よ う に続 け て,最 後 の eで 到 達 し た頂 点 の 中 に情 報 が 格 納 され て い れば,検 索 鍵treeに 対 す る検 索 は成 功 とな る. も し,途 中 で ポ イ ン タ列 が と ぎれ て しま っ た り,到 達 した 頂 点 内 に 情 報 の な い 場 合 は不 成 功 に終 わ っ た こ と に な る. デ ィジ タ ル 検 索 木 の 特 徴 は,検 索 の アル ゴ リズ ム が 簡 単 で か つ 効 率 が よ い こ とで あ るが,記 憶 容 量 の 非経 済 性 が 欠 点 で あ る.実 用 化 され て い るデ ィジ タ ル 検 索 木 で は,不 要 な 深 さ まで の検 索 を避 け るた め に,鍵 の 照 合 法 と組 み 合 わせ て 記 憶 容 量 の 縮 小 化 を図 っ て い る. 図7・14(c)の
例 の場 合,各 頂 点 の レコー ドに も鍵 の フ ィール ドを設 け てお き,
ポ イ ン タ の と ぎれ た 頂 点 で鍵 の 照 合 を行 う.こ の例 で,先 頭 のtrま で が 同 じで あ る鍵 が,trueとtreeし
か な い 場 合,truま
treま で 検 索 す れ ばtreeの
で検 索 す れ ばtrueの
レ コ ー ドに,
レ コー ドに到 達 す る よ うにで き る(図7・15参
照).こ
の よ う な検 索 枝 の縮 小 の ほ か に,検 索 木 を配 列 構 造 に す る な ど の 方法 に よ り記 憶 容 量 の縮 小 化,お
よび 長 い鍵 に対 す る 高 速 化 を図 っ て い る.
図7・15
7.5.2 ハ ッ シ ュ 検 索 検 索 鍵 か ら高 速 か つ一 定 時 間 で そ の レ コー ドの 格 納 位 置 が計 算 で きれ ば検 索 自体 が ラ ン ダム ア ク セ ス の機 能 を持 つ よ う に で き る.こ の よ うな 高 速 ラ ンダ ム ア ク セ ス検 索 で,な
お か つ検 索 され る レ コー ドの 数 が 刻 々 変化(多
単 調 に 増 加 す る)す る よ う な動 的検 索 の 場 合 に は,ハ ッ シ ュ(hash)法
くの 場 合 は が用 い ら
れ る こ とが 多 い, ハ ッ シ ュ法 で は,検 索 鍵 K に 対 して そ の 鍵 を持 つ レ コー ドは,ラ セ ス フ ァイル 内 のh(K)の
ンダムアク
位 置 に格 納 され てい る,h は検 索 鍵 の集 合 を定 義 域 と
し,フ ァ イル の 位 置(番 地)を 値 域 とす る関 数 で,ハ ッ シ ュ関 数 と呼 ば れ て い る. ハ ッ シ ュ関 数 に要 求 され る特 性 は ,関 数 値 の計 算 時 間 が で き る だ け 速 い こ と, 関 数 の 引 数 に よ っ て計 算 時 間 が 変 わ らな い こ とな どの ほ か に,も っ と も重 要 な こ とは, if K1≠K2, then h(K1)≠h(K2) で あ る こ とで あ る.つ ま り,異 な る鍵 を持 つ レ コ ー ドは 異 な る位 置 に格 納 され な け れ ば な ら な い こ とで あ る.し か しな が ら,フ
ァイ ル の 大 きさM に対 して 鍵
の 種 類 N は あ らか じめ わ か って い な いの が 普 通 で あ るか ら,ま たM>Nで
あっ
て さえ も,N が 統 計 的 に 大 きな場 合 の 数 を持 つ と きは,異 な っ た鍵 が 異 な った 位 置 に 対 応 させ るの は む ず か しい. そ の 事 実 を示 す 例 と して,簡 単 な ク イ ズ に 挑 戦 して い た だ こ う.「 何 人 か の 人 を無 作 為 に抽 出 した と き,こ れ らの 人 々の 誕 生 日が す べ て 異 な る確 率 が 5割 以 下 とな る 人 数 は幾 人 で あ るか 」 とい う問 題 で あ る.こ れ は,バ ドッ ク ス(birthday
paradox)と
ー ス デ イパ ラ
呼 ば れ て い る が,人 間の この 種 の 問 題 に対 す る
直 感 の 不 確 か さ を突 い て い る. 答 は23人 で,そ の ときの確 率 は0.4927で 合 で も,ハ
あ る.つ ま り,M=365でN=23の
場
ッシ ュ関 数 が ラ ン ダム な 写 像 をす れ ば,格 納 位 置 が 重 な る可 能 性 は
5割 を超 え て し ま うの で あ る.こ の 異 な る鍵 の 格 納 位 置 の 重 な りへ の 対 処 は, 避 け て通 れ な い 問題 だ が,後
で 詳 し く触 れ る こ とに して,ま
ず最 初 はハ ッシ ュ
関 数 に つ い て 検 討 す る. 検 索 鍵 は ハ ッ シ ュ 関 数 の 引 数 と す る と き は,計 と し て 扱 わ れ る.検 (Pascalに
算 機 内 部 表 現 な ど に よ り整 数
索 鍵 K を整 数 表 現 し た 値 を,order(K)で
お け るord関
数 と 同 じ よ う な 動 作 を す る が,異
表 す ことにす る な っ た 関 数 で あ る).
探 索 鍵 の 集 合 の 大 き さ は,フ
ァ イ ル の 寸 法 に 比 べ て 一 般 的 に 大 き い.そ
以 下 の 議 論 で はorder(K)は
整 数 全 体 に わ た っ て 変 化 す る も の と し て お く.
ハ ッ シ ュ 関 数 は,計
算 の 高 速 化 の た め に簡 単 な 算 術 演 算 だ け で 実現 され て い
る.整 数 全 体 を 0 か らM-1の 算 で あ る.こ
の と き,ハ
間 の 整 数 に 写 像 す る もっ と も簡 単 な機 能 はmod演 ッ シ ュ関 数 は
h(order(K))≡order(K)mod と 定 義 で き る.こ
こ で,
M
の 場 合 の M の 選 び 方 は,以
下 に 箇 条 書 き した よ うな 注 意 が 必
要 で あ る. (1)M
を 計 算 機 の 基 数(2 進 計 算 機 の と き は2,10進
に 選 ぶ べ き で は な い.そ
の 理 由 は,ハ
の と き は10)の
べ き乗
ッ シ ュ関 数 値 が 鍵 の尾 部 だ け で 決 ま
っ て し ま う か ら で あ る. (2)基
数 が10の
と き は,M
る 数 の 関 数 値 と,鍵
は 3の 倍 数 で な い ほ う が よ い,な
ぜ な ら ば,あ
の 一 部 の 文 字 を 入 れ 換 え た場 合 の 関 数 値 との 差 が 3の
倍 数 と な る か ら で あ る. (3)一
般 に,M は γk≠ ±a(mod
の 約 数 で な い ほ う が よ い.こ
M)(γ
は 計 算 機 の 基 数, k と a は 小 さな 数)
の こ と か ら,M
は γの べ き 乗 の ど れ か と近 く
な い 素 数 とす る の が よ い. (4)order(K)の part1,part2,…
値 はL, L+d, と かtypeA,typeB,…
L+2d,…,L+ndと
が あ る か ら で あ る.こ
な る傾 向 に あ る.こ れ は
と い う よ う な 名 称 が つ け られ る 可 能 性
の 問 題 の 対 策 と し て は,d
とM が 素 の 関係 に な る よ
う に す れ ば よ い. と な る.こ の(1)∼(4)の
注 意 か ら,h は 引 数 の あ ら ゆ る 近 さ と か 類 似 性 が 関 数
値 に 影 響 し な い も の で あ っ て 欲 し い こ と に な る.つ
ま り,関
数 値 が,引
数 のあ
ら ゆ る 近 さ の 概 念 か ら の 独 立 で あ る こ と(ラ ン ダ ム 性)が 重 要 と な る.ハ
ッシ ュ
(hash:切
り刻 ん で か き混 ぜ る)と 言 う名 もこの ラ ン ダ ム性 に起 因す る もの と思
わ れ る.ま
た,こ の 概 念 は疑 似 乱 数 の 生 成 の 条 件 と似 て い る.合 同法 に よ る一
様 乱 数 の 生 成 方法 と同 じよ う に,M=2mと
し,
h(order(K))≡(a・order(K)mod(2r-1-1))div
2r-m
とす る方 法 が 前 述 の ハ ッ シ ュ 関数 よ り もよ い独 立 性 を示 す もの と して利 用 され て い る.こ
こで の aは 合 同 法 に よ る一様 乱 数 に 用 い られ る定 数 で,r
は計算機
の 1語 の 長 さ(ビ ッ ト長)で あ る.上 式 で の 除算 は 被 除 数 の 上 位 m ビ ッ トを取 る こ と表 現 して お'),実 て い な いPascalで
際 に 除算 は行 わ れ な い(た だ し,ビ ッ ト演 算 が 用 意 され
は,除 算 を行 わ な けれ ば な らな いの で 高 速 化 は む ず か し くな
る). 先 に 述 べ た ハ ッシ ュ検 索 で の も う一 つ の 大 きな 問 題 点 は,異 同 じ格 納 位 置 が 与 え られ て し ま う こ とで あ る.つ h(order(K1))=h(order(K2))
な る鍵 に 対 して
ま り,
(K1≠K2)
とな って し ま う場 合 に い か に対 処 す る か とい う問 題 で あ る.こ の 問 題 は,ハ シ ュ法 の 衝 突(collision)問
題 と呼 ば れ て い る.前
に も述 べ た とお り,ハ
ッ
ッシ
ュ法 は 動 的 検 索 に 用 い られ る こ とが 多 い. そ こで,こ 有 無 を調 べ,も
こ で の 検 索 の 定 義 を 「与 え られ た 鍵 に対 応 す る レ コー ドの 記 録 の しあ っ た場 合 は そ の レコ ー ドの 格 納 位 置 を,な か っ た場 合 は記
図7・16
録 す べ き 情 報 を 求 め て そ れ を レ コ ー ドに 形 成 し適 当 な 格 納 位 置 に 挿 入 し・ そ の 後 に そ の 位 置 を 持 ち 帰 る 」 と し て お こ う. 衝 突 問 題 の 対 処 の 方 法 に は,動 して い る.そ
の 方 法 に は,大
的 に レ コ ー ドの 記 録 す る ア ル ゴ リ ズ ム に 関 連
き く分 け て 2種 類 の 方 法 が あ る.
そ の 一 つ は,開 か れ た ハ ッ シ ュ(open
hashing)法
と 呼 ば れ て い る も の で,基
本 的 に は 検 索 を純 粋 に ハ ッ シ ュ 法 だ け に 頼 ら ず に 鍵 の 照 合 法 を 併 用 す る 方 法 で あ る.ハ 表 で,ハ
ッ シ ュ さ れ る フ ァ イ ル は 鍵 と 情 報 を 格 納 し た レ コ ー ドへ の ポ イ ン タ の ッ シ ュ テ ー ブ ル(hash
レ コ ー ドは,同 (linear HTと
linked
table)と
呼 ば れ る 配 列 構 造 で あ る こ と が 多 い.
じハ ッ シ ュ 関 数 値 を持 つ レ コ ー ドの 線 形 リ ン ク 結 合 リ ス ト list)を 形 成 し て い る(図7・16参
す れ ば,こ
らば,そ の 鍵 に 対 応 す る レコー ドは 存 在 しな
た に レ コ ー ド を形 成 し そ の レ コ ー ドへ の ポ イ ン タ をpntと
と,HT[h(order(K))]:=pntと
す る
す る.
(2)HT[h(order(K))]で
与 え られ た リン ク結 合 リス トの 先 頭 か ら順 次 鍵 を比
較 しな が ら巡 回 し て ゆ き,鍵 り,さ
ッシュテーブル の名 を
の検索 の手順 は
(1)HT[h(order(K))]=nilな い の で,新
照).ハ
も な け れ ば,(1)の
の 一 致 す る レ コ ー ドが あ れ ば 検 索 は 成 功 で あ
場 合 と 同 じ よ う に 新 し い レ コ ー ド を 形 成 し て,
同 じハ ッ シ ュ 値 を 持 つ リ ン ク 結 合 リス トの ど こ か に(多
くの 場 合 は 先 頭 に)
挿 入 す る. と な る.こ
の 方 法 の 特 徴 は,実
際 に 格 納 さ れ る レ コ ー ドの 数(鍵
は な い)が
ハ ッ シ ュ テ ー ブ ル の 寸 法 よ り も大 き な 場 合,ま
い な い 場 合 な ど に は 便 利 で あ る が,レ の 長 さ が 長 く な る と,効 図7・17は,こ ム の 中 でHTは
の種類 の数で
た は上 限 が 定 ま っ て
コ ー ドが 増 え 過 ぎ て り ン ク構 造 の リス ト
率 が 悪 くな る.
の 開 か れ た ハ ッ シ ュ 法 の 実 装 例 で あ る.た だ し,こ の プ ロ グ ラ ハ ッ シ ュ テ ー ブ ル 名,getrecordは
検 索 鍵 を 引 数 と し,そ
の検
索 鍵 に 対 応 す る 新 し い レ コ ー ド を 形 成 し値 と す る 関 数 で あ る もの と す る. 開 か れ た ハ ッ シ ュ 検 索 の 効 率 に つ い て 考 え よ う. ハ ッ シ ュ テ ー ブ ル の 寸 法 M,格
納 さ れ て い る レ コ ー ド数 を N す る と,リ
ンク
構 造 リス トの 平 均 の 長 さ はN/Mと
な るか ら平 均 計 算 時 間 T は
T=th+tc
とな る.た だ し,thは ハ ッ シ ュ テ ー ブ ル を検 索 す る の に要 す る 時 間 で あ り,こ れ は N に依 存 しな い 一 定 時 間 で あ る.ま た,tcは
リン ク構 造 リス トを順 次検 索
す る場 合 の 平 均 時 間 で,前 章 で 学 ん だ よ うに,検 索 に成 功 す る場 合 は リス トの 平 均 長 の1/2,つ
まりN/(2M)回
鍵 を照 合 す る時 間 が 必 要 で,不 成 功 の場 合 は
図7・17
N/M回
の 照 合 時 間 と な る.
こ の こ と か ら,N
の 大 き さ が M と ほ ぼ 同 じ程 度 か そ れ 以 下 の と き は,一
間 で 検 索 で き る と い っ て よ い が,N が 増 加 す る に 従 っ てO(N)と ア ク セ ス と は い え な くな っ て き て,他 のO(log
N)の
定時
な り,ラ ン ダ ム
検 索 方 法 よ り も効 率 が 低 下
し て し ま う. 第 二 の 方 法 は 閉 じ ら れ た ハ ッ シ ュ 法(closed
hashing)と
レ コ ー ド は す べ て ハ ッ シ ュ テ ー ブ ル の 中 に 記 憶 さ れ る.こ
呼 ば れ,検 索 さ れ る の 場 合 は,記
憶 され
る レ コ ー ド数 は ハ ッ シ ュ テ ー ブ ル の 寸 法 M よ り も 少 な く な け れ ば な ら な い.こ の 場 合,衝 す る.こ
突 が 起 こ っ た と き に は,テ
ー ブル の 空 い て い る ど こか の 場 所 に格 納
の よ う な 位 置(番 地)の 割 り振 り方 を 空 域 割 り振 り(open
addressing)
と 呼 ん で い る. こ こ で は 2種 類 の 方 法 を 紹 介 す る.そ 法 と 呼 ば れ,以
の 一 つ は,順
次 検 証(linear
probing)
下 の デ ー タ 構 造 と ア ル ゴ リ ズ ム で 表 現 さ れ る.
type
table_range=0..(M-1); item=record key:searching_key; cont:searching_information; end; hash_table=array
[table_range]of
item;
var
HT:hash_table; K:searching_key; 空 域 割 り振 り法 に よ る ハ ッ シ ュ 検 索 ア ル ゴ リ ズ ム 1 Step
1:Set
Step
2:If
Step 3:If
pos←h(ord(k)). HT[pos].key=K HT[pos]is
then empty
then
terminate there
are
K.Compute
successfully, no
records
associated
to
a record associated to K
and put it at HT else
set
こ の 方 法 は,ア
pos←(pos+1)mod
M
and
[pos],
goto
Step2.
ル ゴ リ ズ ム が 簡 単 で 格 納 さ れ て い る レ コ ー ド数 が ハ ッ シ ュ テ
ー ブ ル の 寸 法 に 比 較 し て 少 な い と き は 有 効 な 方 法 で あ る が ,レ くな っ て く る と,ハ
コ ー ド数 が 大 き
ッ シ ュ テ ー ブ ル の 中 に 連 続 し た 使 用 領 域 が 大 き くな り,も
っ と も効 率 の 悪 い 順 次 検 索 の 傾 向 を 帯 び て く る. 第 2の 方 法 は,再
ハ ッ シ ュ(rehashing)法
と呼 ば れ て い る も の で,空
振 り法 に よ る ハ ッ シ ュ 検 索 ア ル ゴ リズ ム 1のStep3のelse部 else
set
と 変 え る だ け で,そ
pos←h'(pos)and
goto
域 割 り
分 を
Step2.
の 他 は デ ー タ 構 造 を 含 め て 同 じ で あ る.
h'は 再 ハ ッ シ ュ 関 数 と 呼 ば れ る ハ ッ シ ュ テ ー ブ ル の 添 え 字 領 域 を 定 義 域,値 域 とす る 関 数 で あ る.こ
の 関 数 に 求 め ら れ る 性 質 は,ハ
え て,Step2,
ル ー プ でposが
Step3の
長 く し な け れ ば な ら な い こ と で あ る.一
ッ シ ュ 関 数 の 性 質 に加
同 じ値 に 戻 っ て く る 周 期 を で き る だ け 般 に 多 く用 い られ て い る再 ハ ッ シ ュ関
数 は
h'(pos)=(pos+c)mod の 形 式 と な っ て い る.M か な るc(<M)に と は,ハ
M
が 素 数 で あ る と き に は,フ
対 し て も周 期 がMで
ェ ル マ ー の 定 理 に よ りい
あ る こ とが 証 明 で き る.周 期 が M で あ る こ
ッ シ ュ テ ー ブ ル に 一 つ で も 空 き 領 域 が あ れ ば,新
た な レ コ ー ドを格 納
す る こ と が で き,記 憶 領 域 の 有 効 な 利 用 が 可 能 で あ る こ と を 示 して い る.ま た, 前 述 の 順 次 検 証 法 は,こ
の 再 ハ ッ シ ュ 関 数 でc=1と
した場 合 に 当 た って い る
こ と は 容 易 に わ か る で あ ろ う. 閉 じ られ た ハ ッ シ ュ 法 の 場 合,ハ た さ れ て し ま う と,オ
ッ シ ュ テ ー ブ ル が レ コ ー ドで い っ ぱ い に 満
ー バ ー フ ロ ー と な り,さ
ら に新 た な レ コー ドを追 加 す る
こ と が で き な くな る の で,ア
ル ゴ リズ ム に も オ ー バ ー フ ロ ー の 検 出 ル ー チ ン を
備 え な け れ ば な ら な い が,テ
ー ブ ル の 充 足 率 が 1 に 近 く な る と,検
極 端 に 悪 く な る の で,そ て い る こ と が 望 ま し い.
の よ う な 状 況 に な ら な い よ う に,あ
索の効率 は
らか じめ 設 計 さ れ
再 ハ ッ シ ュ 法 の 検 索 時 間 を 解 析 し て み よ う.い が M で あ り,N
ま,ハ
ッ シュ テ ー ブ ル の 寸法
個 の レ コ ー ドが す で に テ ー ブ ル 内 に あ り, n+1番
目の 新 しい
レ コ ー ド を 挿 入 す る 場 合 を 考 え る. 最 初 の ハ ッ シ ン グ で 空 き領 域 に 当 た る確 率P1は(M-N)/Mで 確 率 はN/Mで
あ り,衝 突 とな る
あ る.最 初 に 衝 突 を 起 こ し,次 の 再 ハ ッ シ ュ で 空 き領 域 と な る場
合 を 考 え る. 再 ハ ッ シ ュ で は,前
に ア ク セ ス し た レ コ ー ドに は 当 た ら な い こ と が 保 証 さ れ
て い る の で,対 象 と な る テ ー ブ ル の 総 数 はM-1,レ
コ ー ド数 はN-1で
ら,空 き 領 域 に 当 た る確 率p2は(N/M)((M-1-N+1)/(M-1))で 以 下 同 様 に し て,i
あ るか あ る.
回 目 に 空 き 領 域 の 当 た る 確 率Piは,
とな り,1 回 の ハ ッ シ ング ご と に 1回 の鍵 の 照 合 を行 う の で 平均 比較 回 数 は
よっ て,不
成 功 に終 わ る検 索 の 場 合 の 平 均 比 較 回 数 が求 め られ た.
検 索 に 成 功 す る場 合 は,お の お の の レコ ー ドを検 索 す る確 率 が 等 しい もの と 仮 定 す る.あ
る レ コー ドを検 索 す る と きは,そ の レ コー ドを書 き込 ん だ と き と
同 じ回数 鍵 の 比 較 を行 うの で,平 均 比 較 回 数 は
こ こ で,
(γ:オ
で あ る か ら,
と な る.
イ ラ ー(Euler)の
定 数)
図7・18
充 足 率 a に 対 す る 平 均 鍵 比 較 回 数 を グ ラ フ に す る と,図7・18の こ の グ ラ フ か ら わ か る よ う に,成
功 検 索 の 場 合 に はa<0.8で
シ ュ の 回 数 は 少 な く実 用 的 で あ る が,α>0.8と 不 成 功 の 場 合 は,そ
の 境 界 は0.6∼0.7の
よ う に な る. あ れ ば,再
ハ ッ
な る と急 速 に 効 率 が 悪 く な る .
近 辺 に あ る よ う で あ る.
第 7章 練習問題
1.第
7章7.1節
の 説 明 文 に あ る1000000以
で あ る こ と を 利 用 し て,こ
下 の 素 数 の 間 隔 の1/2が64以
下
れ らの 素 数 を で き る だ け 少 な い 記 憶 容 量 で 記 録 す る
方 法 を 考 え よ.
2.各
頂 点 の 検 索 確 率 が 等 しい 最 適 2分 検 索 木 の 内 点 の 数 が n で あ る と き,外
点 の 数 はn+1で
あ る こ と を 示 しな さ い.ま たn+1個
ベ ル に2q-(n-1)頂
点,q-レ ベ ル に2(n+1)-2q項
だ し,q=〓log2n」
で あ る.
3.3
点 と な る こ とを 証 明 せ よ.た
種 類 の 検 索 鍵 を持 つ 2分 検 索 木(検 索 鍵A,B,C間
あ る)に
の 外 点 の うち,(q-1)-レ
に はA
る関 係 が
つ い て 以 下 の 問 い に 答 え よ.
(1)内
頂 点A,B,Cを
(2)各
頂 点 で 検 索 鍵 を 比 較 す る 回 数 を,検
内 頂 点A,B,Cで
持 つ 検 索 木 の す べ て を 示 せ. 索 に 要 す る コ ス ト と す る と き,
成 功 検 索 と な る確 率 を そ れ ぞ れPA,PB,PCと
外 頂 点 で 不 成 功 とな る確 率 は それ ぞ れq
し,4 種 類 の 各
す る と き,(1)で
求
め た 各 木 の コ ス ト を 求 め よ.
4.英
文 字 の ア ル フ ァ ベ ッ ト26文
字 か らな る単 語 用 の デ ィ ジ タル 検 索 木 を設 計
し そ れ に あ っ た 検 索 ア ル ゴ リ ズ ム を プ ロ グ ラ ム し な さ い.
5.配
列 構 造 の フ ァ イ ル 上 の 2分 検 索 で,検
索 対 象 範 囲 の 中 点 を 求 め る の に,
範 囲 の 上 限 と 下 限 の 和 を 2で 割 る と い う 整 数 上 の 除 算 を し な け れ ば な ら な い. 検 索 ア ル ゴ リズ ム の 中 で こ の 除 算 に 費 や す 時 間 の 比 率 が 大 き い こ と か ら,除
算
を 用 い ず に,加
減 算 だ け で 同 等 の 効 果 を も た ら す 方 法 の 一 つ に,フ
検 索(Fibonacci 参 照)に
search)が
あ る.こ
れ は フ ィ ボ ナ ッ チ 数 列(第
基 づ い た 検 索 木 を 用 い る.フ
ィボ ナ ッチ
2章 練 習 問 題 3
ィボ ナ ッチ検 索 木 は次 の よ う に 定 義 され
る. (a)(基
本)0 次,1 次 の フ ィ ボ ナ ッ チ 検 索 木 は,図7・19(a)の
よ う に,そ れ
ぞ れ 単 一 の 外 頂 点 か ら な る木 で あ る. (b)(帰
納)(k-1)次,(k-2)次
の フ ィ ボ ナ ッ チ 検 索 木 が 与 え られ た と き,k
次 の フ ィ ボ ナ ッ チ 検 索 木 は,図7・19(b)の
(a)
よ う に 与 え ら れ る.
(b)
図7・19
(1)次
の フ ィ ボ ナ ッ チ 検 索 木 を 示 せ.
(2)フ
ィ ボ ナ ッ チ 検 索 木 に お い てFjが
検 索鍵 と して与 え られ た ときの 検 索
ア ル ゴ リズ ム を 示 せ.
6.ほ と ん どの 計 算 機 に は,初 期 値 を指 定 で き る*乱 数 生 成 関 数 が 用 意 され て い *乱
数生 成 関 数 に は,2 種 類 の 引 数 を持 つ もの が あ る.そ の 一 つ は,合 同 式 の 乗 数(203ペ
合 同 式 のorder(K)に
ー ジの
あ た る)の 初 期 値 の 指 定 で あ り,他 の 一 つ は 乱数 生 成の そ の 乗数 を乱 数 生 成
ご と に変 化 させ るか 否 か の指 定 を す る引 き数 で あ る.乗 の 1回だ け指 定 す る か,ま
た は,引
数 を 毎 回 変 化 させ る場 合 は,乗 数 は最 初
き数 は ま っ た く指 定 しな い で よ い.こ の 問 題 の 場 合 は,乗
と して は検 索 鍵 の 数値 符 号 を毎 回指 定 す る 方法 を取 る.
数
る.こ の 乱 数 生 成 関 数 を用 い て0..999の
区 間 の値 域 を持 つ ハ ッ シ ュ関 数 を設 計
・実 装 し,そ の性 能 を ラ ン ダム に選 ん だ検 索 鍵 や,頭
部 や 尾 部 が 同 じ類 似 度 の
高 い検 索鍵 な どの テ ス トデ ー タ に よる性 能 試 験 を して み よ.
7.検
索 鍵 に 順 序 が つ け ら れ な い レ コ ー ド,ま
化 す る よ う な 場 合 も考 え ら れ る.こ 定 性 検 索(nondeterministic 一 つ に 深 さ 優 先 検 索(depth デ ー タ 構 造 に つ い て 調 べ よ.
た は 検 索 の 途 中 で 検 索 目標 が 変
の よ う な 検 索 を 行 う 方 法 は,一
search)と
呼 ば れ る.木
first search)が
般 的に非決
構 造 上 の 非 決 定性 検 索 の
あ る .そ の 検 索 方 法,使
用 され る
[8] 記憶の方式 と管理
8.1い
ろ いろ な記憶方式
計 算 機 を構 成 して い る記 憶 装 置 は,主 記 憶 装 置 で あれ 補 助 記 憶 装置 で あ れ, 基 本 的 に は あ る一 定 の大 き さか らな る単 位 記 憶 要 素 で 構 成 され て い る.お の お の の 記 憶 要 素 は,番 地(実 際 の 場 合 は複 数 の 番 号,た と きに は,ボ
リュ ー ム番 号,シ
リン ダ番 号,ト
ラ ッ ク番 号,セ
つ の 番 号)で 認 識 区別 さ れ る.ア ク セ ス の 方 法 は,そ な る で あ ろ うが,お
と え ば,磁 気 デ ィス ク の ク タ ー番 号 の 四
れ ぞ れ の機 器 に よ っ て 異
お まか に は配 列 構 造 に似 た構 造 で あ る.こ の 章 で の 以 下 の
議 論 で は,こ の よ う に番 地 で 区 別 され る記憶 装 置 の構 造 を基 本 構 造 と呼 ぶ こ と に す る. ハ ー ドウ ェ ア の 面 か らは,ほ ウ ェア の面 か ら見 る と,さ た とえ ば,あ
とん どの 記 憶 装 置 が基 本構 造 で あ るが,ソ
フト
ま ざ まな 種 類 の 記 憶 方 式 が利 用 さ れ て い る.
る一 定 数 以 下 な らば,任 意 の 数 の 文 字 を格 納 で き る可 変 長 レ コ
ー ド,検 索 鍵 に よ る ア ク セ ス が 可 能 で あ る索 引 フ ァイ ル,Lispに
見 られ る よ う
な あ る特 定 の 記 憶 単 位 の 構 造 を持 った 記 憶 構 造,必 要 な と き に必 要 な 量 の 記 憶 要 素 が 取 れ,ま
た そ の 記 憶 要 素 が 不 要 に な っ た と きに は捨 て 去 る こ とが で きる
動 的 記 憶 構 造 な どで,そ れ ぞれ の 目的 に応 じて使 い分 け られ て い る. 基 本構 造 の 記 憶 装 置 の ほ か に,ス
タ ッ ク,キ
ュー 程 度 の 簡 単 な構 造 の ハ ー ド
ウ ェ ア を用 意 して い る計 算 機 もあ るが,先 は,ソ
に あ げ た い ろ い ろ な 方式 の 記 憶 構 造
フ トウ ェ ア の 助 け を借 りて基 本 構 造 の記 憶 装 置 の う えで 実現 され た もの
で あ る.た と え ば,UNIX*の
シス テ ム で は 実 際 の デ ィス ク ア クセ ス は512バ
の 固 定 した 単 位 で 行 わ れ,種
イト
々 の フ ァ イル の特 徴 はバ ッフ ァ上 の取 り扱 い で そ
れ ぞ れ の機 能 を実 現 して い る. これ らの 記 憶 方 式 や そ の 管 理 方法 に は,多 応 用 され て い て 興 味 深 くあ る が,詳
くの デ ー タ構 造,ア ル ゴ リズ ム が
し く取 り上 げ る に は専 門 的 す ぎ本 書 の 範 囲
を超 え るの で,詳 細 は 別 の 文 献 を参 照 して い た だ き た い.し か し,Pascalで
プ
ロ グ ラ ミン グ す る に あ た り,そ の 処 理 方法 を知 っ て い る と,そ の 言 語 機 能 を十 分 に 引 き出 す こ とが で き るの は い う まで もな い こ とで あ る.こ の 章 の 目的 は, Pascalの
各 種 の 記 憶 方 式 や その 管 理 方法 を知 り,よ り よい プ ロ グ ラ ミン グの 助
け とす る こ と な ど を取 り上 げ て 検 討す る こ と に あ る. た だ注 意 す るこ と は,Pascalは
プ ロ グ ラ ム言 語 の 規 約 で あ っ て,そ の処 理 方
法 につ い て は 規 定 して い な い.結 果 さ え正 しけれ ば,計 算 の 方法 が ど うで あ ろ う と 自由 で あ る.以 下 に述 べ る実 装 の 方 法 は,厳 密 に はPascalの
処理系 実装の
一 例 にす ぎな い.ま た,記 憶 方 式 の 実 装 は 主 記 憶 装 置 内 の バ ッフ ァ上 の 処 理 方 式 に還 元 され る こ とが 多 い の で,以 下 の議 論 で は主 記 憶 装 置 上 の 処 理 に 限 定 し て 考 える もの とす る.
8.2Pascalに Pascalの
おける可 変長 レコー ドの 記憶方 式
レ コー ド型 の デ ー タ は,一 般 的 に 固 定 フ ィー ル ド部 と可 変 フ ィー ル
ド部 か ら成 る.固 定 フ ィー ル ド部 だ け か ら成 る レ コー ドの 場 合 に は,各
レ コー
ドの 寸 法 は一 定 と な り,コ ンパ イル 時 の 記 憶 領 域 割 り付 け の 問 題 は 生 じな い. 可 変 長 の レ コ ー ドを用 い る利 点 は,ま ず 第 1に記 憶 領 域 の有 効 な利 用,第 場 合場 合 に よ っ て 異 な る構 成 の デ ー タ を適 切 に表 現 し,誤 * UNIXは,米
国 ベ ル 電 話 会 社 の 登 録 商標 で あ る.
2に
りの 指 摘 が た や す い
よ うに す る こ と に あ る.シ ス テ ム の大 き さ を気 に しな い利 用 者 に は む しろ第 2 の利 点 の ほ うが 重 要 か も しれ な い. 例 と して,次
の よ うな 仕様 の 個 人 レ コー ドを 考 え よ う.
図8・1個
人 レ コ ー ド仕 様
こ の個 人 レ コー ドを固 定 フ ィー ル ド部 だ け か らな る レ コー ドで表 現 す る と, 図8・2(a)の
よ うに な り,どの よ うな場 合 に も空欄 の フ ィール ドが 生 じて 記 憶 領
域 の む だ 使 い とな る. 可 変 フ ィー ル ド部 を 導 入 す る と,図8・2(b)の
よ うに むだ な領 域 が な くな り,
非 常 に効 率 的 な 記 憶 利 用 が で きる.し か しなが ら,場 合 場 合 に よっ て 可 変 部 の 寸 法 が 変 わ る よ う な と き に は問 題 が あ る.可 変 部 を持 つ レ コー ド型 の 変 数 に対 す る領 域 の 割 り付 け は,コ 判 明 して い な い の で,各
ンパ イル 時 に どの 寸 法 の 可 変 要 素 が 格 納 され るか が
可 変 要 素 に対 応 で き る よ うな 記 憶 の 割 り付 け を しな け
れ ば な らな い. こ の 問 題 の 解 決 方 法 の ヒ ン トは,Pascalの
文 法 の 以 下 に 示 す 項 に あ る.可 変
要 素 の 解 釈 は紛 ら わ し く覚 え に くい の で,少
し詳 し く触 れ る こ とにす る.規 約
(a)固
(b)可
定 フ ィ ー ル ド に よ るpersonレ
変 フ ィ ー ル ド付 きpersonレ
コー ド
コー ド
図8・2
に よ る と,「 レ コ ー ド型 の デ ー タ の ア ク セ ス(書 に は,そ た,レ
き 込 み,読
み 出 し)を す る と き
の 可 変 部 が ど の 形 式 の も の で あ る か 確 定 して い な け れ ば な ら な い.ま
コ ー ドの 変 化 形 が 再 定 義 さ れ る と,以 前 の フ ィ ー ル ドデ ー タ は 消 失 す る 」
と な っ て い る. た と え ば,図8・2(b)の
レ コ ー ド変 数 X に 対 し,
X.state:=married; X.name
X.date
…
_of_spouse:=’Hanako’
…
_of_sp_birth.yy:=61;
…
…(2)
}
… … …(3)
X.date_of_sp_birth.mm:=1; X.date_of_sp_birth.dd:=15; の 順 で 実 行 す る と き に は 問 題 が な い が(2),(3),(1)の
順 で 実 行 す る と,こ の
文 の 実 行 の 直 前 の 時 点 で の X の 変 化 形 がmarriedに り と な り,marriedで
… …(1)
あ っ た 場 合 に は(2),(3)の
な っ て い な い 場 合 に は,誤 実 行 は 以 前 に確 定 した X に対
す る 連 れ 合 い の 名 前 と そ の 生 年 月 日 の フ ィ ー ル ドへ の 代 入 と な り,そ
の直後 X
の 変 化 形 を 定 義 す るstateフ
前 のXの
ィ ー ル ドへ の 代 入 が 実 行 さ れ た の で,以
フ ィ ー ル ド情 報 は 消 失 す る.つ name
_of_spouseお
ま り,(2),(3)の
よ びdate_of_sp_birthの
実 行 は 無 意 味 と な り,X
フ ィー ル ドは,(1)の
の
実行後ではま
だ 未 定 義 と な っ て い る. レ コ ー ド選 択 子 が 一 つ の フ ィ ー ル ドを 形 成 して い な い 以 下 の 例 の よ う な 場 合 に は,少
し 状 況 が 変 わ っ て く る. type
coordinate_system=(rectangle,polar); coordinate=record case
coordinate_system
of
rectangle:(x,y:real); polar:(r,alpha:real) end; レ コ ー ド選 択 子 が フ ィ ー ル ド に な っ て い な い 場 合 は,ア ル ド名 の 出 現 が,レ coordinate_system型
ク セ ス され る フ ィー
コ ー ドが ど の 選 択 要 素 と な る か を 定 義 す る . の 変 数 C に 対 し て,
C.x:=1.0; C.y:=2.3; を実 行 す る と,最 初 のC.xの
出 現 で Cが 直 交 座 標 系 と定 め られ,こ の二 つ の 代
入 文 で座 標 値 が 定 ま る.
C.x:=1.0; C.alpha:=3.14159/6.0; を 実 行 す る と,最 初 のC.xの
出現 で Cが 直 交 座 標 系 と定 め られ,そ の x座 標 は
1.0と な る が,次 の 文 のC.aiphaは
極 座 標 を定 義 す るの で,前 の 座 標 系 は 無 効
とな り,極 座 標 の 角 度 だ け の 値 が 確 定 して い る こ とに な る. 以 上 に述 べ た 可 変 レコ ー ド部 の 解 釈 法 は,可 変 部 を含 む レ コ ー ドの 記 憶 領 域 の 割 り付 け は,各 可 変要 素 の 中 で最 大 の 寸法 に取 れ ば よ い こ とを示 唆 して い る. 図8・1の
レ コー ドの例 で は,stateフ ィ ール ドの値 がmarriedで
大 とな るの で,person型
あ る と きに最
の 変 数 は こ の 場 合 の 寸 法 で割 り付 け てお け ば,ど の 場
合 の 変 化 に も対 応 で き る.お の お の の 可 変 要 素 の場 合 の 記 憶 割 り付 け はstate =marriedの
と きの 寸 法 で ,そ れ ぞ れ 適 当 な フ ィー ル ド境 界 に よ っ て図 の よ う
に 配 置 され る(点 線 部 は未 使 用 で あ る).可 変 部 の フ ィー ル ドの デ ー タの 型 お よ び フ ィー ル ドの 境 界 は,そ れ ぞ れ の 可 変要 素 で 異 な っ て い るが,ど
の変化形 の
可 変 要 素 で あ る か は,そ れ ぞ れ の フ ィール ドの 値 を代 入 す る前 に 定 ま る の で, フ ィール ド境 界 を混 同 す る こ とは な い.こ の よ うな記 憶 領 域 の 割 り付 け は,多 少 の 空欄 は 生 ず る もの の,図8・2(a)の
場 合 に比 べれ ば記 憶 領 域 の 節 約 が で き
る こ と と,不 要 な フ ィー ル ドの 存 在 を な くす こ とに よ って フ ィール ドの 型 の 適 合検 査 が 可 能 と な る こ とが わ か る.
8.3集 Pascalに た と えば,普
合 型のデ ータ と ビッ トマ トリクス お け る集 合 型 の デ ー タ は,一 般 の 集 合 と少 し異 な る とこ ろ が あ る. 通 に は,整 数 の 集 合,虫
の 集 合,あ
る い は 赤 い 色 を した もの の 集
合 な ど とい う よ う に集 合 を定 義 で き る.こ の場 合 重 要 な こ とは,集
合が正 し く
定 義 され る た め に は,ど の よ う な もの で もそ の 集 合 の 要 素 で あ るか 否 か が 判 定 で き る よ う で な け れ ば な らな い.こ 念 また は 用 語(上 の例 で は,整
の た め に は,み ん なが 共 通 に持 っ て い る概
数 と か 虫 とい う もの が み な に共 通 した概 念 で あ
る と して い る)を 用 い た り,そ の 要 素 に 共 通 し た性 質 を述 べ た り して す る 方法 が 多 く取 られ る.こ の よ うな 方 法 の ほ か に,あ
ま りな じみ の な い 方法 で あ るか
も しれ な い が,そ の 集 合 に含 まれ る要 素 をす べ て示 す こ と も立 派 な 集 合 の 定 義 とな る.こ の 方法 は,無 余地 が な いの で,ど
限 集 合 に は不 可 能 な 方 法 で あ るが,曖 昧 さの 入 り込 む
うせ 有 限個 の もの しか扱 え な い計 算 機 に は 都 合 が よ い.
数 学 の 分 野 で は,集 合 を扱 う と きに考 え う るす べ ての 要 素 の 集 合 を定 め,そ れ 以 外 の 要 素 の 存 在 は 考 え な い もの とす る場 合 が あ る.整 数 の 集 合 の 議 論 の 中 で,小 金 虫 は整 数 集 合 に含 まれ るか と い う質 問 に は否 と答 え られ る けれ ど も, その 質 問 は場 違 い の感 が あ る.そ の た め に,考 え う る土 俵 と して の 要 素 の集 合 を定 め る の で あ る.こ の よ う に,考 え る対 象 に な る要 素 全 体 の集 合 を普 遍 集 合 (universal
set)と 呼 ん で い る.
Pascalで の 集 合 型 は,ま ず こ の 普 遍 集 合 を,そ の 普 遍 集 合 に含 まれ るす べ て の要 素 を明 示 す る こ と に よ っ て 定 義 さ れ,そ の 要 素 の 範 囲 内 で の 集 合,つ 普 遍 集 合 の 部 分 集 合 族 が,そ
まり
の 集 合 型 の デ ー タ とな る.普 遍 集 合 は た だ一 つ で
は な く幾 つ で も定 義 で き る が,異 な る普 遍 集 合 の 間 には 共 通 な要 素 が あ っ て は な らず,ま
た 異 な る普 遍 集 合 の 集 合 ど う しは,ど
ち ら も集 合 を表 現 して い る も
の の 型 の 異 な った デ ー タ と さ れ る. さ て,こ の よ う な集 合 を記 憶 領域 内 に どの よ うに表 現 す る の が よ い で あ ろ う か.集 合 を表 現 す る デ ー タ構 造 と して,ま ず は配 列 構 造 と リ ン ク構 造 リス トの 二 つ が あ げ られ る.リ
ン ク構 造 リス トに よ る集 合 を表 現 す る に は,各 要 素 を線
形 に格 納 した構 造 が 考 え られ る.た と えば,集 合S={a,b,d,e}を 図8・3(a)左
の ような方 法 であ り,配列構 造 では,図8・3(a)右
が まず 最 初 に思 い 浮 か ぶ.こ
表 現す るには の ような表 現 方法
れ らの 実 装 方法 の 優 劣 を議 論 す る に は,集 合 デ ー
タの 計 算 シス テ ム を考 慮 しな け れ ば な らな い.集 合 に対 す る演 算 は, (1)集
合 に要 素 を加 え る.
(2)集
合 か ら要 素 を取 り去 る.
(3)集
合 ど う しが 等 しい か否 か を判 定 す る.
(4)集
合 の 中の 要 素 の 数 を 数 え る.
(5)集
合 間 の 和,積,差
な ど が 代 表 的 な もの で あ る.こ と は で き て も,互
を 求 め る. れ らの どれ か 一 つ の 操 作 の 計 算 速 度 を上 げ る こ
い に 相 反 す る 関 係 に あ る こ と も あ り,こ
れ らす べ て の 操 作 に
対 し て 効 率 の よ い デ ー タ 構 造 を 見 つ け る こ と は 簡 単 で は な い. た と え ば,集 合S={a,b,d,e}に
要 素 c を 加 え る とい う(1)の 演 算 は,前 述 の 二
(a)配
列 構 造 と リ ン ク 構 造 に よ る{a,b,d,e}
(b){a,b,d,e}∪{C}(そ
の 1)
(c){a,b,d,e}U{c}(そ
の
図8・3
2)
つ の デ ー タ構 造 に対 して 図8・3(b)の
よ うに,リ ン ク構 造 リス トの 場 合 は リス ト
の 先 頭 に,配 列 構 造 な らば,末 尾 に挿 入 す るの が もっ と も効 率 の よい 方法 で, 集 合 の 寸 法 に 関 係 な く一 定 時 間 で 計 算 で き る.し か しな が ら,こ の 演 算 を した 後 で,集 合 Sが 集 合S'={a,b,c,d,e}と
等 しいか否 か を判 定 す る(3)の 演 算 をす
る場 合 に は,要 素 を加 え る とき に要 素 の 順 番 を考 え な か った こ とが集 合 間 の 等 価 性 を判 定 す る計 算 効 率 を 下 げ て い る. 集 合 内の 要 素 が,図8・3(c)の
よ うにabc順
に な るよ うな位 置 に挿 入 す る もの
とすれ ば,(1)の 演 算 は挿 入 され る集 合 の 大 きさ Nに比 例 したO(N)の とな るが,(3)の
計算 時間
演 算 時 間 は は るか に改 善 され る.な ぜ な らば,以 前 は 集 合S,
S'が 等 しい こ と を調 べ るに は,S の 任 意 の 要 素 がS'に 含 まれ て い る こ と,お よ び S'の任 意 の 要 素 が S に 含 まれ て い る こ とを示 さな け れ ば な らな い.こ の た め に は,O(N2)の
計 算 時 間 が か か る.集 合 内 の 要 素 が整 列 して い れ ば,先 頭 か ら順
に互 い の 要 素 を 比較 して行 くだ けで 集 合 の 等 価 性 を 判 定 で き,O(N)の 間 とな る.(1),(3)の
計 算時
演 算 の 比 重 が等 しい もの と し,こ れ 以 外 の演 算 は考 慮
しな い もの とす れ ば,要 素 を整 列 させ て お く方 法 の ほ うが総 合 的 に優 れ て い る こ とは 明 らか で あ る. リ ン ク結 合 に よ る デ ー タ構 造 は,複 雑 な構 造 に適 す るが,ア
ク セ ス の 自 由度
が 少 な い.集 合 型 の デ ー タ は 比 較 的 簡 単 な構 造 で ア クセ ス の 速 さが 問題 とす る か ら,リ ン ク構 造 に よ る集 合 の 表 現 は普 遍 集 合 の 定 ま って い な い よ うな 場 合 に は よい 点 もあ るが,一 般 的 に あ ま り適 して い る とは い え な い. 配 列 型 の構 造 は,挿 入操 作 に対 して 欠 点 が あ る こ と は第 4章 で述 べ た.も
し
扱 っ て い る集 合 の 普 遍 集 合 が 定 まっ て い るの な らば,ど の 集 合 変 数 も普 遍 集 合 の 要 素 の 数 だ けの 寸 法 が 必 要 で あ る.ど うせ 普 遍 集合 の 要 素 数 の格 納 場 所 が 必 要 な らば,格 納 場 所 と要 素 との 関係 を画 一 的 に 1対 1の 対 応 づ け る こ とが で き る. つ ま り,配 列 の 中 に は そ の 集 合 の 要 素 を格 納 す るの で は な く,す べ て の 要 素 の 包含 関 係 を要 素 に持 つ 配 列 を考 え て も配 列 の 寸 法 が 前 者 の構 造 の 場 合 よ りも 大 き くな る こ とは な い.ま
た,要 素 の 情 報 とは,そ の 配 列 の表 現 して い る 集 合
に 含 ま れ る か 否 か で 十 分 で あ る か ら 1 ビ ッ トで 足 り る の で,他
の どの よ う な要
素 を 格 納 す る よ り も記 憶 領 域 の 経 済 性 が あ る. 例 と して,普
遍 集 合 が{a,b,c,d,e,f}で
あ る 集 合 型 の デ ー タ を 考 え て み よ う.
この 集 合 型 の デ ー タ が
type elements=(a,b,c,d,e,f); set_a_f=packed
array[elements]
で 定 義 さ れ る と き,集 合{a,c,e},φ,{b,c,e,f}は a_f型
of Boolean;
そ れ ぞ れ 図8・4の
よ う にset_
の 配 列 で 表 現 さ れ る.
(a){a,c,e}
(b)φ
(c) {b, c, e, f}
図8・4
さ て,こ
の 構 造 で の 各 種 集 合 演 算 の 効 率 は ど う で あ ろ う か.図8・5は
集 合 演 算 の う ち,(1),(4),(5)の (3),(5)は
積 演 算 を 実 装 した もの で,(1)は
前述 の
一 定 時 間 で,
集 合 の 大 き さ に 比 例 す る 時 間 で 計 算 で き,今 ま で の ど の 実 装 法 よ り
も優 れ て い る こ と が わ か る. 集 合 を 表 現 し て い る 配 列 の 各 要 素 は 論 理 型 の デ ー タ で あ り),trueを を 0で 表 現 す れ ば,n
1, false
要 素 の 普 遍 集 合 を 持 つ シ ス テ ム で の 集 合 を 表 す 配 列 は,
n桁 の 2進 数 と な る. こ の と き,集
合 間 の 和,積,排
他 和,補
集 合 演 算 な ど の 計 算 を す る こ と は,
二 つ の 同 じ 長 さ の 2進 数 の 各 桁 ご と の 論 理 和,論 を 取 る こ と と な る.た と え ば,図8・4の を 計 算 す る に は,
理 積,論
理 排 他 和,論
理否 定
普 通 の 集 合 シ ス テ ム で{a,c,e}U{b,c,e}
図8・5
と な り,結
果 は{a,b,c,e,f}と
とな り,結 果 は{c,e}と
求 ま る.ま
た,{a,c,e}∩{b,e,e,f}は,
求 め られ る.た だ し,+,× 演 算 は各 桁 の論 理 和,論
理
積 を取 る こ と を表 現 して い る. 2進 数 の論 理 演 算 は,計 算機 の も っ と も得 意 とす る演 算 で,他 して 非 常 に 高 速 度 で計 算 す る こ とが で き,集 合 の 和,積,排
の 演 算 に比 較
他 和,補
集合 な ど
の計 算 に適 用 で きる.こ の よ うな 格 納 内容 が 論 理 型 の デ ー タ で あ る配 列,特 極 限 まで 高 密 度 に圧 縮 され た(packed)も
に
の を ビッ トマ トリク ス(bit matrix)と
呼 ん で い る. ビ ッ トマ トリク ス を用 い た 集 合 の 実 装 は,計 算 の 高 速 性,比
較 的 小 さな普 遍
集 合 の 集 合 の 場 合 に は,記 憶 の有 効 利 用 が 可 能 で あ るな ど の利 点 が あ る代 わ り に,非 常 に大 き な普 遍 集 合 を持 つ 集 合 の 表 現 に 対 して は,記 憶 の 利 用 効 率 は 悪 くな る.そ の 理 由 は,普 遍 集 合 が 大 き くな っ て も計 算 対 象 とな る集 合 の 大 き さ は,そ れ につ れ て大 き くな らな い傾 向 に あ る か らで あ る. Pascalの
集 合 型 に 関 す る い ろ い ろ な規 約 は,ビ ッ トマ ト リク ス を用 い て集 合
を表 現 しや す くな っ て い る.む
しろ,ビ
ッ トマ ト リク ス に よる 実 装 を意 識 して
規 約 を作 っ た と い え な く もな い.ゆ え に,Pascalで
の プ ロ グ ラ ミ ング で は,集
合 型 の デ ー タ をで き るだ け多 く利 用 す る こ とが,効 率 の よ いプ ログ ラム を作 る ヒ ン トに な っ て い る.し か し,多 くの 処 理 系 で普 遍 集 合 の 寸法 に上 限 が あ るの で,注
意 す る 必 要 が あ る.
8.4Pascalに Pascalに
おける動 的記憶領 域 とヒー プ構 造
は,ポ イ ンタ 型 の デ ー タ とポ イ ン タ 型 の デ ー タ に関 す る操 作 を含 め
た 動 的 記憶 シ ス テム が あ る こ とは,す で に 第 3章 で 述 べ た.利 用 者 に と って 動 的 な 変 数 は,必 要 な と き に 自 由 に生 成 した り,ま た 不 要 とな っ た と き に は消 去 した りで き る便 利 な性 質 を持 っ た記 憶 領 域 で あ るが,実
際 に は基 本 構 造 の 記 憶
装 置 上 に 配 置 さ れ て お り,利 用者 の 考 え て い る構 造 と実 際 の 基 本構 造 との 間 に, 記 憶 領 域 を管 理 す る ソ フ トウ ェ アが 介 在 して い る.こ の 節 で は,基 本 構 造 の 記 憶 とPascalの
動 的 記 憶 との 関 係,お よ び そ の 記 憶 領 域 の 管 理 方 法 につ い て学 ぶ
こ と に す る. Pascalの
動 的 記 憶 は,ポ イ ン タの ため の 領 域 で あ る ヒー プ(heap)と
記 憶 領 域 と,プ
ログ ラム ブ ロ ッ クの 地 域 変 数(local
variable)な
呼 ばれ る
どの 動 的記 憶
領 域 割 り当 て の た め の ス タ ッ ク領 域 との 2種 類 の 記 憶 領 域 が あ り,こ れ らが 一
つ の領 域 を分 か ち あ っ て 実 装 され て い る こ とが 多 いが,こ
こでは不必要 な複雑
さ を避 け る た め に,ヒ ー プ の た め だ け に一 つ の 固 定 領 域 が 与 え られ て い る もの と して お く. 動 的 割 り付 け に対 す る問題 点 を も う少 し具 体 的 に述 べ て み よ う.P
をあ る型
の ポ イ ン タ 変 数 とす る と き,
new(P) に よ っ て P ↑で表 現 さ れ る変 数 領 域 が確 保 され るが,こ の 領 域 は どの よ う に, あ るい は ど こ に確 保 され るの で あ ろ うか.ま
た,
dispose(P) に よ っ て使 用 され な くな っ た領 域 が,再 プ ロ グ ラマ は 苦 労 してdisposeを
び利 用 さ れ るこ とが な いの で あ れ ば,
用 い る意 味 が な い. dispose手 順 を生 か す た め
に は,不 要 に な っ た領 域 の 再 利 用 を考 慮 しな けれ ば な らな い.そ
の 実 現 に は,
どの よ うな 方 法 が 用 い られ て い るの で あ ろ うか. 基 本 的 に は,あ
らか じめ 大 きな利 用 域 を用 意 して お き,必 要 に な っ た 時 点 で
必 要 な だ け の 領 域 を 割 愛 して使 用 す る とい う原 理 で あ る.記 憶 領 域 を使 い捨 て に す る な らば,端
か ら順 次 使 用 して い く方法 が 取 れ るが,計 算 が 進 む につ れ て
不 要 とな っ た 領 域 が 増 加 し,記 憶 領 域 の 利 用 効 率 が悪 くな る. そ こ で,不 要 とな った 領 域 は再 度 使 用 で き る よ うに,未 使 用 の 領 域 を一 つ の リス トに 結 合 し,新
し く領 域 が 必要 とさ れ る と きは そ の リス トか ら取 り出 して
使 用 し,不 要 に な った とき に は,そ の 領 域 を元 の 未使 用 領 域 リス トに 戻 す こ と に よ り,用 意 した領 域 す べ て を有 効 に利 用 で き る よ うな 記 憶 領 域 管 理 シ ス テ ム
図8・6
が 考 え ら れ て い る. 簡 単 な 例 を 考 え て み よ う.図8・6の ドの 線 形 リス トで あ り,Availは
よ う に,intlstは
整 数 を格 納 した レ コー
こ の 整 数 の リ ス トの 要 素 と な り う る 空 き領 域
を 一 つ の リス トに ま と め た も の で あ る と す る. intlstの ま ず,新
先 頭 に348を
格 納 し た 新 し い 要 素 を 挿 入 す る こ と を 考 え る.
し い レ コ ー ドの た め の 領 域 は,new(intcell)(た
だ し, intcellは
整 数 リ ス トの 要 素 の レ コ ー ドへ の ポ イ ン タ 変 数 で あ る)を 実 行 す る こ と に よ り 得 ら れ る の で あ る が,そ の 内 幕 は,図8・6の の レ コ ー ド を 除 去 し,そ さ れ る.そ
点 線 で 示 し た よ う に,Availの
の レ コ ー ドへ の ポ イ ン タ をintcellと
先頭
す る こ とで 実 現
の 後 さ ら に, intcell
↑.value:=348;
intcell
↑.next:=intlst;
intlst:=intcell
と す る こ と に よ り,目
的 が 達 成 で き る.逆
に,dispose(intcell)を
実行す るこ
と は, intcell ↑.next:=Avail; Avail:=intcell
を実 行 した こ と に相 当 す る処 理 が 行 わ れ れ ば よい. 上 の例 で は,一 つ 問題 が あ る.そ れ は,リ ス ト処 理 言 語Lispの 域 が,常
よ う に動 的 領
に 同 じ寸 法 の 領 域 を 単位 と して利 用 され れ ば よい の で あ るが,Pascal
の よ う に い ろ い ろ な 寸 法 の 記 憶 単 位 が 許 さ れ て い る場 合 は,Avai1の
要素 の寸
法 が 同 一 で あ って は う ま くゆ か な い. こ の 問 題 の 解 決 方法 は,Availの
要 素 とな る空 き領 域 を可 変 寸 法 と し,格 納
す べ き情 報 の 寸 法 に 適 した もの を利 用 す れ ば よ い.各 要 素 に は,可 変 寸 法 な ど の た め の 付 随 情 報 が 必 要 とな るが,そ Availリ
の例 が 図8・7に
示 され て い る.
ス トの 各 要 素 は,一 つ の レ コー ドの た め の 領 域 とい う よ りは,連 続
した 空 き領 域 を意 味 す る こ とか ら,以 後 は ブ ロ ッ ク と呼 ぶ こ と にす る.こ の よ
図8・7
図8・8
う な 可 変 ブ ロ ッ ク か ら な る 動 的 記 憶 領 域 を ヒ ー プ(heap)と 図8・8は
動 的 領 域 に,そ れ ぞ れ16,18,64バ
呼 ん で い る.
イ トの 情 報 がX,Y,Zに
格 納 され
て い る 様 子 を わ か りや す い よ う に 簡 単 な 図 で 示 し た も の で あ る. 空 き 領 域 を 表 すAvailリ
ス ト使 用 前 の 初 期 状 態 は,す
ロ ッ ク と し た 長 さ 1の リ ス トで あ る.新
べ て の 領 域 を一 つ の ブ
し い 領 域 が 必 要 な と き は,Availリ
トの 中 の ブ ロ ッ ク で 必 要 とす る 寸 法 以 上 の も の を 見 つ け て,そ 必 要 な だ け の 領 域 を 削 除 し て 使 用 す る.残 を 形 成 し てAvailに 図8・9の
りの 部 分 は,新
ス
のブ ロックか ら
た な未 使 用 ブ ロ ッ ク
挿 入 さ れ る.
例 で は,新 し く50バ
イ ト必 要 と され た と き に180バ
イ トの 未 使 用 プ ロ
図8・9
ック か ら50バ
イ ト分 削 除 して使 用 し,残 りの130バ
イ トが ま た 未 使 用 ブ ロ ッ ク
と して 残 さ れ る状 況 を示 して い る. この よ う な方 法 を取 る と,今 まで の 問題 は す べ て う ま く解 消 で き る.し か し, 使 用済 み の ブ ロ ッ クが 未 使 用 ブ ロ ック リス トに回 収 され て も,再 度 使 用 され る と きに は,そ れ と同 等 か また は そ れ以 下 の 寸 法 の 情 報 しか 蓄 え る こ とが で きな い の で,使 用 す る回 数 が 重 な る につ れ て,ブ
ロ ック は だ ん だ ん 細 分 化 され て 行
き,最 後 に は未 使 用 領 域 の 総 計 が 十 分 あ るの に もか か わ らず,必
要 とす る寸法
の 領 域 が 取 れ な くな る とい う新 た な 問題 が 生 じて くる. こ の ブ ロ ッ ク の細 分 化 へ の 対 策 に は,数 多 くの 方 法 が 考 案 さ れ て い るが,こ こ で は そ の う ち の2,3の
方 法 の概 略 を紹 介 す るに と どめ る.
まず最 初 に考 え られ る対 策 は,disposeに
よ っ て あ る領 域 が 回 収 さ れ る と き
に,そ の 領 域 の 前 後 が 未 使 用 の 領 域 で あ れ ば,そ れ ら を ま と め て 一 つ の ブ ロ ッ ク を再 編 成 す る こ とで あ る.読 者 の 中 に は,い
ま ま で の 説 明 の 限 りで は未 使 用
の ブ ロ ック は一 つ の リス トに つ なが れ て い る し,使 用 中 の 領 域 は 他 の 変 数 か ら ア ク セ ス で き る の で,使
用/未 使 用 タ グ は 不 要 で は な い か と思 わ れ る 人 が い る
こ とで あ ろ う.し か し,も
し使 用/未 使 用 タ グ が な か っ た ら,あ
が 未 使 用 領 域 で あ るか 否 か を調 べ る に は,Availリ
る領 域 の 前 後
ス トに あ る か否 か を チ ェ ッ
ク しな け れ ば な らず,大 変 な労 力 を要 す る.こ の テ ス トに 簡 単 に答 え られ る よ
う にす るの が,使 略 され たが,各
用/未 使 用 タ グ の働 きの 一 つ で あ る.ま た,前 の 説 明 で は 省
ブ ロ ッ ク の 先 頭 の 位 置 に,ブ
ロ ック境 界 の 記 号 を書 き込 ん で お
く こ と も必 要 な こ と で あ る. も う一 つ の 方法 は,さ
ら に積 極 的 に 未 使 用 領 域 を統 合 す る もの で,細 分 化 の
た め に新 しい領 域 が 取 れ な くなっ た時 点 で,図8・10の 置(compaction)を
よ うに 各 ブ ロ ックの 再 配
行 う方法 で あ る.こ の 方 法 は 一 見 簡 単 な よ う で あ るが,使 用
中 で あ る各 変 数 か らの ア クセ ス ポ イ ンタ をす べ て 付 け換 え な け れ ば な らな い. 一 般 に は ,動 的 領 域 側 か ら そ こ へ き てい る ポ イ ン タの 元 を知 る こ とは で き な い の で,こ
の 作 業 は簡 単 で はな い.
図8・10
簡 単 で 実 用 的 な 方 法 の 一 つ に,い お き,必
要 と す る 領 域 以 上 で 最 小 の もの を 使 い 細 分 化 しな い 方 法 が あ る.こ
場 合 は,ど が,こ
ろ い ろ な 寸 法 の 未 使 用 ブ ロ ック を用 意 して の
の よ う な 寸 法 の ブ ロ ッ ク を 用 意 し て お くか が む ず か し い 問 題 で あ る
こ で の 議 論 は 省 略 す る.
最 後 に 紹 介 す る 方 法 は,廃 品 回 収 法(gabage の 説 明 に 入 る 前 に,Pascalで
collection
の プ ロ グ ラ ミ ン グ でdisposeを
method)で
あ る.こ
使 う と きの 注 意 を
し て お こ う. い ま,P
が あ る 型 の ポ イ ン タ 変 数 で あ る と す る.動
的 変 数 は ポ イ ンタ 変 数 の
値 とな って い る の で,P す るかnew(P)を
の値 を変 更 す る こ と,す な わ ち, P に新 しい値 を代 入
実 行 す る と,P の 以 前 の値,す な わ ち,ポ イ ンタ Pの 指 して い
た動 的 変 数 は,P 以 外 か らの ア ク セ ス 経 路 が な か っ た と きに は,ま だ 動 的 領 域 で 使 用 中で あ る に もか か わ らず,ど
の よ うな 方法 に よ っ て もア ク セ ス す る こ と
が で き な くな っ て しま う.ゆ え に,P の 指 して い る動 的 変 数 が 不 要 に な っ た と きに は,P に新 しい値 を代 入 す る前 にdispose(P)を こ の こ とは,プ
実 行 しな け れ ば な らな い.
ロ グ ラ マ の 責 任 で 成 され な け れ ば な らな い.
廃 品 回収 法 は,プ
ロ グ ラマ に 不 要 に な っ た 変 数 回収 の 責 任 を負 わせ ず,未
使
用 リス トが 不足 した時 点 で シ ス テ ム が 自動 的 に不 要 に な った 領 域 を回 収 す る方 法 で あ る.シ ス テ ム が 下 す 要/不 要 の 判 定 は,各 変 数 領 域 が そ の 時 点 で ア クセ ス 可 能 で あ るか 否 か で あ る か ら,廃 品 回収 方法 を取 っ て い る処 理 系 で は,不 要 に な っ た 変 数 は ど ん どん ア ク セ ス 迷 子 に す る ほ うが よい こ とに な る.廃 品 回 収 法 を実 現 す る に は,再 配 置 法 よ り もさ らに 複 雑 な処 理 手 順 が 必 要 で あ る.残 念 な が ら,Pascalの
処 理 系 は,こ の機 能 を備 えて い な い.
第 8章
1.変
練習問題
数 の 記 憶 領 域 割 り 当て につ い て 以 下 の 問 い に 答 え よ.
(1)整 tempを
数 型 の 変 数x,yの
内容 を入 れ換 え る と きの 常 套 手 段 と して,作 業 領 域
用 いて temp←x; x←y, x←temp;
とプ ロ グ ラ ム す れ ば よ い.同
じ こ と を 行 う,作 業 領 域tempを
節 約 して
x←x-y, y←y+x; x←y-x;
と した と き,一 見 正 しい よ うで は あ る が こ の プ ロ グ ラム は 常 に 正 し くは動 作 しな い.そ
の 理 由 を 考 え よ(ヒ
ン ト:異 な る 名称 は異 な る記 憶 配 置 を表
現 して い る とは 限 ら な い こ と に注 意 し よ う). (2)(1)の
ヒ ン トに あ る よ う に,Pascalプ
ログ ラム 中 で異 名 で あ るに もか か
わ らず 同 じ記 憶 配 置 とな る具 体 例 を示 せ.
2.普 遍 集 合 の 大 き さが nで 制 限 さ れ て い る場 合 に,k-集 て最 大knの
要 素 を持 つ 集 合 を表 現 で き る.た
合 をひ と ま とめ に し
とえ ば,
type n_elements=[x1,x2,…,xn]; small_set=set
of
n_elements;
large_set=array[1..k]of
と い う よ う に 定 義 で き る.large_set型
small_set;
の 集 合 上 の 和,積,お
よ び,一
般 の集
合 にお け る述 語inあ た る演 算 をプ ログ ラム せ よ.
3.集 合 演 算 と して (1) 一 つ の 要 素 を集 合 に 加 え る. (2) 一 つ の 要 素 を集 合 か ら取 り除 く. (3) あ る要 素 が 集 合 に含 まれ て い るか否 か を判 定 す る. の 3種 類 しか使 用 しな い集 合 シス テ ム に 適 す ビ ッ トマ ト リクス 以 外 の デ ー タ構 造 を考 え よ.
4.動 的 記 憶 の 管 理 方法 の 原 理 を 学 習 す る た め に,Pascalで
プ ログラムで きる
モ デ ル を以 下 の よ う に考 え た. 動 的 記 憶 領 域 は す べ て 同 じ記 憶 単位(セ ル:cell)で
構 成 され て お り,こ の 領
域 は 常 に こ の セ ル 単 位 で 利 用 され る もの とす る.セ ル お よび 動 的 記 憶 領 域 は type
pcell=↑cell; cell=record case
Boolean
of
true:(data:integer;next:pcell); false:(pointer,next:pcell) end; dynamic_area=array[1..d
size]of
で 定 義 さ れ て い る も の と す る.以 (1)こ
cell;
下 の 問 い に 答 え よ.
の モ デ ル に お け る ヒ ープ の 走 査newとdisposeをPascalの
手 順 でプ ログ
ラ ム せ よ. (2)こ
の 動 的 領 域 に あ る 使 用 中 の デ ー タ は す べ て 図8・11に
係 で 線 形 リス トactiveか こ の 場 合 の 廃 品 回 収(gabage
示 した よ う な 関
ら ア ク セ ス で き る よ う に な っ て い る もの とす る. collection)を
す る 手 順 を プ ロ グ ラ ム せ よ.
図8・11
付
付録A
録
アルゴリズムの計算時間と O-記法
ア ル ゴ リズ ム の 計 算 時 間 は,与
え られ た デ ー タ の 数 に依 存 して い る場 合 が 多
々 あ る.与 え られ た デ ー タ の 個 数 をn(n=1,2,…)と
す る と きの 計 算 時 間 をT(n)
で 表 す こ と に す る. い ま,2 つ の ア ル ゴ リズ ムA1,A2の
計 算 時 間 がTl(n),T2(n)で
あ る と き,ア ル
ゴ リズ ム の性 能 は デ ー タの 数 が 大 き くな っ た 場 合 の 優 劣 で 評 価 され る こ とが 多 い.つ
ま り,
が 1 よ り も大 き い か 否 か が 問 題 と さ れ る . し か し な が ら,T1(n),T2(n)の 合 が 多 い の で,お
正 確 な 関 数 表 現 を求 め る こ とが む ず か し い 場
お よ そ の 評 価 が つ け ら れ れ ば よ い と い う考 え 方 に 基 づ い て,
数 学 で 用 い ら れ て い る ラ ン ダ ウ(Landau)の
O-記 法 が 使 用 され る.ま ず 最 初 に,
ラ ン ダ ウ の 記 法 に つ い て 述 べ る. 二 つ の 関 数f(x),g(x)は 値 が 無 限 大 に な る もの と す る.
と も に 実 数 を 定 義 域,値 域 と し,x→aで
ともに関 数
の 値 が 0に 収 束 す る と き,x→aでf(x)はg(x)よ
りも低 位(lower
とい い,無 限 大 に 収 束 す る と き,x→aでf(x)はg(x)よ で あ る と い う.ま order)で
た,そ
り も高 位(higher
の 極 限 値 が あ る 定 数 に 収 束 す る と き に は,同
あ る と い い,f(x)∼ag(x)と
f(x)∼ankで
order)で
ある
order) 位(same
記 述 す る.
あ る と き,f(x)の
位 数 は k で あ る と 定 義 す る.位 数 の 記 述 を
簡 単 に す る た め に ラ ン ダ ウ の 記 法 が 用 い ら れ て い る. ラ ンダ ウ記 法 は O(big
oh)とo(small
oh)の
2種 類 が あ る.f(x),g(x)が
同
位 であれ ば
と記 述 す る.ま
た,x→aの
と きf(x)がg(x)よ
り も高 位 で あ る こ と を
と記 述 す る. こ の ラ ン ダ ウ の 記 法 を ア ル ゴ リズ ム の 計 算 時 間 の概 算 を表 現 す る の に 用 い る と き に は,計
算 時 間 の 関 数 の 定 義 域 が デ ー タ の 関 数 で あ る か ら,常
に 自然 数 と
な り,変
数 の 収 束 点 は い つ も∞ に 取 ら れ る こ とが 暗 黙 の う ち に わ か っ て い る か
ら,O-記
法 に お け るx→
∞ の 記 述 は 省 略 さ れ る こ と が 多 い.
あ る 問 題 を 解 く ア ル ゴ リ ズ ムA1,A2の ぞれT1(n),T2(n)で
n個 の デ ー タ に 関 す る 計 算 時 間 が そ れ
あ る と き,O(T1(x)),O(T2(x))の
の い ず れ か に よ っ て そ れ ぞ れ,A1の
計 算 時 間 はA2の
両 者 の 関 係 が>,=,< そ れ よ り も 高 位,同
位,低
位 で あ る と い わ れ る. 位 数(order)は
数 学 的 用 語 で あ る が,わ
な い が お お よ そ の 値 」 と解 釈 で き る.た
と い う 式 は,デ
と えば
ー タ の 数 n が 多 く な る と,だ
る こ と を 意 味 し て い る.注
意 す る こ と は,上
左 辺 の 関 数 の お お よ そ の 値 は,右
か りや す く い え ば 「あ ま り正 確 で は
い た いn3に
比 例 した 計 算 時 間 と な
の 式 で 用 い ら れ て い る'='記
号 は
辺 の O 記 号 の 中 の 関 数 と同 じで あ る とい う意
味 に 用 い ら れ て い る の で あ る か ら,
とい う よ うな 記 法 は意 味 が な い. ラ ン ダ ウの 記法 に関 して,次 の性 質 が あ る.
この よ う な 変換 式 を通 して,で
き るだ け簡 単 な 同 位 の 関 数 を求 め る こ とが で
き る. 【例 1】 を簡 単な O-表現 に変換 してみ る(γは定 数 と す る).
【例 2】
付録 B
置換の反転数の解析
整 列 の ア ル ゴ リズ ム の 計 算 時 間 の 解析 を行 う場 合,ア
ル ゴ リズ ム の 中 にデ ー
タ の 配 置状 況 に よ って 計 算 回 数 の 異 な る と こ ろが あ る.整 列 デ ー タ と して,1 か ら n まで の 数 の 置 換 を考 え る.置 換 とは 1か ら n まで の 数 を任 意 の 順 序 で並
べ た も の で,こ
の 数 列 を 整 列 さ せ る べ き フ ァ イ ル と み な し ,個
た め の 鍵 と 考 え る.ま
た,フ
ァ イ ル を 構 成 し て い る レ コ ー ドは 整 列 鍵 の み か ら
成 っ て い る もの と す る.Algorithm-1は,置 123…nと
々の 数 を整 列 の
換a1a2…anが
与 え ら れ た と き に,
な る よ う に 整 列 させ る た め の ア ル ゴ リ ズ ム で あ る . ―
Step-1:lastchanged
Algorithm
A-1―
←n
Step-2:while
lastchanged>0
do Step-3
to Step-4
and then
terminate. Step-3:last
←lastchanged lastchanged
Step-4:for
←0.
i:=1
Step-5:
and
to last-1
if ai>ai+1
do
Step-5.
then do Step-else
do nothing.
Step-6:ai〓ai+1,lastchanged←i.
こ の ア ル ゴ リズ ム の 中 のStep-6の 化 す る.デ
実 行 回 数 は,与 え られ た デ ー タ に依 存 し て 変
ー タ が す で に整 列 し て い る 場 合 に 最 低 と な り0回,最
逆 に 並 ん で い る と き でn(n-1)/2回
で あ る.各
高 は デ ー タが
置 換 が デ ー タ と して 与 え ら れ る
確 率 が 等 しい とす る と平 均 実 行 回 数 は ど う な る で あ ろ う か. 入 れ 換 え 法 に よ る 整 列 の ア ル ゴ リ ズ ム の デ ー タ 依 存 す る 部 分 の 実 行 回 数 を解 析 す る の に,「 反 転(inversion)」 置 換a1a2…anの あ る と い う.整
の 概 念 を 導 入 す る と考 え や す い.
中 で,ai>aj(i<j)で
あ る と き,aiとajは
列 させ る と い う こ と は,反
置 換 に 対 し て,そ
の 反 転 表(inversion
反 転の位置 関係 に
転 の な い 置 換 を 求 め る こ とで あ る .
table)を
次 の よ う に定 義 す る.
置 換a1a2…anの 反 転 表 は n個 の 整 数 列b1b2…bnで あ り そ れ ぞ れ のbiは,a1a2 …a nの 中 で 数 iの 左 側 に 位 置 す る i よ り も大 き な 数 の 個 数 で あ る . た と え ば,9
元の置換
198627543 につ いては
1の 左 側 に は 1 よ り も大 き な 数 は な い の で,b1=0,
2の 左 側 に は 2 よ り)も大 き な 数 は9,8,6と
3個 あ る の で,b2=3
,
9 の 左 側 に は 9 よ り も 大 き な 数 は な い の で,b9=0, と な り,反
転 表 は, 036542210
と な る.反
転 表 の 定 義 か ら明 ら か な よ う に
が 常 に 成 り立 っ て い る.ま a1a2…anに
た,biとbj(i≠j)は
対 し て 反 転 表b1b2…bnは
し てa1a2…anも
ま っ た く独 立 に 値 を 取 る.置 換
一 意 に 定 ま り,ま た 逆 に,b1b2…bnに
対
一 意 に 定 ま る.
な ぜ な ら ば,b1b2…bnが 数 列a1a2…anはb1b2…bnを
与 え ら れ た と き,Algorithm
A-2に
よっ て得 られ る
反 転 表 と す る 置 換 と な っ て い る か ら で あ る. ―
Step-1:permutation←
Algorithm
A-2―
φ.
Step-2:for Step-3:数
n 元 の 置 換 に 対 す る 反 転 表 で は,
i:=n 列
1 do Step-3.
permutation=a1a2…a1-1の
入 し,そ
こ の こ と か ら,置
downto
左 か らbiとbi+1番
の 結 果 の 数 列 を 改 め てpermutationと
換 と反 転 表 と は 1対 1の 関 係 に あ り,ア
目 の 間 に iを 挿
す る.
ル ゴ リズ ムの 解 析
な ど で は 置 換 を 扱 う よ り も反 転 表 の ほ う が 扱 い や す い こ と が 多 い.置 anの 反 転 表 をb1b2…bnと
す る と き, In=Σbiを
換a1a2…
そ の 置 換 の 反 転 数 と い う.
反 転 数 を 用 い る こ と に よ り解 析 が し や す く な る例 を 三 つ 示 そ う. 【例 1】 置 換 は,相
n元 の 置 換 の 総 数 異 な る 要 素 の 順 列 の 数 で あ る か ら n!と お りで あ る こ と は よ く知
ら れ た 事 実 で あ る が,反
転 表 の 性 質 か ら も た や す く導 出 で き る.
反 転 表 の 要 素biの 取 り う る 場 合 の 数 は,0≦bi
あ るか らn-iと
おり
他 の 要 素 と 独 立 な 数 で あ る か ら,反 転 表 の 取 り
う る場 合 の 数 は
で,反 転 表 と置 換 とは 1対 1の 関 係 が あ るの で,n
元 の 要 素 か らな る置 換 の 総
数 は n!と な る. 【 例 2】
ア ル ゴ リズ ムA-1に
アル ゴ リズ ムA-1のStep-6を
お け るStep-6の
平 均 実行 回 数
1回実 行 す る と,互 い に反 転 の 位 置 関係 に あ
る隣 り合 わ せ の 1組 の デ ー タ が 入 れ替 わ っ て,全 体 と して の反 転 数 が 一 つ 減 少 す る.つ ま り,Step-6の に,Step-6の
実 行 回 数 は与 え られ た置 換 の 反 転 数 に等 しい.ゆ
え
平 均 実 行 回 数 は n!個 の 置 換 の 反 転 数 の 平 均 値 と一 致 す る.
お の お の の 置 換 が デ ー タ と して 与 え られ る確 率 が 等 しい とす る と,置 換 の 平 均 反 転 数mean(In)は mean(In)=n(n-1)/4…
… …(1)
と な る こ と を 数 学 的 帰 納 法 で 示 す. ■基 本
元 の 数 が 1の と き は 反 転 は 生 じな い の でmean(I)は
は(1)式 ■ 帰納
の n に 1 を 代 入 し た と き の 値 で あ り,(1)式 元 の 数 が nの と き(1)式
置 換 に 対 す る 反 転 表 がb1b2…bn+1で
は 成 立 す る.
が 成 り立 っ て い る と仮 定 す る.(n+1)元 あ る とす る と,0≦b1≦nで
bn+1は
n 元 の 置 換 の 反 転 表 と な っ て い る.b1の
bn+1は
n!と お り で あ るの で,b1=i(0≦i≦n)の
は,帰
納 法 の 仮 定 を 用 い て,
の
あ り,b2b3…
そ れ ぞ れ の 値 に 対 し て,b2b3… すべ ての 場 合 の 反 転 数 の 総 和
と な る.b1の 取 る 値 の そ れ ぞ れ の 確 率 は 等 し い の で,(n+1)元 の 平 均mean(In+1)は
0で あ る.こ れ
の置換の反転 数
とな り,(1)式 の nに(n+1)を
代 入 した もの とな る.(証
以 上 の 結 果 か ら,n 元 の置 換 の 平 均 反 転 数 はn(n-1)/4で た.こ の こ とは,反 列 に は,O(n2)回
【例 3】
明 終) あ るこ とがわ か っ
転 数 が 一 つ ず つ減 少 す る よ うな基 本 的 入 れ 換 え法 に よ る整
の 入 れ 換 えが 必 要 で あ る こ とが 結 論 され る.
順 次 比 較 法 に よ る最 大値 を求 め るア ル ゴ リズ ム で の 最 大 値 置 き換 え数
n個 の 相 異 な る 自然 数 の 中 か ら最 大(ま
た は最 小)の 数 を選 び 出 す アル ゴ リ
ズ ム の デ ー タ に依 存 す る部 分 の 解 析 をす る. 与 え られ た デ ー タ は す べ て異 な る数 で あ る か ら,n 個 の デ ー タ は n元 の 置換 で モ デ ル 化 で き る.a1a2…anが る ア ル ゴ リズ ム はAlgorithm
与 え られ た と き,こ の 中か ら最 大 の 要 素 を求 め A-3を
採 用 す る もの とす る.
Algorithm
A-3―
Step-1:max←-1.
Step-2:for
i:=1
Step-3:if
ai>max
to n do Step-3
and
then do Step-4
then terminate.
else do nothing.
Step-4:max←aj.
こ の ア ル ゴ リ ズ ム の 実 行 数 が,入 Step-2の
力 デ ー タ に 依 存 す る 部 分 はStep-4で
繰 返 し制 御 変 数 iの 値 が k の と き,Step-4が
akの 左 側 にakよ
あ る.
実 行 され る た め の 条 件 は,
り も大 き な 数 が な い こ とで あ る.こ の こ と は,置 換a1a2…anの
反 転 表b1b2…bnの
要 素 で あ るbkが
bk=0 で あ る こ と を 意 味 し て い る.す す る 数 がAlgorithm
A-3中
な わ ち,b1b2…bnの で 変 数maxに
た と え ば, 145269738
に対 す る反 転 表 は 025000110 で あ る か ら,maxに
代 入 され るの は
中 で 0で あ る位 置 に対 応
代 入 さ れ る こ と を 意 味 し て い る.
1,4,5,6,9 の 順 で あ り,Step-4の
実 行 回 数 は 5 と な る.
b1の 取 り う る 数 は,0≦b1≦n-1で の でb1=0と b2=0と る.よ
な る確 率 は1/nで
あ る.そ れ ぞ れ の 値 を 取 る 確 率 は 等 しい
あ る.同
な る確 率 は1/(n-1).一 っ てb1b2…bnの
と な る.た
般 に,bi=0と
あ る か ら,
な る確 率 は,1/(n-i+1)で
あ
中 に 0が 幾 つ あ る か と い う 期 待 値 は
だ し,Hn=1/1+1/2+1/3+…+1/nで
Hn=Inn+γ+o(1/n)(γ で,Step-4の
様 に し て,0≦b2≦n-2で
あ る.
は オ イ ラ ー の 定 数)で あ る こ とが 知 ら れ て い るの
平 均 実 行 回 数 はO(log
n)の
オ ー ダ と な る こ とが わ か る.
索 引 ■ ア行
弧 112 コ ー デ ィ ン グ 18
ア クセ ス 56 あふ れ 85
後 行 順 走 査 119
誤 りの 訂正 15 ア ル ゴ リズ ム 6
構 造 111
ア ル ゴ リズ ムの 改 善 43
後 置 96
ア ル ゴ リズ ムの 記 述 29 ア ル ゴ リズ ムの 計 算 時 間 35
根 112
後 者 79 構 造 型 53,55
■サ行
■ カ行 鍵 145
再 帰 的プ ログ ラ ム 112
下 降 型プ ロ グ ラ ミング 16
再 配 置 229 再 ハ ッシ ュ 207
型 10 環 117 環 状 リス ト 110 関 数 13 間接 ア クセ ス 75 環 路 117 環 路 グ ラ フ 118 外 頂 点 187
シ ェル の 方法 152 試 計 算 15 子 孫 116 シフ テ ィング 163 集 合型 55
外 部検 索 178
終 端 記号 31 照 合 198
外 部整 列 146,164,166
衝 突 問題 203
木111,117
仕 様 19 字 句 13
記 号(単 語) 31 帰 納 的 定 義 法 112
実 装 11 実 装 プ ロ グ ラム 11
キ ュ ー 92
順 次関 係 147
逆 ポ ー ラ ン ド式 表 現 96
順 次検 索 180 順 次検 証 法 206
ク イ ッ ク ソ ー ト 157 空 域 割 り振 り 206
順 次処 理 143 順 次 フ ァ イル 146
空 領 域 83
順 序木 114
グ ラ フ 111
順 編成 フ ァイル 65 上 昇型 プ ログ ラ ミング 16
計 算 シス テ ム 52 計 算 時 間 の解 析 40
情 報 フ ィー ル ド 145
検 索 176
数 学的 モ デ ル 6 ス ッタ ク92
静 的 フ ァイル 178
動 的 フ ァ イル 178
静 的 変数 72
動 的 変数 73
静 的領 域 71 整 列 142
動 的領 域 71
線形 デー タ構 造 79
■ナ行
線 形 リンク 結合 リス ト 204 先 行順 走 査 119
内項 点 187
先 祖 116 選択 法 161
内部 整 列 146
先 頭 79
二重 結合 103
前 者 79 全 順序 関係 147
二重 結 合 リス ト 90
前 置 96
■ハ行
内部検 索 178
2 分 検 索 182
走 査 119
葉 114
挿 入法 に よ る並 べ 換 え 148 側 面 効果 88
廃 品 回 収 法 229 配 列 型 55
■タ行
配 列 構 造 82 ハ ッ シ ュ 関 数 201
段 区切 14
ハ ッ シ ュ検 索 201 ハ ッ シ ュ テ ー ブ ル 204
地 域 変数 224
ハ ッ シ ュ 法201
逐次 計 算 型 34
ハ ッ シ ュ 法 の 衝 突 203
注釈 14
バ ー ス デ ィパ ラ ド ッ ク ス 201
抽 象 デー タ型 53 抽 象 モ デル 6
バ ブ ル ソ ー ト ヱ55
中 間順 走 査 119 超記 号 31
ヒー プ 163,224,227
頂 点 112
非 決 定 性 検 索 212
直接 ア クセ ス 75
評 価 基 準 34
ヒー プ ソ ー ト 161
表 現 69 手 順 13
開 か れ た ハ ッ シ ュ 法 204
手 順 見 出 し 80
ビ ッ トマ ト リ ク ス 218,224
デ ー タ構 造 10 デ ー タ の 型 51
フ ァ イ ル 146
デ ー タ の 集 合 52
フ ァ イ ル 型 55
デ ー タ 量 37
フ ィ ボ ナ ッ チ 検 索 210
デ ィ ジ タル 検 索 198
フ ォ ン ・ノ イ マ ン 方 式 34
デ ィ ジ タル 検 索 木 198
深 さ 114
デ バ ツ ギ ン グ 15
深 さ 優 先 検 索 212 普 遍 集 合 218,219
トー ナ メ ン ト法 162
フ ロ ー チ ャ ー ト 9
等 価 交 換 34
部 分 木 114
閉 じ ら れ た ハ ッ シ ュ 法 206
ブ リ ッ ジ プ レ ー ヤ ー の 方 法 148
プ ッ シ ュ ダ ウ ン 93 プ ッ シ ュ ダ ウ ン リ ス ト 92 プ ロ グ ラ ミ ン グ の 手 法 12 プ ロ シ ジャ 7
問題 203 ■ ヤ,ラ
行
有 向 木 117 有 向 グ ラ フ 117
平 衡 木 116 併 合 法 165
ラ ン ダ ウ の 記 法 234
変数 13
ラ ン ダ ム ・ア ク セ ス 56
ポ ー ラ ン ド式 表 現 96
リ ス ト型 79
ポ イ ン タ 型 68
リ ス トの 実 装 82
ポ ッ プ ア ッ プ 93
リ ン ク構 造 75,86
■ マ行
レ コ ー ド 145
マ ー フ ィ ー の 法 則 18
レ コ ー ド型 55
待 ち行 列 リス ト 101 末 尾 79 マ ル チ リ ス ト 85
■英字 FIFOリ
道 117
LHS
ス ト 101 69
LIFO
93
無 向木 117 無 向 グ ラ フ 117 メ タ記号 31
LIFOリ
ス ト 92
メ タ単語 31
RHS
n-分 木 115 O関 数 39 69
〈著 者 紹 介 〉
古 東 馨 学
歴
東 京電機 大学 大 学 院博 士 課程 満 期 退学(1973年) 工学博士
職 歴 東京電機大学理工学部数理学科助教授
Pascalに
よ るデ ー タ 構 造
ゥKaoru
1987年
6月30日
第 1版 1刷 発行
1991年
3月20日
第 1版 3刷 発 行
著 者
発行者
Kotoh
古
1987
東
馨
学校法人 東 京 電 機 大 学 代 表 者廣 川 利 男
発行所 東 京 電 機 大 学 出版 局 著者承認
〒101 東 京 都 千 代 田 区 神 田 錦 町2-2
検 印省略
振 替
口 座
東
京6-71715
電 話03(3294)1551(代)
Printed in Japan 印刷 (有)バ リエ社 *本
製 本 (株)徳 住 製本 所
書 の 内 容 の 一 部 あ る いは 全 部 を無 断 で複 写 複 製(コ
ピー)す
る こ とは,法 律 で認 め られ た場 合 を除 き,著 作 権 お よび 出 版 権 の 侵 害 と な ります の で ご注 意 下 さ い. *落
丁 ・乱 丁 本 は お 取 替 え い た します. ISBN
4-501-51230-X
情 報 処 理 ・プ ログ ラ ミング プ ロ グ ラ ム例 に よ る
コ ン ピ ュ ー タ 学 習 シ リー ズ
FORTRANの
FORTRANの
入門
学び方 高宮英郎 著 A5判148頁
若 山芳三郎 著 A5判216頁 コ ンピ ュー タ とプ ロ グ ラ ミ ング/整 数 の計 算
初 めて コ ン ピユ ー タ を学 ぶ 人 を考 慮 して,フ
/判 断 と繰 り返 し/実 数 の 計 算/大 量 のデ ー
ォー トラ ンの 初 歩 か ら応 用 ま で を,わ か りや
タ の取 扱 い/副
す く効 率 よ く役 立 つ よ うに解 説 し た.
プ ログ ラム/文
法
プロ グ ラム例 に よ る
初めてのCOBOL BASIC対
応
COBOLの
入門
仲野成憲 著 A5判200頁 事 務 系 ビ ジ ネ ス マ ンやOLで
初 め てCOBOL
を学 ぼ う とい う人 を対 象 に,難 説 を避 け,本
しい文 法 の解
質 を理 解 で き る よ うに解 説 した
実務例解
佐藤清 著 A5判180頁 プ ロ グ ラ マー 教 育 の ベ テ ラ ンが平 易 に解 説 コ ンピ ュー タ言 語 とプ ログ ラ ミ ング/各 部 の 構成/プ
ロ グ ラ ミング 技 法
コ ン ピ ュー タ 学 習 シ リ ー ズ
COBOLテ
ク ニ ック
COBOLの
佐藤清 著 A5判234頁
演習 日本 ソフ トウ ェア 著 A5判112頁
実 務例 に よ りCOBOLの プ ログ ラ ミ ング技 法 が 身 に つ く よ うに 解 説 して ある た め,実 務 学
COBOLの
習 書 と して 最適 で あ る.
よ リプ ロ グ ラ ミング 技 法 が マ ス タ ー で きる. コ ン ピ ュー タ 学 習 シ リ ー ズ
コ ン ピ ュ ー タ 学 習 シ リー ズ
COBOLの
文 法 につ い て ひ と とお りの知 識 が
ある人 を対 象 に,数 多 くの 問題 を解 くこ とに
コ ン ピ ュー タ処 理 の
学び方
基礎知識
溝 口貞 彦 著 A5判172頁
日本 ソ フ トゥ ェァ 著 A5判112頁
コ ン ピ ュー タ の知 識 の ない 人 に も理 解 で きる よ うに,コ
ボ ル の基 礎 とな る考 え方,命
使 い 方,プ
ログ ラム の書 き方 を解 説 した.
令の
コ ン ピ ュ ー タ 学 習 シ リー ズ
コ ン ピュー タ に よ りデ ー タ処 理 の 基本 を初 心 者 を対 象 に や さ し く解 説 した.
数 学 と コ ン ピ ュー タ
フ ロ ー チ ャ ー トの か き 方 溝 口貞彦 著 A5判150頁 プ ロ グ ラ ム の組 立 て 方 や 流 れ を豊 富 な 図 とや さ しい実 例 に よ り解 説 し,フ ロ ー チ ャ ー ト的 思 考 を養 え る よ うに 指 導 した ロ ング セ ラー.
*定
価,図
シ リー ズ 田 島一 郎 監 修/片 桐 重 延 編 修 全 8巻 別 冊 2
A5判
平 均160頁
情報教育のためのコンピュー タを利用す る立 場で の入門書.例 題,問,練 習問題 を豊富 に 入れた.教 科書 ・参 考書 として最適.
書 目録 の お 問い 合 わせ ・ご要 望 は 出版 局 まで お願 い致 します.
マ イ コ ン/IG 例解Z80マ
イコンの ハ ー ドと ソ フ ト
図解 マイ コン
イ ン タフ ェー ス の基 礎
倉石源三郎 著 A5判272頁 マ イ コ ン とは/基 礎 数学/デ メモ リIC/CPU/命
ィ ジ タ ルIC/
令 と プ ロ グ ラ ム/入
力 イ ン タ フ ェー ス/パ
出
ソ コ ン/OS
五 島/田 中/中 村 著 A5判200頁 イ ン タ フ ェー ス を理 解 す る た め の 基礎 知 識 や バ ス タイ ミング ・A/D・D/Aを 具 体 的 回路 図.波
図解 マイコン は じ め て の パ ソ コ ン 計 測 ・制 御
図 解16ビ
/イ
シ ン語 プ ログ ラ ム オ ペ ァ ンプ/Z80
ン タ フ ェー ス/計 測 の応 用/制
御の応用
あ な た な らわ か る
ッ トマ イ コ ン
68000と
フ ァ ミ リの 活 用
関 根 慶 太 郎 監 修 日立 マ イ コ ン 著
天 良和 男/矢 野越夫 著 A5判240頁 計 測 と制 御 の基 礎 知識/マ の基 本/デ ィ ジタ ルICと
形 写 真 で や さ し く図 解.
A5判240頁 16ビ
ッ トマ イ コ ン シ ス テ ム の世 界 を理解 す
る た め に,68000の
最 新 周 辺LSIを
解説
図解 マ イ コ ン の基 礎
ICの
基 礎 2訂版
吉本久泰 著 A5判172頁
岩崎臣 男 他著 A5判220頁
マ イ コ ンに対 す る コ ンプ レ ッ クス を取 り除 き
半 導 体 の 理 論/半
興 味 を もっ て取 り組 め る よ うに,基
/IC内
回 路 素子/ア
/OPア
ンプ/デ
と動 作,プ
礎,構
造
ログ ラム に つ い て や さ し く解 説.
デ ィ ジ タルICの
中心 と
した シ ス テ ム の設 計 と構 成 に つい て 解説.
すべて
導 体 素 子/IC概 ナ ログICの
ィ ジ タルIC/メ
ア ナ ログICの
論/製
法
基本回路 モ リIC
すべて
ゲ ー トか ら マ イ コ ン ま で
オ ペ ア ン プ か らス イ ッチ ドキ ャ パ シ タ ま で
白土 義 男 著 AB判312頁 2色 刷
白土 義 男 著 AB判344頁 2色 刷
デ ィ ジ タルICの 基 本 回 路 か ら応 用 回 路,カ ウ ンタ や 周辺 素 子,イ ン タ フ ェー ス,メ モ リ,
オ ペ ア ンプ の 基 本 か ら増 幅 回 路,イ ン タ フ ェ ー ス,A/D ,D/Aさ ら に特 定 用 途 のIC
CPU,マ
な ど,最 新ICを
イ コ ン回 路 ま で す べ て を解 説.
ポ イ ン トス タ デ ィ
図解 デ ィジ タ ルICの
基礎
図 解 した.
ポ イ ン トス タ デ ィ
図解 リ ニ ヤICの
白土 義男 著 A5判208頁 基 礎/論
理 回 路/シ
イ ブ レー タ/FF/カ タ フ ェー ス/DA変
ュ ミ ッ ト回路/マ
ル チバ
ウ ン タ/表 示 器/イ 換/ICメ モ リ/LSI
*定 価,図
ン
基 礎, 白土義 男 著 A5判178頁
種 類 と構 造/オ 路/応
ペ ア ンプ の 基 礎 回 路/演
用 回 路/オ
ー デ ィオ 回 路/電
イ ン タフ ェー ス/高
周 波 回 路/特 殊 用 途
書 目録 の お 問い 合 わ せ ・ご要 望 は 出版 局 まで お 願 い 致 し ます .
算回
源 回 路/
プ ログ ラ ミン グ 高校生のための
高校生 のための
基礎BASIC
応 用BASIC B5判104頁
パ ソ コ ンの し くみ/パ と判 断/見
ブ ル ー チ ン/プ FMシ
ソ コ ン の操 作/繰
や す い 出 力 方 法/関
返 し
数/配 列/サ
口絵 カ ラー/図 ス クの 活 用/応 方 程 式,デ
ロ グ ラ ムの 保 存 と利 用
ー タ処 理,他)
BASICの
ログ ラ ムの 急 所
中 心 モ デ ル に,キ ー ボー ドで の入 力
か ら グ ラ フの 作 成,プ
ロ グ ラ ム例,ミ
ス の発
入門 高宮英郎/黒 田正文 著 A5判208頁
高宮英郎 著 AB判204頁 カ ラー版 FM-7を
形の 描 き方/フ ロ ッ ピー デ ィ 用 プ ロ グ ラ ム(カ レ ンダ ー,
プ ログ ラ ム 例 に よ る
リー ズ
BASICプ
秋冨勝 他 著 B5判106頁 2色 刷
秋冨勝 他著 2色 刷
豊 富 な プ ロ グ ラ ム例 に よ り解 説 す る. BASICの 基 礎/算 術 式/入 出 力文/制
御文
見 ま で急 所 を カ ラ ー刷 で見 や す く解 説.
/ル ー プ(繰 り返 し)/配 列/サ
実例による マ イ コ ン の
パーソナルコンピュータ 操 作 法 と
プ ロ グ ラ ミン グ
プ ログ ラ ミン グの 基 礎
若山芳三郎 著 AB判176頁 100本 を こ え る プ ロ グ ラ ム例 とカ ラー 写 真 で BASIC文 法 を学 び,さ らに 数 多 くの練 習 問題 で,プ
ロ グ ラ ミン グ テ ク ニ ッ クを修 得 す る.
大井/笠 原/安 田/脇 A5判240頁 操 作 法/BASICの
著
基本 文 法/統 計 処 理 の 基
礎 とそ の 応 用/デ ー タ フ ァイ ル の 取 扱 い/グ ラ フ ィ ック処 理/シ ミュ レー シ ョン
応 用MSX
入門MSX
若 山芳三郎 著 A5判206頁
若 山芳三 郎 著 A5判200頁 話 題 のMSX入 門 の決 定版.MSXで もパ ソ コ ン本 来 の 楽 しみ を理 解 で きる よ うに 基 本 を て い ね い に解 説 した.
よ る デー タ 構 造 古東馨 著 A5判256頁
プ ログ ラ ミング/ア
パ ソ コ ン ミュー ジ ック,パ
ソ コ ング ラ フ ィ ッ
ク,フ ァイル 処 理 等,MSXで る よ う に や さ し く解 説 した.
最 大 限 楽 しめ
スプライ ン関数 入門
情 報 科 学 セ ミナ ー
Pascalに
ブプ ログ ラム
ル ゴ リズ ム の評 価/構
造
情報処理 の新 しい手法 桜井 明 編著 A5判184頁 定 義 と基 本 的 性 質/最
も滑 らか な補 間 の 問題
型 の デ ー タ/線 形 リス ト/木 溝 造/並 べ 換 え
/線 形 汎 関 数の 近 似/差
/検 索/記
/自 然 ス プ ラ イ ン と平 滑 化 スプ ラ イ ン/応
憶 の 方 式 と管 理/O-記 *定 価,図
法
分 商 とB-スプ ラ イ ン
書 目録 の お 問 い 合 わせ ・ご要 望 は 出版 局 ま で お願 い 致 し ます.
用