ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript でのメモ化の使用法 (コード) の紹介

JavaScript でのメモ化の使用法 (コード) の紹介

不言
不言転載
2018-10-17 16:48:052635ブラウズ

この記事では、JavaScript でのメモ化の使用法 (コード) を紹介します。必要な方は参考にしていただければ幸いです。

memoization はラテン語の memorandum (「覚えておくべき」) に由来しており、暗記と混同しないでください。

まず、Wikipedia の説明を見てみましょう:

コンピューティングにおいて、メモ化またはメモ化は、主に高コストの関数呼び出しの結果を保存し、キャッシュされた結果を返すことによってコンピューター プログラムを高速化するために使用される最適化手法です。

簡単に言えば、メモ化は、高コストの関数呼び出しの結果を保存し、同じ入力が再度発生したときにキャッシュされた結果を返すことによって、主にコンピューター プログラムを高速化するために使用される最適化手法です。

この記事では、まずメモ化最適化技術を使用する簡単な例を紹介し、次にアンダースコアでメモ化を使用するソースコードを解釈し、ライブラリを再選択して理解を深めます。

Factorial

メモ化を使用しない

何も考えずに、すぐに次のコードを書きます:

const factorial = n => {
    if (n === 1) {
        return 1
    } else {
        return factorial(n - 1) * n
    }
};

Use memoization

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
    }
};

クロージャとメモ化の使用

一般的な方法は、クロージャとメモ化を一緒に使用することです:

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 では、次のような書き方が最も一般的な形式です。

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
});

この階乗の例から、メモ化は空間と時間を交換する方法であり、次回同じ入力が発生したときに結果が直接出力されることがわかります。 、実行速度が向上します。

アンダースコア ソース コードのメモ化

// Memoize an expensive function by storing its results.
_.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 を使用して階乗を実装することが次のとおりです:

const factorial = _.memoize(function(n) {
    return n === 1 ? 1 : factorial(n - 1) * n
});

このソース コード、上記の階乗を参照してください。 引き続き次のように変換できます。

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
});

ソース コードでメモ化を再選択

export function defaultMemoize(func, equalityCheck = defaultEqualityCheck) {
    let lastArgs = null
    let lastResult = null
    // we reference arguments instead of spreading them for performance reasons
    return function () {
        if (!areArgumentsShallowlyEqual(equalityCheck, lastArgs, arguments)) {
            // apply arguments instead of spreading for performance.
            lastResult = func.apply(null, arguments)
        }

        lastArgs = arguments
        return lastResult
    }
};

ソース コードより, lastArgs が引数と同じ場合、func は再度実行されないことがわかります。

概要

メモ化は、不必要な繰り返し計算を回避し、計算速度を向上させる最適化テクノロジです。

以上がJavaScript でのメモ化の使用法 (コード) の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。