From 4a3e0b7239de01ee71c63953d93c9eb036e17ffa Mon Sep 17 00:00:00 2001 From: "aditya.kumar" Date: Wed, 24 Nov 2021 23:45:49 +0530 Subject: [PATCH 1/2] fix #844 --- Cache/LRUCache.js | 91 +++++++++++------------------------------------ 1 file changed, 21 insertions(+), 70 deletions(-) diff --git a/Cache/LRUCache.js b/Cache/LRUCache.js index 1bee800891..1b25415dc6 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.capacity = capacity - this.numKeys = 0 - this.hits = 0 - this.miss = 0 - this.cache = {} + this.cache = new Map(); + this.capacity = capacity; + this.hits = 0; + this.miss = 0; } 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) { - this.hits += 1 - this.list.add(this.list.remove(this.cache[key])) - return this.cache[key].val + // 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; + return value; + }else{ + this.miss+=1; + return null; } - this.miss += 1 - return null } } From 8cec6bb8ca5715ab00ca283ef638e73390d82c38 Mon Sep 17 00:00:00 2001 From: "aditya.kumar" Date: Thu, 25 Nov 2021 11:06:29 +0530 Subject: [PATCH 2/2] formatted code according to standard.js --- Cache/LRUCache.js | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Cache/LRUCache.js b/Cache/LRUCache.js index 1b25415dc6..e416e03776 100644 --- a/Cache/LRUCache.js +++ b/Cache/LRUCache.js @@ -1,10 +1,10 @@ class LRUCache { // LRU Cache to store a given capacity of data constructor (capacity) { - this.cache = new Map(); - this.capacity = capacity; - this.hits = 0; - this.miss = 0; + this.cache = new Map() + this.capacity = capacity + this.hits = 0 + this.miss = 0 } cacheInfo () { @@ -14,25 +14,25 @@ class LRUCache { set (key, value) { // Sets the value for the input key and if the key exists it updates the existing key - if(this.cache.size===this.capacity){ + if (this.cache.size === this.capacity) { // delete oldest key existing in map - this.cache.delete(this.cache.keys().next().value); + this.cache.delete(this.cache.keys().next().value) } - this.cache.set(key,value); + this.cache.set(key, value) } get (key) { // 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); + 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; - return value; - }else{ - this.miss+=1; - return null; + this.cache.delete(key) + this.cache.set(key, value) + this.hits += 1 + return value + } else { + this.miss += 1 + return null } } }