この記事では、JavaScript でのメモ化の使用法 (コード) を紹介します。必要な方は参考にしていただければ幸いです。
memoization はラテン語の memorandum (「覚えておくべき」) に由来しており、暗記と混同しないでください。
まず、Wikipedia の説明を見てみましょう:
コンピューティングにおいて、メモ化またはメモ化は、主に高コストの関数呼び出しの結果を保存し、キャッシュされた結果を返すことによってコンピューター プログラムを高速化するために使用される最適化手法です。
簡単に言えば、メモ化は、高コストの関数呼び出しの結果を保存し、同じ入力が再度発生したときにキャッシュされた結果を返すことによって、主にコンピューター プログラムを高速化するために使用される最適化手法です。
この記事では、まずメモ化最適化技術を使用する簡単な例を紹介し、次にアンダースコアでメモ化を使用するソースコードを解釈し、ライブラリを再選択して理解を深めます。
Factorial
メモ化を使用しない
何も考えずに、すぐに次のコードを書きます:
1 2 3 4 5 6 7 | const factorial = n => {
if (n === 1) {
return 1
} else {
return factorial(n - 1) * n
}
};
|
ログイン後にコピー
Use memoization
1 2 3 4 5 6 7 8 9 10 11 12 | const cache = []
const factorial = n => {
if (n === 1) {
return 1
} else if (cache[n - 1]) {
return cache[n - 1]
} else {
let result = factorial(n - 1) * n
cache[n - 1] = result
return result
}
};
|
ログイン後にコピー
クロージャとメモ化の使用
一般的な方法は、クロージャとメモ化を一緒に使用することです:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | const factorialMemo = () => {
const cache = []
const factorial = n => {
if (n === 1) {
return 1
} else if (cache[n - 1]) {
console.log(`get factorial(${n}) from cache...`)
return cache[n - 1]
} else {
let result = factorial(n - 1) * n
cache[n - 1] = result
return result
}
}
return factorial
};
const factorial = factorialMemo();
|
ログイン後にコピー
deform では、次のような書き方が最も一般的な形式です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | const factorialMemo = func => {
const cache = []
return function (n) {
if (cache[n - 1]) {
console.log(`get factorial(${n}) from cache...`)
return cache[n - 1]
} else {
const result = func.apply(null, arguments)
cache[n - 1] = result
return result
}
}
}
const factorial = factorialMemo( function (n) {
return n === 1 ? 1 : factorial(n - 1) * n
});
|
ログイン後にコピー
この階乗の例から、メモ化は空間と時間を交換する方法であり、次回同じ入力が発生したときに結果が直接出力されることがわかります。 、実行速度が向上します。
アンダースコア ソース コードのメモ化
1 2 3 4 5 6 7 8 9 10 11 | _.memoize = function (func, hasher) {
var memoize = function (key) {
var cache = memoize.cache;
var address = '' + (hasher ? hasher.apply(this, arguments) : key);
if (!_.has(cache, address)) cache[address] = func.apply(this, arguments);
return cache[address];
};
memoize.cache = {};
return memoize;
};
|
ログイン後にコピー
コードは _.memoize を使用して階乗を実装することが次のとおりです:
1 2 3 | const factorial = _.memoize( function (n) {
return n === 1 ? 1 : factorial(n - 1) * n
});
|
ログイン後にコピー
このソース コード、上記の階乗を参照してください。 引き続き次のように変換できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | const factorialMemo = func => {
const memoize = function (n) {
const cache = memoize.cache
if (cache[n - 1]) {
console.log(`get factorial(${n}) from cache...`)
return cache[n - 1]
} else {
const result = func.apply(null, arguments)
cache[n - 1] = result
return result
}
}
memoize.cache = []
return memoize
}
const factorial = factorialMemo( function (n) {
return n === 1 ? 1 : factorial(n - 1) * n
});
|
ログイン後にコピー
ソース コードでメモ化を再選択
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | export function defaultMemoize(func, equalityCheck = defaultEqualityCheck) {
let lastArgs = null
let lastResult = null
return function () {
if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, arguments)) {
lastResult = func.apply(null, arguments)
}
lastArgs = arguments
return lastResult
}
};
|
ログイン後にコピー
ソース コードより, lastArgs が引数と同じ場合、func は再度実行されないことがわかります。
概要
メモ化は、不必要な繰り返し計算を回避し、計算速度を向上させる最適化テクノロジです。
以上がJavaScript でのメモ化の使用法 (コード) の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。