「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Javascriptを使用したLRUキャッシュの実装

Javascriptを使用したLRUキャッシュの実装

2024 年 10 月 31 日公開
ブラウズ:756

LRU Cache Implementation using Javascript

導入

LRU は最も最近使用されていないことを表します。 LRU キャッシュは、キャッシュの容量に達すると、最も最近使用されていないエントリが削除されるタイプのキャッシュです。

  • LRU キャッシュを使用する主な理由は、データへのアクセスのパフォーマンスを向上させることです。通常、キャッシュからデータにアクセスする方が、メイン メモリやリモート サーバーからデータを取得するよりも高速です。
  • 最近使用したデータをキャッシュに保存することで、キャッシュ ヒットの可能性が高まり、データの取得速度が向上します。

参考:

  • マップ データ構造は、ハッシュ テーブルの動作を模倣するために使用されます。これにより、効率的な検索、挿入、削除操作が可能になります。
  • 要素間を簡単に移動できるようにするために、二重リンクリストが実装されています。これにより、両方向 (前方と後方) にトラバースし、一定時間の挿入と削除を実行できるようになります。
  • これら 2 つのデータ構造を組み合わせることで、ハッシュ テーブルとダブル リンク リストの両方の利点を活用して、効率的な操作が可能になります。

LRU キャッシュを JavaScript で実装する方法の基本的な例を次に示します:

// Why we need this LRU
class Node {
    constructor(key, value) {
        this.key = key;
        this.value = value;
        this.next = null;
        this.prev = null;
    }
}

//Least Recently used
class LRU {
    constructor() {
     this.head = this.tail = null;
     this.map = new Map();
     this.size = 0; // Why I added size, because may be in future we can say if capacity reach to the size, we will remove the tail first and then insert.
    }

    get(key) {
        if (this.map.has(key)) {
            const node = this.map.get(key);

            if (node !== this.head) {
                this.remove(node);
                this.insert(node);
            }

            return node.value;
        }

        return -1;
    }

    update(key, value) {
        if (this.map.has(key)) {
            let node = this.map.get(key);
            node.value = value;

            if (node !== this.head) {
                this.remove(node);
                this.insert(node);
            }

            return node.value;
        } else {
            console.log('Key not found'); 
            // Here we can check for capacity if available we can call insert
            // if capacity is not available we will remove the tail and then insert.
        }
    }

    remove(node) {
        if (node === this.tail) {
            this.tail = this.tail.prev;
        }

        const prevNode = node.prev;
        const nextNode = node.next;

        prevNode.next = nextNode;
        nextNode.prev = prevNode;
    }

    insert(key, value) {
        const newNode = new Node(key, value);
        this.map.set(key, newNode);
        if (this.head === null) {
            this.head = this.tail = newNode;
            this.size = 1;
            return;
        }
        // We need to insert at the Begining
        newNode.next = this.head;
        this.head.prev = newNode;
        this.head= newNode;
        this.size  ;
        return;
    }
}

const test = new LRU();
test.insert('A', 20);
test.insert('B', 10);
test.insert('C', 5);
test.insert('D', 7);

console.log(test);
console.log('------------------');
console.log('C ---> ', test.get('C'));
console.log('D ---> ', test.get('D'));

console.log('D ---> ', test.update('B', 100));

/*
LRU {
  tail:  Node {
    key: 'A',
    value: 20,
    next: null,
    prev: Node { key: 'B', value: 10, next: [Circular *1], prev: [Node] }
  },
  head:  Node {
    key: 'D',
    value: 7,
    next: Node { key: 'C', value: 5, next: [Node], prev: [Circular *2] },
    prev: null
  },
  map: Map(4) {
    'A' =>  Node {
      key: 'A',
      value: 20,
      next: null,
      prev: [Node]
    },
    'B' => Node { key: 'B', value: 10, next: [Node], prev: [Node] },
    'C' => Node { key: 'C', value: 5, next: [Node], prev: [Node] },
    'D' =>  Node {
      key: 'D',
      value: 7,
      next: [Node],
      prev: null
    }
  },
  size: 4
}
------------------
C --->  5
D --->  7
D --->  100
B --->  100
*/

ご不明な点がございましたら、お気軽にご連絡ください。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/ashutoshsarangi/lru-cache-implementation-using-javascript-48no?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3