自動メモ化とは? わかりやすく解説

自動メモ化

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/02/14 17:00 UTC 版)

メモ化」の記事における「自動メモ化」の解説

上述factorial例のように、メモ化一般にプログラマ関数内部明示的に施すものであるが、参照透過性のある関数外部自動的にメモ化することもできるピーター・ノーヴィグ採用した技法Common Lisp (ノーヴィグの論文で自動メモ化の例に使われていた言語)だけでなく、様々なプログラミング言語応用可能である。自動メモ化は項書き換え人工知能研究でも応用模索されている。 関数第一級第二級オブジェクトあるようプログラミング言語例えLua)では、自動メモ化は関数特定の引数付き実行するたびに、その結果の値で(実行時に)置き換えてやること実装される。このような置き換えを行う汎用関数を本来の関数呼び出す代わりに呼び出せばよい。擬似コードを以下に示す(この例では関数第一級オブジェクトであると仮定している)。 function memoized-call (F) // F は関数オブジェクト if (F には対応する配列 values がない) then allocate an associative array called values; attach values to F; end if; if F.values[arguments] is empty then F.values[arguments] = F(arguments); end if; return F.values[arguments]; end function factorial を自動メモ化する場合もこの戦略使いfactorial直接呼び出すのではなく、memoized-call(factorial(n)) を呼び出す。呼び出されると、まず結果格納する配列確保されているかどうか調べなければ配列確保して割り当てる次にvalues[arguments] の位置にエントリが無ければ(ここで arguments連想配列キーとして使われている)、実際factorial呼び出す。最後に配列キー位置のエントリが呼び出し側に返される。 この戦略では、メモ化される関数呼び出す箇所明示的な対処が必要となる。クロージャ可能な言語では、メモ化メモ化関数オブジェクトラップする functor オブジェクトとして暗黙的に実現できる。これを擬似コードで表すと、次のうになるfunction construct-memoized-functor (F) // F は関数オブジェクト allocate a function object called memoized-version; let memoized-version(arguments) be if (self対応する連想配列 values がない) then // selfいわゆる this オブジェクト allocate an associative array called values; attach values to self; end if; if self.values[arguments] is empty then self.values[arguments] = F(arguments); end if; return self.values[arguments]; end let; return memoized-version; end function factorial代わりに使われる新たな関数オブジェクト memfact は次のように生成される。 memfact = construct-memoized-functor(factorial) この例では、関数 factorial は construct-memoized-functor を呼び出す前に定義されているものとしている。そしてそれ以降、n の階乗計算した場合は常に memfact(n)呼び出す。Luaなどの言語では、関数名変えず置き換えることも可能であり、次のようにできる。 factorial = construct-memoized-functor(factorial) 基本的にこのような技法では、生成されfunctorオリジナル関数オブジェクトアタッチし、必要な場合(無限の再帰呼び出し避けるため)にオリジナル関数エイリアス通して呼び出す。これを擬似コードで表すと次のうになるfunction construct-memoized-functor (F) // F は関数オブジェクト allocate a function object called memoized-version; let memoized-version(arguments) be if (self対応する連想配列 values がない) then // selfいわゆる this オブジェクト allocate an associative array called values; attach values to self; allocate a new function object called alias; attach alias to self; // F を後で間接的に呼び出すため self.alias = F; end if; if self.values[arguments] is empty then self.values[arguments] = self.alias(arguments); // F の直接呼出しではない end if; return self.values[arguments]; end let; return memoized-version; end function なお、言語によってはこれらのステップ一部言語機能として実装されている。上記はあくまで説明のための擬似コードである。

※この「自動メモ化」の解説は、「メモ化」の解説の一部です。
「自動メモ化」を含む「メモ化」の記事については、「メモ化」の概要を参照ください。

ウィキペディア小見出し辞書の「自動メモ化」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「自動メモ化」の関連用語

自動メモ化のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



自動メモ化のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaのメモ化 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2024 GRAS Group, Inc.RSS