Last active
September 25, 2024 11:09
-
-
Save andersonbosa/952dd42e72054c5c5f560ba027201803 to your computer and use it in GitHub Desktop.
coderbyte chall
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function LRUCache(strArr) { | |
const CACHE_SIZE = 5 | |
const cache = [] | |
// // console.time('ARRAY_PERFORMANCE') | |
// strArr.forEach( | |
// char => { | |
// const charIndex = cache.indexOf(char) | |
// if (charIndex === -1) { | |
// if (cache.length == CACHE_SIZE) { | |
// cache.shift() | |
// } | |
// cache.push(char) | |
// } else { | |
// cache.splice(charIndex, 1) | |
// cache.push(char) | |
// } | |
// } | |
// ) | |
// // console.timeEnd('ARRAY_PERFORMANCE') | |
// return cache.join('-') | |
const cacheMap = new Map() | |
// console.time('MAP_PERFORMANCE') | |
strArr.forEach( | |
char => { | |
if (cacheMap.has(char)) { | |
cacheMap.delete(char) | |
} else if (cacheMap.size === CACHE_SIZE) { | |
cacheMap.delete(cacheMap.keys().next().value) | |
} | |
cacheMap.set(char, true) | |
} | |
) | |
// console.timeEnd('MAP_PERFORMANCE') | |
return Array.from(cacheMap.keys()).join('-') | |
} | |
// keep this function call here | |
console.log(LRUCache(readline())); | |
/* | |
- constrain: input contain characters ranging from A to Z in some arbitrary order | |
- constrain: cache size = 5 elements | |
- [x] lru cache algo | |
- [ ] after lru algo, return the order of the cache with | |
the elements joined into a string, separated by a hyphen | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
O problema do "LRU Cache" (Least Recently Used) envolve gerenciar uma estrutura de dados que armazena um número limitado de elementos, de forma que os itens menos utilizados recentemente sejam descartados quando necessário. A ideia é implementar um cache que armazena até um determinado número de itens e, quando o cache está cheio, descartar o item menos utilizado recentemente para liberar espaço para um novo.
Explicação do Algoritmo "LRU Cache"
Definição do Tamanho do Cache (
CACHE_SIZE
):CACHE_SIZE
é definida como 5, indicando que o cache pode armazenar até 5 elementos. Este valor representa a capacidade máxima do cache.Inicialização do
cacheMap
:Map
é criado para armazenar os elementos do cache. OMap
é utilizado porque permite armazenar pares de chave-valor e mantém a ordem de inserção dos elementos, o que é importante para este algoritmo.Iteração sobre
strArr
:char
emstrArr
:cacheMap.has(char)
), significa que ele foi utilizado recentemente. Então, ele é removido (cacheMap.delete(char)
) e reinserido no final (última posição), para indicar que foi o mais recentemente usado.cacheMap.size === CACHE_SIZE
), o elemento menos recentemente utilizado (o primeiro elemento doMap
) é removido. O métodocacheMap.keys().next().value
retorna a chave do primeiro elemento, que é então removido comcacheMap.delete(...)
.char
é inserido no cache (cacheMap.set(char, true)
). Como resultado, ele se torna o mais recentemente utilizado.Retorno dos Elementos do Cache:
cacheMap
, unidas por um hífen (-
). As chaves são convertidas para uma matriz e, em seguida, unidas (join
) em uma string no formato desejado.Funcionamento do LRU Cache
Map
é utilizado porque mantém a ordem de inserção dos elementos, e a remoção e re-inserção de elementos atualiza essa ordem.Complexidade do Algoritmo
Map
têm complexidade média deO(1)
, tornando o algoritmo eficiente para gerenciar o cache.CACHE_SIZE
, que é constante.