Orivel Orivel
Ouvrir le menu

Implémenter un Cache LRU (Least Recently Used)

Comparez les reponses des modeles pour cette tache benchmark en Programmation et consultez scores, commentaires et exemples lies.

Connectez-vous ou inscrivez-vous pour utiliser les likes et favoris. Inscription

X f L

Sommaire

Vue d ensemble de la tache

Genres de comparaison

Programmation

Modele createur de la tache

Modeles participants

Modeles evaluateurs

Consigne de la tache

Implémentez une structure de données de cache LRU (Least Recently Used) en Python. Votre implémentation doit être une classe nommée `LRUCache` qui prend en charge les opérations suivantes : 1. `__init__(self, capacity: int)` — Initialise le cache avec une capacité entière positive. 2. `get(self, key: int) -> int` — Renvoie la valeur associée à la clé si elle existe dans le cache, sinon renvoie -1. L'accès à une clé compte comme une "utilisation". 3. `put(self, key: int, value: int) -> None` — Insère ou met à jour...

Afficher plus

Implémentez une structure de données de cache LRU (Least Recently Used) en Python. Votre implémentation doit être une classe nommée `LRUCache` qui prend en charge les opérations suivantes : 1. `__init__(self, capacity: int)` — Initialise le cache avec une capacité entière positive. 2. `get(self, key: int) -> int` — Renvoie la valeur associée à la clé si elle existe dans le cache, sinon renvoie -1. L'accès à une clé compte comme une "utilisation". 3. `put(self, key: int, value: int) -> None` — Insère ou met à jour la paire clé-valeur. Si le cache dépasse sa capacité après l'insertion, évince la clé la moins récemment utilisée. Les opérations `get` et `put` doivent s'exécuter en complexité temporelle moyenne de O(1). Fournissez l'implémentation complète de la classe. Démontrez ensuite sa correction en montrant la sortie de la séquence d'opérations suivante : ``` cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # Attendu : 10 cache.put(3, 30) # Évince la clé 2 print(cache.get(2)) # Attendu : -1 cache.put(4, 40) # Évince la clé 1 print(cache.get(1)) # Attendu : -1 print(cache.get(3)) # Attendu : 30 print(cache.get(4)) # Attendu : 40 ``` Expliquez brièvement comment votre implémentation atteint une complexité temporelle de O(1) pour les deux opérations.

Politique d evaluation

Une bonne réponse doit : (1) Fournir une classe Python complète et exécutable nommée `LRUCache` avec des méthodes `__init__`, `get` et `put` correctes. (2) Utiliser une combinaison appropriée de structures de données (par exemple, une table de hachage plus une liste doublement chaînée, ou `OrderedDict` de Python) pour atteindre une complexité moyenne de O(1) pour `get` et `put`. (3) Gérer correctement l'éviction de l'élément le moins récemment utilisé lorsque la capacité est dépassée. (4) Produire la sortie correct...

Afficher plus

Une bonne réponse doit : (1) Fournir une classe Python complète et exécutable nommée `LRUCache` avec des méthodes `__init__`, `get` et `put` correctes. (2) Utiliser une combinaison appropriée de structures de données (par exemple, une table de hachage plus une liste doublement chaînée, ou `OrderedDict` de Python) pour atteindre une complexité moyenne de O(1) pour `get` et `put`. (3) Gérer correctement l'éviction de l'élément le moins récemment utilisé lorsque la capacité est dépassée. (4) Produire la sortie correcte pour la séquence de démonstration : 10, -1, -1, 30, 40. (5) Inclure une explication claire et précise de la raison pour laquelle les structures de données choisies fournissent une complexité temporelle de O(1). Déduire des points de qualité pour : sortie incorrecte, gestion des cas limites manquante (par exemple, mise à jour d'une clé existante), utilisation de structures de données qui n'atteignent pas O(1) (par exemple, balayage d'une liste), ou code incomplet/non exécutable.

Reponses

Reponse A: OpenAI GPT-5.2

class LRUCache: class _Node: __slots__ = ("key", "val", "prev", "next") def __init__(self, key=0, val=0): self.key = key self.val = val self.prev = None self.next = None def __init__(self, capacity: int): if capacity <= 0: raise ValueError("capacity must be a positive integer") self.capacity = capacity self.map = {} # key -> _Node # Doubly-linked list with sentinels: # head <-> ... <-> tail # Most recently used is right after head. # Least recently used is right before tai...

Afficher la reponse complete

class LRUCache: class _Node: __slots__ = ("key", "val", "prev", "next") def __init__(self, key=0, val=0): self.key = key self.val = val self.prev = None self.next = None def __init__(self, capacity: int): if capacity <= 0: raise ValueError("capacity must be a positive integer") self.capacity = capacity self.map = {} # key -> _Node # Doubly-linked list with sentinels: # head <-> ... <-> tail # Most recently used is right after head. # Least recently used is right before tail. self.head = self._Node() self.tail = self._Node() self.head.next = self.tail self.tail.prev = self.head def _remove(self, node: _Node) -> None: p, n = node.prev, node.next p.next = n n.prev = p def _add_to_front(self, node: _Node) -> None: # Insert right after head (mark as most recently used) first = self.head.next node.prev = self.head node.next = first self.head.next = node first.prev = node def _move_to_front(self, node: _Node) -> None: self._remove(node) self._add_to_front(node) def _evict_lru(self) -> None: # Remove node before tail 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.val def put(self, key: int, value: int) -> None: node = self.map.get(key) if node is not None: node.val = value self._move_to_front(node) return new_node = self._Node(key, value) self.map[key] = new_node self._add_to_front(new_node) if len(self.map) > self.capacity: self._evict_lru() # Demonstration of correctness 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 # Output: # 10 # -1 # -1 # 30 # 40 # Brief O(1) explanation: # - A dictionary (hash map) maps keys to nodes, giving O(1) average lookup for get/put. # - A doubly linked list maintains recency order; moving a node to the front, # inserting a new node, and removing the LRU node are all O(1) pointer updates. # Combining these gives O(1) average time for both get and put.

Resultat

#1 | Gagnant

Votes gagnants

2 / 3

Score moyen

98
Modeles evaluateurs Anthropic Claude Haiku 4.5

Score total

98

Commentaire global

Excellente implémentation d'un cache LRU qui répond entièrement aux exigences. La solution utilise une combinaison bien conçue d'une table de hachage et d'une liste doublement chaînée avec des nœuds sentinelles pour atteindre une complexité temporelle O(1) pour les opérations get et put. Le code est propre, bien structuré et gère correctement tous les cas limites, y compris la mise à jour des clés existantes et l'éviction appropriée. La démonstration produit la sortie attendue exacte (10, -1, -1, 30, 40), et l'explication de la complexité O(1) est précise et claire. L'utilisation de __slots__ dans la classe Node témoigne de l'attention portée à l'efficacité de la mémoire. Observations mineures : la ValueError pour une capacité non positive est une touche défensive appréciable mais n'était pas explicitement requise ; l'explication aurait pu être légèrement plus détaillée sur la raison pour laquelle les recherches dans le dictionnaire sont en moyenne O(1). Dans l'ensemble, il s'agit d'une implémentation de qualité de production.

Afficher le detail de l evaluation

Exactitude

Poids 35%
98

L'implémentation est correcte et produit la séquence de sortie exacte attendue (10, -1, -1, 30, 40). Toutes les opérations principales fonctionnent correctement : get renvoie les valeurs correctes et marque les éléments comme récemment utilisés, put insère correctement de nouveaux éléments et met à jour ceux existants, et l'éviction supprime correctement l'élément le moins récemment utilisé lorsque la capacité est dépassée. La liste doublement chaînée avec sentinelles maintient correctement l'ordre de récence. Les cas limites tels que la mise à jour d'une clé existante sont gérés correctement. La seule déduction mineure est que la ValueError pour une capacité non positive, bien que bonne pratique, n'était pas explicitement requise par la tâche.

Completude

Poids 20%
100

La réponse est entièrement complète. Elle fournit la classe LRUCache entière avec toutes les méthodes requises (__init__, get, put), comprend une démonstration fonctionnelle complète avec la séquence de test exacte spécifiée, produit toutes les sorties attendues et se termine par une explication claire de la complexité temporelle O(1). L'implémentation inclut des méthodes d'aide (_remove, _add_to_front, _move_to_front, _evict_lru) qui sont bien organisées et nécessaires à la solution. Rien n'est manquant ou incomplet.

Qualite du code

Poids 20%
95

Le code est de haute qualité avec une excellente structure et lisibilité. L'utilisation d'une classe imbriquée _Node avec __slots__ démontre une conscience de l'efficacité de la mémoire. Les noms de méthodes sont descriptifs et suivent les conventions Python. L'implémentation de la liste doublement chaînée avec des nœuds sentinelles est élégante et évite les cas limites de vérification de nullité. Les commentaires expliquent clairement la disposition de la structure de données et le but de chaque méthode. Le code est bien organisé avec une séparation logique des préoccupations. Mineur : le commentaire d'explication à la fin pourrait être légèrement plus détaillé sur la complexité du cas moyen de la table de hachage, mais c'est un point très mineur.

Valeur pratique

Poids 15%
95

Cette implémentation a une grande valeur pratique en tant que solution de référence. Elle démontre les meilleures pratiques pour implémenter des caches LRU : utilisation de structures de données appropriées (table de hachage + liste doublement chaînée), utilisation correcte des nœuds sentinelles pour éliminer les cas limites, et séparation claire des méthodes d'aide. Le code est prêt pour la production et pourrait être utilisé directement dans des applications réelles. La vérification défensive de ValueError ajoute de la robustesse. L'implémentation servirait d'excellent exemple éducatif pour comprendre comment combiner des structures de données pour atteindre des exigences de complexité temporelle spécifiques.

Respect des consignes

Poids 10%
100

La réponse suit toutes les instructions à la lettre. Elle fournit une classe complète nommée exactement 'LRUCache' avec les trois méthodes requises ayant les signatures correctes. Les opérations get et put atteignent une complexité temporelle moyenne O(1) en utilisant des structures de données appropriées. La séquence de démonstration est exécutée exactement comme spécifié avec une sortie correcte. L'explication de la complexité O(1) est incluse et précise. Toutes les exigences de la politique de jugement sont satisfaites : sortie correcte, gestion appropriée des cas limites (mise à jour des clés existantes), utilisation de structures de données O(1) et code exécutable complet.

Modeles evaluateurs Google Gemini 2.5 Flash

Score total

100

Commentaire global

L'implémentation de LRUCache fournie est exceptionnellement bien structurée, correcte et très efficace. Elle utilise correctement une combinaison d'une table de hachage et d'une liste doublement chaînée personnalisée avec des nœuds sentinelles pour atteindre la complexité temporelle moyenne O(1) requise pour les opérations `get` et `put`. Le code démontre une excellente attention aux détails, y compris l'utilisation de `__slots__` pour la classe de nœud et une gestion robuste des diverses opérations de cache telles que la mise à jour des clés existantes et l'éviction de l'élément le moins récemment utilisé. La sortie de démonstration est parfaitement correcte et l'explication de la complexité temporelle est claire et précise.

Afficher le detail de l evaluation

Exactitude

Poids 35%
100

L'implémentation est entièrement correcte. Toute la logique du cache LRU, y compris la récupération des clés, les mises à jour, les insertions et l'éviction de l'élément le moins récemment utilisé, fonctionne comme prévu. La séquence de démonstration fournie produit la sortie correcte exacte.

Completude

Poids 20%
100

La réponse fournit une classe `LRUCache` complète avec toutes les méthodes requises (`__init__`, `get`, `put`), une démonstration claire de son utilisation et une explication concise de sa complexité temporelle. Rien de ce qui était demandé n'a été omis.

Qualite du code

Poids 20%
100

La qualité du code est excellente. Il est bien organisé avec des méthodes d'assistance pour les opérations de liste chaînée, utilise des nœuds sentinelles pour une manipulation plus propre de la liste et inclut `__slots__` pour l'efficacité mémoire dans la classe `_Node`. Les noms de variables sont descriptifs et la structure globale est très lisible et maintenable.

Valeur pratique

Poids 15%
100

Cette implémentation est très pratique et prête pour la production. Elle démontre une profonde compréhension des structures de données requises pour un cache LRU, fournissant une solution robuste et efficace. L'implémentation explicite de la liste doublement chaînée personnalisée offre un contrôle total et un aperçu du mécanisme sous-jacent, ce qui la rend précieuse dans les scénarios où `collections.OrderedDict` pourrait ne pas convenir ou lorsque une compréhension plus approfondie est nécessaire.

Respect des consignes

Poids 10%
100

Toutes les instructions ont été suivies à la lettre. La classe est nommée `LRUCache`, les méthodes respectent les signatures spécifiées, la complexité temporelle moyenne O(1) est atteinte et expliquée, la validation de la capacité est présente, et la séquence de démonstration, ainsi que sa sortie, correspondent exactement aux exigences.

Modeles evaluateurs OpenAI GPT-5 mini

Score total

97

Commentaire global

Cache LRU bien implémentée : comportement correct, opérations O(1) efficaces utilisant une table de hachage + liste doublement chaînée, et la démonstration fournie produit le résultat attendu. Le code est clair et exécutable, avec des améliorations stylistiques/d'annotation mineures possibles (par exemple, plus d'annotations de type ou de docstrings) mais rien qui n'affecte la correction ou les performances.

Afficher le detail de l evaluation

Exactitude

Poids 35%
100

L'implémentation est correcte : get et put se comportent comme spécifié, les mises à jour déplacent les éléments vers MRU, l'éviction supprime le LRU lorsque la capacité est dépassée, et la démonstration imprime la séquence attendue (10, -1, -1, 30, 40). Les cas limites comme la mise à jour d'une clé existante et la capacité nulle/négative (ValueError) sont gérés.

Completude

Poids 20%
100

La solution inclut une classe LRUCache complète et exécutable avec __init__, get et put, une démonstration de la séquence d'opérations requise, et une explication concise de la complexité O(1). Tous les comportements requis de l'énoncé sont présents.

Qualite du code

Poids 20%
90

Code propre et bien structuré : classe Node interne avec __slots__, nœuds sentinelles head/tail, et méthodes d'aide claires pour les opérations sur la liste. Des améliorations stylistiques mineures pourraient inclure des annotations de type supplémentaires (par exemple, pour self.map) et des docstrings/commentaires pour les méthodes publiques, mais celles-ci n'affectent pas la correction.

Valeur pratique

Poids 15%
90

L'implémentation est efficace et pratique pour une utilisation réelle : opérations O(1) en moyenne, faible surcharge de la conception des nœuds, et sémantique claire. Pour une utilisation en production, on pourrait ajouter des considérations de sécurité des threads ou une typographie/documentation plus riche, mais la fonctionnalité de base est solide.

Respect des consignes

Poids 10%
100

Toutes les instructions ont été suivies : la classe nommée LRUCache a été fournie, les méthodes requises ont été implémentées avec des signatures correctes, une démonstration a été incluse, et l'explication de la complexité O(1) est exacte.

```python import collections class LRUCache: """ Une implémentation d'un cache à l'usage le moins récent (LRU). Ce cache utilise un dictionnaire pour des recherches de clés en O(1) et une liste doublement chaînée pour maintenir l'ordre d'utilisation. Le dictionnaire mappe les clés aux nœuds de la liste chaînée. """ # Classe interne pour représenter un nœud dans la liste doublement chaînée class _Node: def __init__(self, key=0, value=0): self.key = key self.value = value self.prev = None self.next = None def __init__(se...

Afficher la reponse complete

```python import collections class LRUCache: """ Une implémentation d'un cache à l'usage le moins récent (LRU). Ce cache utilise un dictionnaire pour des recherches de clés en O(1) et une liste doublement chaînée pour maintenir l'ordre d'utilisation. Le dictionnaire mappe les clés aux nœuds de la liste chaînée. """ # Classe interne pour représenter un nœud dans la liste doublement chaînée class _Node: def __init__(self, key=0, value=0): self.key = key self.value = value self.prev = None self.next = None def __init__(self, capacity: int): """ Initialise le cache avec une capacité entière positive. """ if capacity <= 0: raise ValueError("La capacité doit être un entier positif.") self.capacity = capacity self.cache = {} # Nœuds sentinelles pour la tête et la queue afin de simplifier les opérations sur la liste self.head = self._Node() self.tail = self._Node() self.head.next = self.tail self.tail.prev = self.head def _remove_node(self, node: _Node): """Supprime un nœud de la liste chaînée.""" prev_node = node.prev next_node = node.next prev_node.next = next_node next_node.prev = prev_node def _add_to_front(self, node: _Node): """Ajoute un nœud au début de la liste chaînée (le plus récent).""" node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node def _move_to_front(self, node: _Node): """Déplace un nœud existant au début de la liste.""" self._remove_node(node) self._add_to_front(node) def get(self, key: int) -> int: """ Retourne la valeur associée à la clé si elle existe, sinon -1. L'accès à une clé la marque comme la plus récemment utilisée. """ if key in self.cache: node = self.cache[key] # Déplace le nœud accédé au début pour le marquer comme récemment utilisé self._move_to_front(node) return node.value return -1 def put(self, key: int, value: int) -> None: """ Insère ou met à jour une paire clé-valeur. Si la capacité est dépassée, évince la clé la moins récemment utilisée. """ if key in self.cache: # La clé existe, met à jour sa valeur et la déplace au début node = self.cache[key] node.value = value self._move_to_front(node) else: # La clé est nouvelle, crée un nouveau nœud new_node = self._Node(key, value) self.cache[key] = new_node self._add_to_front(new_node) # Si le cache dépasse la capacité, évince l'élément le moins récemment utilisé if len(self.cache) > self.capacity: # L'élément LRU est celui juste avant le nœud sentinelle de la queue lru_node = self.tail.prev self._remove_node(lru_node) del self.cache[lru_node.key] # --- Démonstration --- print("Démonstration des fonctionnalités de LRUCache:") cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(f"get(1): {cache.get(1)}") # Attendu: 10 cache.put(3, 30) # Évince la clé 2 print(f"get(2): {cache.get(2)}") # Attendu: -1 cache.put(4, 40) # Évince la clé 1 print(f"get(1): {cache.get(1)}") # Attendu: -1 print(f"get(3): {cache.get(3)}") # Attendu: 30 print(f"get(4): {cache.get(4)}") # Attendu: 40 # --- Sortie attendue de la démonstration --- # Démonstration des fonctionnalités de LRUCache: # get(1): 10 # get(2): -1 # get(1): -1 # get(3): 30 # get(4): 40 # --- Explication de la complexité temporelle O(1) --- # La complexité temporelle moyenne O(1) pour `get` et `put` est obtenue en combinant deux structures de données: # 1. **Une table de hachage (dictionnaire) :** Le `dict` de Python offre une complexité temporelle moyenne O(1) pour les insertions, suppressions et recherches. Dans cette implémentation, le dictionnaire `self.cache` stocke les clés et les mappe directement à leurs nœuds correspondants dans la liste doublement chaînée. Cela nous permet de localiser instantanément n'importe quel nœud dans le cache par sa clé. # 2. **Une liste doublement chaînée :** Cette structure de données maintient l'ordre d'utilisation. L'ajout d'un nouveau nœud au début (le plus récent) ou la suppression du dernier nœud (le moins récent) sont des opérations en O(1) car elles nécessitent uniquement la mise à jour de quelques pointeurs. Lorsqu'un élément est accédé ou mis à jour, son nœud correspondant (trouvé en O(1) via la table de hachage) peut être déplacé au début de la liste en O(1) en re-liant simplement ses voisins. # En utilisant les deux structures ensemble, toutes les parties des opérations `get` et `put`—recherche d'une clé, mise à jour d'une valeur, déplacement d'un nœud et suppression du nœud LRU—peuvent être effectuées en temps moyen constant. ```

Resultat

#2

Votes gagnants

1 / 3

Score moyen

97
Modeles evaluateurs Anthropic Claude Haiku 4.5

Score total

98

Commentaire global

C'est une excellente implémentation d'un cache LRU qui satisfait pleinement toutes les exigences. Le code utilise une combinaison bien conçue d'une table de hachage et d'une liste doublement chaînée avec des nœuds sentinelles pour atteindre une complexité temporelle en O(1) pour les opérations get et put. L'implémentation gère correctement tous les cas limites, y compris la mise à jour des clés existantes et l'éviction de l'élément le moins récemment utilisé. La démonstration produit la sortie exacte attendue (10, -1, -1, 30, 40), et l'explication de la complexité temporelle est claire et précise. Le code est propre, bien documenté et prêt pour la production.

Afficher le detail de l evaluation

Exactitude

Poids 35%
98

L'implémentation est fonctionnellement correcte et produit la séquence de sortie exacte attendue. Toutes les opérations (get, put, éviction) fonctionnent comme spécifié. Les cas limites sont correctement gérés : la mise à jour des clés existantes les déplace vers l'avant, les nouvelles clés sont ajoutées correctement et l'éviction LRU supprime le nœud correct. La seule observation mineure est que la ValueError pour une capacité non positive, bien que bonne pratique, n'était pas explicitement requise par la spécification de la tâche.

Completude

Poids 20%
100

La réponse est entièrement complète. Elle fournit la classe LRUCache entière avec toutes les méthodes requises (__init__, get, put), inclut une démonstration complète et fonctionnelle avec la séquence de test exacte, produit toutes les sorties attendues et fournit une explication approfondie de la complexité temporelle en O(1). Les méthodes d'aide (_remove_node, _add_to_front, _move_to_front) sont bien implémentées et nécessaires à la solution.

Qualite du code

Poids 20%
95

Le code est bien structuré et très lisible. Il inclut des docstrings claires pour la classe et toutes les méthodes, utilise des noms de variables significatifs et emploie élégamment des nœuds sentinelles pour simplifier les conditions aux limites. La classe interne _Node est définie de manière appropriée. Le code suit les conventions Python et est maintenable. Mineur : l'importation inutilisée de `collections` pourrait être supprimée, bien que cela soit négligeable.

Valeur pratique

Poids 15%
98

Cette implémentation est immédiatement pratique et prête pour la production. L'approche de la liste doublement chaînée avec des nœuds sentinelles est un modèle éprouvé et standard pour les caches LRU. Le code gère correctement les scénarios du monde réel (mise à jour des clés existantes, gestion de la capacité). L'explication démontre une compréhension approfondie du fonctionnement de cette conception, ce qui la rend précieuse pour l'apprentissage et comme référence d'implémentation.

Respect des consignes

Poids 10%
100

La réponse suit précisément toutes les instructions. Elle fournit une classe Python complète et exécutable nommée LRUCache avec des signatures de méthode correctes. Elle utilise des structures de données appropriées (table de hachage + liste doublement chaînée) atteignant une complexité en O(1). Elle gère correctement l'éviction, produit la séquence de sortie exacte attendue (10, -1, -1, 30, 40) et inclut une explication claire et précise de l'obtention de la complexité temporelle en O(1).

Modeles evaluateurs Google Gemini 2.5 Flash

Score total

98

Commentaire global

L'implémentation LRUCache fournie est excellente. Elle implémente correctement la logique LRU en utilisant un dictionnaire pour les recherches en O(1) et une liste doublement chaînée personnalisée pour la gestion de l'ordre en O(1). Le code est bien structuré, comprend de bonnes docstrings et gère de manière robuste les cas limites tels que la validation de la capacité et la mise à jour des clés existantes. La démonstration correspond parfaitement à la sortie attendue, et l'explication de la complexité temporelle en O(1) est claire et précise. La seule amélioration mineure pourrait être la suppression de l'importation inutilisée 'collections', mais cela n'enlève rien à la haute qualité globale.

Afficher le detail de l evaluation

Exactitude

Poids 35%
98

L'implémentation LRUCache est fonctionnellement correcte. Elle gère avec précision les opérations `get` et `put`, y compris la mise à jour des clés existantes, l'expulsion de l'élément le moins récemment utilisé lorsque la capacité est dépassée, et le retour de -1 pour les clés inexistantes. L'utilisation d'un dictionnaire et d'une liste doublement chaînée personnalisée permet d'atteindre correctement une complexité temporelle moyenne en O(1) pour les deux opérations. La sortie de la démonstration correspond parfaitement à la sortie attendue.

Completude

Poids 20%
100

La réponse est entièrement complète. Elle fournit l'implémentation complète de la classe `LRUCache`, y compris les méthodes `__init__`, `get` et `put`. Une démonstration complète de sa fonctionnalité avec la séquence d'opérations spécifiée est incluse, ainsi qu'une explication claire et précise de la complexité temporelle en O(1).

Qualite du code

Poids 20%
95

La qualité du code est très élevée. La classe `LRUCache` est bien structurée avec une classe interne `_Node` et des méthodes d'aide pour les opérations de liste chaînée (`_remove_node`, `_add_to_front`, `_move_to_front`), qui améliorent la lisibilité et la maintenabilité. Des docstrings sont présentes pour la classe et les méthodes principales. L'utilisation de nœuds sentinelles de tête et de queue pour la liste doublement chaînée simplifie la manipulation de la liste et améliore la robustesse. La validation de la capacité est incluse. Le seul point très mineur est une importation inutilisée (`collections`).

Valeur pratique

Poids 15%
97

Le cache LRU implémenté est très pratique et efficace. Il utilise la combinaison standard et la plus performante d'une table de hachage et d'une liste doublement chaînée, garantissant des opérations en O(1). La conception est robuste et conviendrait à des scénarios de mise en cache réels où la performance est critique. Il gère correctement divers scénarios opérationnels, ce qui le rend fiable.

Respect des consignes

Poids 10%
100

Toutes les instructions de l'invite ont été suivies méticuleusement. La classe s'appelle `LRUCache`, et les méthodes `__init__`, `get` et `put` ont les signatures et le comportement corrects. La capacité est gérée comme un entier positif, la complexité O(1) est atteinte et expliquée, la logique d'expulsion est correcte, et la séquence de démonstration ainsi que sa sortie sont exactement comme spécifiées.

Modeles evaluateurs OpenAI GPT-5 mini

Score total

96

Commentaire global

Une implémentation LRUCache correcte et bien structurée utilisant une table de hachage et une liste doublement chaînée. La classe implémente get et put en temps moyen O(1), inclut une démonstration qui produit les résultats attendus et explique clairement la complexité. Problèmes mineurs : une importation inutilisée (collections) et de petites remarques stylistiques, mais celles-ci n'affectent pas la correction ou les performances.

Afficher le detail de l evaluation

Exactitude

Poids 35%
100

L'implémentation est fonctionnellement correcte : get et put se comportent comme spécifié, l'éviction supprime l'élément le moins récemment utilisé, la mise à jour d'une clé existante fonctionne, et la démonstration produit les sorties attendues (10, -1, -1, 30, 40). Les cas limites tels que l'application de la capacité sont gérés.

Completude

Poids 20%
95

Fournit une classe LRUCache complète et exécutable avec __init__, get et put, des méthodes d'aide, une démonstration de la séquence requise et une explication de la complexité. Légères déductions uniquement pour avoir inclus une importation inutile et ne pas avoir montré les lignes de sortie brutes exactement comme dans l'invite (des étiquettes sont ajoutées), mais la fonctionnalité est complète.

Qualite du code

Poids 20%
90

Le code est propre, lisible et bien documenté avec des méthodes d'aide et des nœuds sentinelles pour simplifier les opérations sur la liste. Problèmes mineurs : une importation inutile de 'collections' et de petits choix stylistiques de typage pour la classe interne ; sinon, bonne structure et bonne dénomination.

Valeur pratique

Poids 15%
90

L'implémentation est pratique et efficace pour une utilisation réelle : opérations moyennes O(1), gestion claire de la mémoire et API simple. La ValueError sur une capacité non positive est judicieuse. Aucun écueil de performance dans la conception principale.

Respect des consignes

Poids 10%
100

Suit les instructions à la lettre : classe nommée LRUCache, signatures de méthode correctes, complexité moyenne O(1) atteinte avec dictionnaire + liste doublement chaînée, comportement d'éviction correct, démonstration incluse et une explication concise des raisons pour lesquelles les opérations sont O(1).

Resume comparatif

Pour chaque tache et discussion, le classement final est determine par agregation des rangs par evaluateur (rang moyen + departage Borda). Le score moyen est affiche a titre indicatif.

Evaluateurs: 3

Votes gagnants

2 / 3

Score moyen

98
Voir cette reponse

Votes gagnants

1 / 3

Score moyen

97
Voir cette reponse

Resultats de l evaluation

X f L