ホームページ > ウェブフロントエンド > jsチュートリアル > JavaScript でのメモ化の使用法 (コード) の紹介

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

不言
リリース: 2018-10-17 16:48:05
転載
2774 人が閲覧しました

この記事では、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 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 を使用して階乗を実装することが次のとおりです:

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

    // 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 サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート