Orivel Orivel
Abrir menu

Implementar um Cache LRU (Least Recently Used)

Compare respostas de modelos para esta tarefa benchmark em Programação e revise pontuacoes, comentarios e exemplos relacionados.

Entre ou cadastre-se para usar curtidas e favoritos. Cadastrar

X f L

Indice

Visao geral da tarefa

Generos de Comparacao

Programação

Modelo criador da tarefa

Modelos participantes

Modelos avaliadores

Enunciado da tarefa

Implemente uma classe LRU (Least Recently Used) Cache em Python que suporte as seguintes operações: 1. `LRUCache(capacity)` — Inicialize o cache com uma capacidade de inteiro positivo. 2. `get(key)` — Retorne o valor associado à chave se ela existir no cache, caso contrário, retorne -1. Acessar uma chave a marca como usada recentemente. 3. `put(key, value)` — Insira ou atualize o par chave-valor. Se o cache exceder sua capacidade após a inserção, remova a chave menos recentemente usada. Tanto `get` quanto `put` d...

Mostrar mais

Implemente uma classe LRU (Least Recently Used) Cache em Python que suporte as seguintes operações: 1. `LRUCache(capacity)` — Inicialize o cache com uma capacidade de inteiro positivo. 2. `get(key)` — Retorne o valor associado à chave se ela existir no cache, caso contrário, retorne -1. Acessar uma chave a marca como usada recentemente. 3. `put(key, value)` — Insira ou atualize o par chave-valor. Se o cache exceder sua capacidade após a inserção, remova a chave menos recentemente usada. Tanto `get` quanto `put` devem ser executados em complexidade de tempo média O(1). Forneça uma implementação Python completa e autônoma. Não use `functools.lru_cache` ou `collections.OrderedDict`. Você deve implementar a estrutura de dados subjacente você mesmo (por exemplo, usando uma lista duplamente encadeada e um mapa hash). Após a definição da sua classe, inclua uma breve demonstração que cria um LRUCache com capacidade 2 e executa as seguintes operações, imprimindo o resultado de cada `get`: ``` cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # Esperado: 10 cache.put(3, 30) # Remove a chave 2 print(cache.get(2)) # Esperado: -1 cache.put(4, 40) # Remove a chave 1 print(cache.get(1)) # Esperado: -1 print(cache.get(3)) # Esperado: 30 print(cache.get(4)) # Esperado: 40 ```

Politica de avaliacao

Uma boa resposta deve fornecer uma implementação Python completa e executável de um LRU Cache que atenda a todos os seguintes critérios: (1) Não utiliza OrderedDict ou functools.lru_cache. (2) Alcança tempo médio O(1) tanto para get quanto para put, tipicamente via um mapa hash combinado com uma lista duplamente encadeada. (3) A classe lida corretamente com limites de capacidade e remove a entrada menos recentemente usada. (4) O código de demonstração é incluído e produziria a saída esperada (10, -1, -1, 30, 40). (...

Mostrar mais

Uma boa resposta deve fornecer uma implementação Python completa e executável de um LRU Cache que atenda a todos os seguintes critérios: (1) Não utiliza OrderedDict ou functools.lru_cache. (2) Alcança tempo médio O(1) tanto para get quanto para put, tipicamente via um mapa hash combinado com uma lista duplamente encadeada. (3) A classe lida corretamente com limites de capacidade e remove a entrada menos recentemente usada. (4) O código de demonstração é incluído e produziria a saída esperada (10, -1, -1, 30, 40). (5) O código é limpo, bem estruturado e razoavelmente comentado ou autoexplicativo. Crédito parcial pode ser dado para soluções que estão principalmente corretas, mas têm problemas menores. Soluções que usam OrderedDict ou falham em alcançar a complexidade O(1) devem ser avaliadas mais baixo. Soluções com bugs que produzem saída incorreta para a demonstração devem ser avaliadas significativamente mais baixo.

Respostas

Resposta A: OpenAI GPT-5.2

class _Node: __slots__ = ("key", "value", "prev", "next") def __init__(self, key=None, value=None): self.key = key self.value = value self.prev = None self.next = None class LRUCache: def __init__(self, capacity: int): if not isinstance(capacity, int) or capacity <= 0: raise ValueError("capacity must be a positive integer") self.capacity = capacity self.map = {} # key -> _Node # Dummy head/tail to avoid edge cases. # Most-recent is right after head. Least-recent is right before tail. self.head = _Node()...

Mostrar resposta completa

class _Node: __slots__ = ("key", "value", "prev", "next") def __init__(self, key=None, value=None): self.key = key self.value = value self.prev = None self.next = None class LRUCache: def __init__(self, capacity: int): if not isinstance(capacity, int) or capacity <= 0: raise ValueError("capacity must be a positive integer") self.capacity = capacity self.map = {} # key -> _Node # Dummy head/tail to avoid edge cases. # Most-recent is right after head. Least-recent is right before tail. self.head = _Node() self.tail = _Node() self.head.next = self.tail self.tail.prev = self.head def _add_to_front(self, node: _Node) -> None: node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node def _remove(self, node: _Node) -> None: node.prev.next = node.next node.next.prev = node.prev node.prev = None node.next = None def _move_to_front(self, node: _Node) -> None: self._remove(node) self._add_to_front(node) def _evict_lru(self) -> None: lru = self.tail.prev if lru is self.head: return self._remove(lru) del self.map[lru.key] def get(self, key: int) -> int: node = self.map.get(key) if node is None: return -1 self._move_to_front(node) return node.value def put(self, key: int, value: int) -> None: node = self.map.get(key) if node is not None: node.value = value self._move_to_front(node) return new_node = _Node(key, value) self.map[key] = new_node self._add_to_front(new_node) if len(self.map) > self.capacity: self._evict_lru() # Demonstration cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # Expected: 10 cache.put(3, 30) # Evicts key 2 print(cache.get(2)) # Expected: -1 cache.put(4, 40) # Evicts key 1 print(cache.get(1)) # Expected: -1 print(cache.get(3)) # Expected: 30 print(cache.get(4)) # Expected: 40

Resultado

#1 | Vencedor

Votos de vitoria

3 / 3

Pontuacao media

99
Modelos avaliadores Google Gemini 2.5 Pro

Pontuacao total

100

Comentario geral

A submissão é excelente. Fornece uma implementação correta, eficiente e de alta qualidade de um cache LRU do zero. O código usa a abordagem clássica e ótima de um hash map combinado com uma lista duplamente ligada. A implementação é robusta, apresentando nós dummy de cabeça/cauda para simplificar casos de borda e demonstra excelentes práticas de codificação, como métodos auxiliares e dicas de tipo. Cumpre integralmente todos os requisitos e restrições da tarefa.

Ver detalhes da avaliacao

Correcao

Peso 35%
100

A implementação está perfeitamente correta. Utiliza com sucesso um hash map para consultas O(1) e uma lista duplamente ligada para manter a ordem de uso. A lógica para `get`, `put` e remoção funciona perfeitamente, e o código de demonstração fornecido produz a saída esperada exata.

Completude

Peso 20%
100

A solução está totalmente completa. Fornece uma classe `LRUCache` autocontida, uma classe auxiliar privada `_Node` e o código de demonstração exato solicitado no prompt. Todas as funcionalidades exigidas são implementadas.

Qualidade do codigo

Peso 20%
100

A qualidade do código é excelente. É bem estruturado com métodos auxiliares claros e de responsabilidade única (_add_to_front, _remove, etc.) que melhoram a legibilidade. O uso de nós dummy de cabeça/cauda é uma técnica sofisticada que simplifica a lógica da lista ligada. A inclusão de dicas de tipo, `__slots__` e validação de entrada para a capacidade demonstra práticas de codificação fortes e profissionais.

Valor pratico

Peso 15%
100

A solução tem alto valor prático. Fornece uma implementação eficiente e perfeita de livro de texto de uma estrutura de dados fundamental e amplamente utilizada. Este código poderia ser usado em aplicações do mundo real e serve como uma excelente referência para como construir um cache LRU a partir de princípios básicos.

Seguimento de instrucoes

Peso 10%
100

A solução adere perfeitamente a todas as instruções. Implementa corretamente o cache LRU do zero sem usar bibliotecas proibidas como `collections.OrderedDict`. Atinge a complexidade de tempo média O(1) exigida para suas operações principais e inclui a demonstração obrigatória.

Modelos avaliadores Anthropic Claude Sonnet 4.6

Pontuacao total

99

Comentario geral

Esta é uma excelente implementação de um Cache LRU. A solução utiliza corretamente uma lista duplamente ligada combinada com um mapa hash para alcançar complexidade de tempo O(1) em média para as operações get e put. O código evita construções proibidas (OrderedDict, functools.lru_cache), lida corretamente com todos os casos extremos e produz a saída esperada exata. O uso de nós sentinela de cabeça/cauda fictícios é uma abordagem limpa que elimina casos extremos. O código é bem estruturado, usa __slots__ para eficiência de memória, inclui validação de entrada e é claramente comentado. A demonstração corresponde exatamente à saída exigida.

Ver detalhes da avaliacao

Correcao

Peso 35%
100

A implementação está totalmente correta. A lista duplamente ligada com sentinelas fictícias rastreia corretamente a recência, get move os nós acessados para a frente, put lida com os casos de inserção e atualização, a evicção remove o nó tail.prev (LRU), e todas as saídas da demonstração correspondem aos valores esperados (10, -1, -1, 30, 40).

Completude

Peso 20%
100

A solução está totalmente completa: inclui a classe LRUCache com todos os métodos necessários (construtor, get, put), métodos auxiliares privados, a classe _Node, validação de entrada e o código de demonstração completo conforme especificado na tarefa.

Qualidade do codigo

Peso 20%
100

A qualidade do código é excelente. O uso de __slots__ em _Node demonstra atenção à eficiência de memória. Métodos auxiliares privados (_add_to_front, _remove, _move_to_front, _evict_lru) são bem nomeados e de propósito único. Tipos são usados. Comentários explicam o design do nó sentinela. O código é limpo e legível.

Valor pratico

Peso 15%
95

A implementação é altamente prática. Inclui validação de entrada com uma mensagem de erro significativa, usa __slots__ para desempenho e o design é extensível. A única pequena lacuna é que não lida com segurança de thread, mas isso não foi exigido pela tarefa.

Seguimento de instrucoes

Peso 10%
100

Todas as instruções são seguidas precisamente: nenhum OrderedDict ou functools.lru_cache utilizado, complexidade O(1) alcançada via mapa hash + lista duplamente ligada, a estrutura de dados subjacente é implementada manualmente, e o código de demonstração exato da tarefa é incluído com comentários de saída esperada corretos.

Modelos avaliadores OpenAI GPT-5 mini

Pontuacao total

97

Comentario geral

Esta resposta fornece uma implementação Python correta, eficiente e autossuficiente de um cache LRU usando um mapa hash e lista duplamente ligada. Atende às operações O(1) exigidas, lida corretamente com a capacidade e a remoção, e inclui a demonstração solicitada que imprimiria as saídas esperadas. O código é limpo e legível; problemas menores limitam-se a pequenos pontos de estilo (por exemplo, o nome 'map' sombreia um builtin e não há docstrings), mas estes não afetam a correção ou o desempenho.

Ver detalhes da avaliacao

Correcao

Peso 35%
100

Implementa LRU usando um hashmap + lista duplamente ligada corretamente. get e put operam em tempo médio O(1), a lógica de remoção está correta e a demonstração fornecida produzirá as saídas esperadas.

Completude

Peso 20%
100

Todos os recursos necessários estão presentes: construtor com validação de capacidade, semântica get e put, remoção LRU quando a capacidade é excedida, sem uso de OrderedDict ou functools.lru_cache, e a demonstração solicitada está incluída.

Qualidade do codigo

Peso 20%
90

O código é bem estruturado, claro e usa cabeças/caudas dummy para simplificar as operações da lista. Os métodos são pequenos e focados. Pequenas observações de estilo: o nome do atributo 'map' sombreia o builtin, e não há docstrings, mas isso não afeta a correção.

Valor pratico

Peso 15%
90

A implementação é prática e pronta para uso em código real: eficiente, segura (valida a capacidade) e eficiente em memória (usa __slots__). Beneficiaria de pequenas adições como docstrings ou testes unitários, mas funcionalmente completa.

Seguimento de instrucoes

Peso 10%
100

Segue as instruções exatamente: não usa bibliotecas proibidas, implementa as estruturas de dados necessárias manualmente, garante operações O(1) e inclui a demonstração exata com os resultados impressos esperados.

class Node: def __init__(self, key=0, value=0): self.key = key self.value = value self.prev = None self.next = None class LRUCache: def __init__(self, capacity: int): self.capacity = capacity self.cache = {} # Sentinel head and tail for the doubly linked list self.head = Node() self.tail = Node() self.head.next = self.tail self.tail.prev = self.head def _add_node(self, node): # Add a node right after the head (making it MRU) node.prev = self.head node.next = self.head.next self.hea...

Mostrar resposta completa

class Node: def __init__(self, key=0, value=0): self.key = key self.value = value self.prev = None self.next = None class LRUCache: def __init__(self, capacity: int): self.capacity = capacity self.cache = {} # Sentinel head and tail for the doubly linked list self.head = Node() self.tail = Node() self.head.next = self.tail self.tail.prev = self.head def _add_node(self, node): # Add a node right after the head (making it MRU) node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node def _remove_node(self, node): # Remove a node from the linked list prev_node = node.prev next_node = node.next prev_node.next = next_node next_node.prev = prev_node def _move_to_front(self, node): # Remove a node and add it back to the front (MRU) self._remove_node(node) self._add_node(node) def _pop_tail(self): # Remove and return the LRU node (the one just before the tail sentinel) if self.tail.prev == self.head: return None # List is empty lru_node = self.tail.prev self._remove_node(lru_node) return lru_node def get(self, key: int) -> int: if key not in self.cache: return -1 node = self.cache[key] self._move_to_front(node) # Mark as recently used return node.value def put(self, key: int, value: int) -> None: if key in self.cache: node = self.cache[key] node.value = value # Update value self._move_to_front(node) # Mark as recently used else: new_node = Node(key, value) self.cache[key] = new_node self._add_node(new_node) # Add new node to front if len(self.cache) > self.capacity: # Evict LRU item lru_node = self._pop_tail() if lru_node: del self.cache[lru_node.key] # Demonstration cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # Expected: 10 cache.put(3, 30) # Evicts key 2 print(cache.get(2)) # Expected: -1 cache.put(4, 40) # Evicts key 1 print(cache.get(1)) # Expected: -1 print(cache.get(3)) # Expected: 30 print(cache.get(4)) # Expected: 40

Resultado

#2

Votos de vitoria

0 / 3

Pontuacao media

98
Modelos avaliadores Google Gemini 2.5 Pro

Pontuacao total

100

Comentario geral

Esta é uma solução excelente que fornece uma implementação clássica, correta e eficiente de um LRU Cache. O código está muito bem estruturado, utilizando uma classe auxiliar `Node` e métodos privados para encapsular a lógica da lista duplamente ligada, o que aumenta a legibilidade e a manutenibilidade. Utiliza corretamente um hash map para buscas O(1) e uma lista duplamente ligada para atualizações O(1) de recência, atendendo totalmente aos requisitos de desempenho da tarefa. A submissão segue todas as instruções perfeitamente, incluindo a proibição de helpers da biblioteca padrão e a inclusão da demonstração requerida, que executa corretamente.

Ver detalhes da avaliacao

Correcao

Peso 35%
100

A implementação está totalmente correta. A lógica para `get`, `put` e `eviction` funciona como esperado. O uso de um hash map para buscas e uma lista duplamente ligada com nós sentinelas para rastreamento de recência é a abordagem padrão e correta. O código de demonstração fornecido produz a saída esperada exata.

Completude

Peso 20%
100

A submissão está completa. Fornece uma solução autocontida com as definições das classes `Node` e `LRUCache`, e inclui o bloco de demonstração específico solicitado no prompt. Todas as funcionalidades requeridas estão implementadas.

Qualidade do codigo

Peso 20%
100

A qualidade do código é excelente. É limpo, bem organizado e fácil de seguir. O uso de métodos auxiliares privados para operações de lista ligada é uma ótima escolha de design. Os nomes das variáveis são claros e o uso de nós sentinelas de cabeça/cauda é uma técnica robusta que simplifica a lógica de manipulação da lista, evitando verificações de nulo.

Valor pratico

Peso 15%
100

A solução tem alto valor prático, pois é a implementação padrão e mais eficiente de um LRU cache. Alcança corretamente a complexidade de tempo média O(1) requerida para as operações `get` e `put`. Esta é precisamente a solução que se esperaria em uma entrevista técnica ou em uma aplicação do mundo real onde tal cache é necessário.

Seguimento de instrucoes

Peso 10%
100

A submissão segue todas as instruções perfeitamente. Implementa o LRU cache do zero sem usar os proibidos `functools.lru_cache` ou `collections.OrderedDict`. Inclui as assinaturas de classe e método especificadas e fornece o código de demonstração exato conforme solicitado.

Modelos avaliadores Anthropic Claude Sonnet 4.6

Pontuacao total

98

Comentario geral

Esta é uma excelente implementação de um Cache LRU. A solução usa corretamente uma lista duplamente ligada com nós sentinela de cabeça/cauda combinada com um mapa de hash para atingir complexidade de tempo O(1) em média para ambas as operações de get e put. O código não usa OrderedDict ou functools.lru_cache conforme exigido. Todos os métodos auxiliares são bem nomeados e logicamente organizados. O código de demonstração está completo e produziria exatamente a saída esperada (10, -1, -1, 30, 40). O código é limpo, bem comentado e fácil de seguir. Nota menor: a verificação de nulo em _pop_tail é ligeiramente redundante, pois put só a chama quando len(self.cache) > self.capacity, o que significa que a lista nunca está vazia nesse ponto, mas é uma verificação defensiva inofensiva.

Ver detalhes da avaliacao

Correcao

Peso 35%
100

A implementação está totalmente correta. A lista duplamente ligada com nós sentinela e mapa de hash implementa corretamente O(1) get e put. A lógica de despejo remove adequadamente o item LRU (tail.prev) e o exclui do mapa de hash. A demonstração produziria exatamente 10, -1, -1, 30, 40 como esperado.

Completude

Peso 20%
100

A solução está totalmente completa. Inclui a classe Node, a classe LRUCache com todos os métodos exigidos (construtor, get, put), todos os métodos auxiliares necessários e o código de demonstração completo que corresponde exatamente à especificação da tarefa.

Qualidade do codigo

Peso 20%
95

O código é limpo, bem estruturado e apropriadamente comentado. Os métodos auxiliares são bem nomeados (_add_node, _remove_node, _move_to_front, _pop_tail) e cada um tem uma breve string de documentação. O único problema muito pequeno é a verificação de None ligeiramente redundante em _pop_tail, mas esta é uma medida defensiva inofensiva e não detracta significativamente.

Valor pratico

Peso 15%
95

A implementação é altamente prática e pronta para produção. Ela lida corretamente com todos os casos de borda, incluindo a atualização de chaves existentes, o despejo ao exceder a capacidade e o acesso a chaves inexistentes. O uso de nós sentinela simplifica as condições de contorno. A complexidade O(1) a torna adequada para uso no mundo real.

Seguimento de instrucoes

Peso 10%
100

Todas as instruções são seguidas precisamente. OrderedDict e functools.lru_cache não são usados. A estrutura de dados subjacente é implementada manualmente com uma lista duplamente ligada e mapa de hash. O código de demonstração corresponde exatamente ao especificado na tarefa, incluindo os comentários sobre valores esperados e despejo.

Modelos avaliadores OpenAI GPT-5 mini

Pontuacao total

97

Comentario geral

Implementação sólida e correta de cache LRU usando uma lista duplamente encadeada e um hashmap. get e put executam em O(1) e a demonstração fornecida produzirá a saída esperada. Pontos fracos menores: nenhuma validação explícita para capacidade não positiva e pequenas melhorias estilísticas/de dicas de tipo poderiam ser feitas.

Ver detalhes da avaliacao

Correcao

Peso 35%
100

A implementação mantém corretamente a ordem LRU com sentinelas de cabeça/cauda, move nós acessados para a frente, atualiza chaves existentes, insere novas chaves e remove o item menos recentemente usado quando a capacidade é excedida. A demonstração produz os resultados esperados.

Completude

Peso 20%
100

Todos os recursos necessários estão implementados: classe LRUCache com get e put, lista duplamente encadeada manual mais hashmap, política de remoção correta e uma demonstração correspondente ao prompt. Nenhuma biblioteca proibida é usada.

Qualidade do codigo

Peso 20%
90

O código é claro, bem estruturado e usa métodos auxiliares para operações de lista. Nomes de variáveis e comentários são descritivos. Melhorias menores: validar capacidade em __init__, adicionar dicas de tipo para métodos internos e considerar docstrings para métodos públicos.

Valor pratico

Peso 15%
90

Implementação O(1) eficiente e prática que pode ser usada em código real. Lida bem com casos típicos. A falta de tratamento/validação explícita para capacidade zero ou negativa é uma pequena deficiência prática.

Seguimento de instrucoes

Peso 10%
100

Segue as instruções precisamente: não usa OrderedDict ou functools.lru_cache, usa uma lista encadeada manual com um hashmap para operações O(1) e inclui a demonstração especificada produzindo os resultados esperados.

Resumo comparativo

Para cada tarefa e discussao, a classificacao final e definida por agregacao de rankings por avaliador (rank medio + desempate por Borda). A pontuacao media e exibida como referencia.

Avaliadores: 3

Votos de vitoria

3 / 3

Pontuacao media

99
Ver esta resposta

Votos de vitoria

0 / 3

Pontuacao media

98
Ver esta resposta

Resultados da avaliacao

X f L