奥村晴彦:C言語による最新アルゴリズム事典

作成日:2003-07-13
最終更新日:

称賛

実務面で非常に役に立っている。 小生が共著者として書いた論文の中で、この本を参考文献として挙げたほどだ。 この本は 1991 年の出版であるため、 残念ながら本の題名のうち「最新」が褪せつつある。 事実、インターネットの紹介ページでは誤って 「C言語によるアルゴリズム事典」としてある例も多い。

それはそれとして、 多くのアルゴリズムを参考文献と合わせてこれだけ紹介している本は貴重である。 文句などあろうはずもないのだが、それでも気になるところがいくつかある。 ただこれらの感想は、著者に向けるべきものというよりは、 読者自身(つまり私)が解決すべき課題である。

グラフとデータ構造

「グラフ」の項では、計算機でグラフを表すデータ構造の例として隣接行列が紹介されている。 隣接行列は、グラフが密である場合には都合がいいが、疎である場合はメモリの無駄遣いになる。 そこで、グラフが疎である場合に適したデータ構造の例が載せてあるとさらによかった。 そして、縦型探索や横型探索の項で、こうしたデータ構造による説明があるとありがたい。

一変数の最適化

「黄金分割法」と「 Fibonacci 探索」(フィボナッチ探索)は、 ともに一変数関数f(x)の最適化法であることが示されているとよかった。 なお、どちらも探索の収束のオーダーは同程度である。 対象の一変数関数が2階微分可能であれば、 微分した関数f'(x)に関してニュートン法が適用でき、収束が速い。

「ポリトープ法」では、解説の最後に 「もっとも、このような連続な偏導関数を持つ問題にはもっと収束の速い方法がある」 と解説されている。この方法についての言及がないのは寂しい。 私から補足すれば次の通りである。

このような非線形関数について最大値や最小値を探索する方法は、数理計画法、特に非線形最適化と呼ばれる分野で確立されている。 連続な偏導関数を持つ問題では、共役勾配法や準ニュートン法が有名である。 特に、最小二乗法の形で表される解を求める問題では、連続な二階偏導関数を用いるニュートン法がある。 また、ニュートン法では収束に問題が生じるときは修正マルカート法が使える。 なお、説明文に、「γが反値幅」とあるが、正しくは「γは半値幅」である。

アルゴリズムの強度

アルゴリズムは本来、ライブラリとしての強度をもっているべきである。 すなわち、他のシステムから使われることを想定して、 実装すべきである。 しかし、記述例ではあまりこのようなライブラリ化は考慮されていない。 たとえば、「回帰分析」ではQR分解を用いる方式が提示されている。 これは数値的に安定なアルゴリズムなので望ましいことである。しかし、 この例では別の個所で例示されている「QR分解」のコードをライブラリとして呼び出していない。 もったいないことである。 同様の例は「スプライン補間」にも見られる。スプライン補間の係数を求めるときには、 3重対角な連立方程式を経由する。従って、スプライン補間のアルゴリズムで、 3重対角な連立方程式の関数(メソッド)を呼び出すようにしてもよかったのではないか。

追伸

同書の改訂版が、[改訂新版] C言語による標準アルゴリズム事典として2018 年に出版された (出版社は同じ技術評論社)。 著者に敬意を表する。上記の「反値幅」の誤植も修正されている。

まりんきょ学問所コンピュータの本アルゴリズム > 奥村 晴彦:C言語による最新アルゴリズム事典


MARUYAMA Satosi