n個の要素に対してある計算処理をする再帰関数
はじめに
計算時間を議論するアルゴリズム分野は、Qiitaなどの素晴らしいサイトで多数の解説がなされています。(管理人も参考にさせていただいています。)
そのため、本記事で紹介する内容がどこかにあるかもしれません。それでも、再帰関数を分解し、計算時間の見積もりをする行為は、ソフト作成において非常に重要な作業になります。本記事では、再帰式からの計算時間量の見積もり方法について紹介します。
大枠の解き方
高校時代、漸化式の問題を解く際に、nの一般項、(n-1)の一般項…とn=1になるまで関数を展開していくことがあったと思います。本問も同様にして解いていきます。
ただし、展開するにあたり下記2つの方針があります。
方針1:n=1になるまで展開。その時の式を変形し計算時間の見積もりができる形に直す
ここで、ガウス記号を外すことを考えます。定義から
よって、
と最終的に行きつきます。
オーダー記法はnの次数が一番大きい項を取るので、T(n)の計算時間は
厳密性を期すならば数学的帰納法で確認した方が良いかもしれません。(与えられた不等式を忠実に展開しただけなので、管理人は不要と考えます。)
方針2:nを展開しやすい形に置き換えて計算する
こちらも再帰式を展開する方針は変わりませんが、
ガウス記号の中身は2で割り続けることに注目し、2を因数に持つ項をあらかじめ代入することがポイントです。こうすれば、
方針1では、展開し終えた後の式の形に注目し、そこから
今回は、予め2^{k+1}を代入し、展開後に行っていた式の評価を予め行う手番になっています。
よって、ガウス記号が最初から外れてT(1)まで展開した最後に大小比較の評価が入りません。よって、こちらの方が計算が楽になります。
これは、ガウス記号の性質を利用しています。
(
補足
冒頭で与えた再帰式は、マージソート(分割統治法)に似ています。
(2ブロックに分割後の計算時間)+(ソート完了後のマージする時間n)を
右辺
また、問題によっては、漸化式の中身がガウス記号(床関数)ではなく、天井関数
この場合は、本問のように、小数点以下を切り捨てではなく、切り上げになります。計算オーダーが増加する場合もありますので、記号の内容を注意深く確認することが重要です。
最後に
アルゴリズム論で勉強する計算時間設計は、情報系の学生だけでなく、万人の学生に勉強頂きたい分野と考えています。
会社に入ると、計算負荷、計算時間を勘案したプログラム実装が求められるためです。
参考文献
Cによるアルゴリズムとデータ構造 茨木 俊秀(著) P121