From 8b1a4b90f69466fcb6d3061e404db8882bf9eca5 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Thu, 25 Nov 2021 12:33:10 +0530 Subject: [PATCH] merge: fix #844 (#846) * fix #844 * formatted code according to standard.js --- Cache/LRUCache.js | 83 ++++++++++------------------------------------- 1 file changed, 17 insertions(+), 66 deletions(-) diff --git a/Cache/LRUCache.js b/Cache/LRUCache.js index 1bee80089..e416e0377 100644 --- a/Cache/LRUCache.js +++ b/Cache/LRUCache.js @@ -1,88 +1,39 @@ -class DoubleLinkedListNode { - // Double Linked List Node built specifically for LRU Cache - constructor (key, val) { - this.key = key - this.val = val - this.next = null - this.prev = null - } -} - -class DoubleLinkedList { - // Double Linked List built specifically for LRU Cache - constructor () { - this.head = new DoubleLinkedListNode(null, null) - this.rear = new DoubleLinkedListNode(null, null) - this.head.next = this.rear - this.rear.prev = this.head - } - - add (node) { - // Adds the given node to the end of the list (before rear) - const temp = this.rear.prev - temp.next = node - node.prev = temp - this.rear.prev = node - node.next = this.rear - } - - remove (node) { - // Removes and returns the given node from the list - const tempLast = node.prev - const tempNext = node.next - node.prev = null - node.next = null - tempLast.next = tempNext - tempNext.prev = tempLast - - return node - } -} - class LRUCache { // LRU Cache to store a given capacity of data constructor (capacity) { - this.list = new DoubleLinkedList() + this.cache = new Map() this.capacity = capacity - this.numKeys = 0 this.hits = 0 this.miss = 0 - this.cache = {} } cacheInfo () { // Return the details for the cache instance [hits, misses, capacity, current_size] - return `CacheInfo(hits=${this.hits}, misses=${this.miss}, capacity=${this.capacity}, current size=${this.numKeys})` + return `CacheInfo(hits=${this.hits}, misses=${this.miss}, capacity=${this.capacity}, current size=${this.cache.size})` } set (key, value) { - // Sets the value for the input key and updates the Double Linked List - if (!(key in this.cache)) { - if (this.numKeys >= this.capacity) { - const keyToDelete = this.list.head.next.key - this.list.remove(this.cache[keyToDelete]) - delete this.cache[keyToDelete] - this.numKeys -= 1 - } - this.cache[key] = new DoubleLinkedListNode(key, value) - this.list.add(this.cache[key]) - this.numKeys += 1 - } else { - const node = this.list.remove(this.cache[key]) - node.val = value - this.list.add(node) + // Sets the value for the input key and if the key exists it updates the existing key + if (this.cache.size === this.capacity) { + // delete oldest key existing in map + this.cache.delete(this.cache.keys().next().value) } + this.cache.set(key, value) } get (key) { - // Returns the value for the input key and updates the Double Linked List. Returns null if key is not present in cache - if (key in this.cache) { + // Returns the value for the input key. Returns null if key is not present in cache + if (this.cache.has(key)) { + const value = this.cache.get(key) + // refresh the cache to update the order of key + this.cache.delete(key) + this.cache.set(key, value) this.hits += 1 - this.list.add(this.list.remove(this.cache[key])) - return this.cache[key].val + return value + } else { + this.miss += 1 + return null } - this.miss += 1 - return null } }