Orivel Orivel
Menue oeffnen

Implementierung eines Least Recently Used (LRU) Caches

Vergleiche Modellantworten fuer diese Programmierung-Benchmark-Aufgabe und pruefe Scores, Kommentare und verwandte Beispiele.

Bitte einloggen oder registrieren, um Likes und Favoriten zu nutzen. Registrieren

X f L

Inhalt

Aufgabenubersicht

Vergleichsgenres

Programmierung

Aufgaben-Erstellermodell

Antwortende Modelle

Bewertungsmodelle

Aufgabenstellung

Implementieren Sie eine LRU (Least Recently Used) Cache-Datenstruktur in Python. Ihre Implementierung sollte eine Klasse namens `LRUCache` sein, die die folgenden Operationen unterstützt: 1. `__init__(self, capacity: int)` — Initialisieren Sie den Cache mit einer positiven Ganzzahl-Kapazität. 2. `get(self, key: int) -> int` — Geben Sie den Wert zurück, der dem Schlüssel zugeordnet ist, falls er im Cache vorhanden ist, andernfalls geben Sie -1 zurück. Der Zugriff auf einen Schlüssel zählt als "Verwendung". 3. `put(...

Mehr anzeigen

Implementieren Sie eine LRU (Least Recently Used) Cache-Datenstruktur in Python. Ihre Implementierung sollte eine Klasse namens `LRUCache` sein, die die folgenden Operationen unterstützt: 1. `__init__(self, capacity: int)` — Initialisieren Sie den Cache mit einer positiven Ganzzahl-Kapazität. 2. `get(self, key: int) -> int` — Geben Sie den Wert zurück, der dem Schlüssel zugeordnet ist, falls er im Cache vorhanden ist, andernfalls geben Sie -1 zurück. Der Zugriff auf einen Schlüssel zählt als "Verwendung". 3. `put(self, key: int, value: int) -> None` — Fügen Sie das Schlüssel-Wert-Paar ein oder aktualisieren Sie es. Wenn der Cache nach der Einfügung seine Kapazität überschreitet, verwerfen Sie den am wenigsten zuletzt verwendeten Schlüssel. Sowohl `get` als auch `put` müssen in einer durchschnittlichen Zeitkomplexität von O(1) laufen. Stellen Sie die vollständige Klassenimplementierung bereit. Demonstrieren Sie dann seine Korrektheit, indem Sie die Ausgabe der folgenden Sequenz von Operationen zeigen: ``` cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # Erwartet: 10 cache.put(3, 30) # Verwirft Schlüssel 2 print(cache.get(2)) # Erwartet: -1 cache.put(4, 40) # Verwirft Schlüssel 1 print(cache.get(1)) # Erwartet: -1 print(cache.get(3)) # Erwartet: 30 print(cache.get(4)) # Erwartet: 40 ``` Erklären Sie kurz, wie Ihre Implementierung eine O(1) Zeitkomplexität für beide Operationen erreicht.

Bewertungsrichtlinie

Eine gute Antwort sollte: (1) Eine vollständige, lauffähige Python-Klasse namens `LRUCache` mit korrekten `__init__`, `get` und `put` Methoden bereitstellen. (2) Eine geeignete Datenstrukturkombination verwenden (z. B. eine Hashmap plus eine doppelt verkettete Liste oder Pythons `OrderedDict`), um durchschnittlich O(1) Zeit für `get` und `put` zu erreichen. (3) Die Verwerfung des am wenigsten zuletzt verwendeten Elements korrekt handhaben, wenn die Kapazität überschritten wird. (4) Die korrekte Ausgabe für die Demo...

Mehr anzeigen

Eine gute Antwort sollte: (1) Eine vollständige, lauffähige Python-Klasse namens `LRUCache` mit korrekten `__init__`, `get` und `put` Methoden bereitstellen. (2) Eine geeignete Datenstrukturkombination verwenden (z. B. eine Hashmap plus eine doppelt verkettete Liste oder Pythons `OrderedDict`), um durchschnittlich O(1) Zeit für `get` und `put` zu erreichen. (3) Die Verwerfung des am wenigsten zuletzt verwendeten Elements korrekt handhaben, wenn die Kapazität überschritten wird. (4) Die korrekte Ausgabe für die Demonstrationssequenz liefern: 10, -1, -1, 30, 40. (5) Eine klare, genaue Erklärung liefern, warum die gewählten Datenstrukturen eine O(1) Zeitkomplexität ergeben. Qualitätseinbußen für: Falsche Ausgabe, fehlende Behandlung von Randfällen (z. B. Aktualisierung eines vorhandenen Schlüssels), Verwendung von Datenstrukturen, die kein O(1) erreichen (z. B. Scannen einer Liste), oder unvollständiger/nicht lauffähiger Code.

Antworten

Antwort 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...

Vollstandige Antwort anzeigen

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.

Ergebnis

#1 | Sieger

Siegstimmen

2 / 3

Durchschnittsscore

98

Gesamtpunktzahl

98

Gesamtkommentar

Hervorragende Implementierung eines LRU-Caches, der alle Anforderungen vollständig erfüllt. Die Lösung verwendet eine gut gestaltete Kombination aus einer Hash-Map und einer doppelt verketteten Liste mit Sentinel-Knoten, um eine Zeitkomplexität von O(1) sowohl für Get- als auch für Put-Operationen zu erreichen. Der Code ist sauber, gut strukturiert und behandelt alle Randfälle korrekt, einschließlich der Aktualisierung vorhandener Schlüssel und der ordnungsgemäßen Auslagerung. Die Demonstration liefert die exakt erwartete Ausgabe (10, -1, -1, 30, 40), und die Erklärung der O(1)-Komplexität ist korrekt und klar. Die Verwendung von __slots__ in der Node-Klasse zeigt Aufmerksamkeit für Speichereffizienz. Kleinere Beobachtungen: Der ValueError für eine nicht positive Kapazität ist ein netter defensiver Touch, war aber nicht explizit erforderlich; die Erklärung könnte etwas detaillierter sein, warum Dictionary-Lookups im Durchschnitt O(1) sind. Insgesamt ist dies eine Implementierung in Produktionsqualität.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
98

Die Implementierung ist korrekt und liefert die exakt erwartete Ausgabesequenz (10, -1, -1, 30, 40). Alle Kernoperationen funktionieren ordnungsgemäß: get gibt korrekte Werte zurück und markiert Elemente als kürzlich verwendet, put fügt neue Elemente korrekt ein und aktualisiert vorhandene, und die Auslagerung entfernt ordnungsgemäß das am wenigsten kürzlich verwendete Element, wenn die Kapazität überschritten wird. Die doppelt verkettete Liste mit Sentinels behält die Reihenfolge der kürzlichen Verwendung korrekt bei. Randfälle wie die Aktualisierung eines vorhandenen Schlüssels werden korrekt behandelt. Der einzige geringfügige Abzug ist, dass der ValueError für eine nicht positive Kapazität, obwohl gute Praxis, nicht explizit für die Aufgabe erforderlich war.

Vollstandigkeit

Gewichtung 20%
100

Die Antwort ist vollständig. Sie liefert die gesamte LRUCache-Klasse mit allen erforderlichen Methoden (__init__, get, put), enthält eine vollständige funktionierende Demonstration mit der exakt angegebenen Testsequenz, erzeugt alle erwarteten Ausgaben und schließt mit einer klaren Erklärung der O(1)-Zeitkomplexität ab. Die Implementierung enthält Hilfsmethoden (_remove, _add_to_front, _move_to_front, _evict_lru), die gut organisiert und für die Lösung notwendig sind. Nichts fehlt oder ist unvollständig.

Codequalitat

Gewichtung 20%
95

Der Code ist von hoher Qualität mit ausgezeichneter Struktur und Lesbarkeit. Die Verwendung einer verschachtelten _Node-Klasse mit __slots__ zeigt Bewusstsein für Speichereffizienz. Methodennamen sind beschreibend und folgen Python-Konventionen. Die doppelt verkettete Liste mit Sentinel-Knoten ist elegant und vermeidet Randfälle der Nullprüfung. Kommentare erklären klar das Layout der Datenstruktur und den Zweck jeder Methode. Der Code ist gut organisiert mit logischer Trennung der Belange. Kleinere Anmerkung: Der Erläuterungskommentar am Ende könnte etwas detaillierter auf die durchschnittliche Komplexität von Hash-Maps eingehen, aber dies ist ein sehr kleiner Punkt.

Praktischer Nutzen

Gewichtung 15%
95

Diese Implementierung hat einen hohen praktischen Wert als Referenzlösung. Sie demonstriert Best Practices für die Implementierung von LRU-Caches: Verwendung geeigneter Datenstrukturen (Hash-Map + doppelt verkettete Liste), ordnungsgemäße Verwendung von Sentinel-Knoten zur Eliminierung von Randfällen und klare Trennung von Hilfsmethoden. Der Code ist produktionsreif und könnte direkt in realen Anwendungen verwendet werden. Die defensive ValueError-Prüfung erhöht die Robustheit. Die Implementierung wäre ein hervorragendes lehrreiches Beispiel, um zu verstehen, wie Datenstrukturen kombiniert werden können, um spezifische Zeitkomplexitätsanforderungen zu erfüllen.

Befolgung der Anweisungen

Gewichtung 10%
100

Die Antwort folgt allen Anweisungen präzise. Sie liefert eine vollständige Klasse namens 'LRUCache' mit den drei erforderlichen Methoden und korrekten Signaturen. Sowohl get als auch put erreichen eine durchschnittliche Zeitkomplexität von O(1) unter Verwendung geeigneter Datenstrukturen. Die Demonstrationssequenz wird exakt wie angegeben mit korrekter Ausgabe ausgeführt. Die Erklärung der O(1)-Komplexität ist enthalten und korrekt. Alle Anforderungen der Bewertungsrichtlinie sind erfüllt: korrekte Ausgabe, ordnungsgemäße Behandlung von Randfällen (Aktualisierung vorhandener Schlüssel), Verwendung von O(1)-Datenstrukturen und vollständiger lauffähiger Code.

Bewertungsmodelle Google Gemini 2.5 Flash

Gesamtpunktzahl

100

Gesamtkommentar

Die bereitgestellte LRUCache-Implementierung ist außerordentlich gut strukturiert, korrekt und hochgradig effizient. Sie nutzt korrekt eine Kombination aus einer Hashmap und einer benutzerdefinierten doppelt verketteten Liste mit Sentinel-Knoten, um die geforderte durchschnittliche Zeitkomplexität von O(1) sowohl für `get`- als auch für `put`-Operationen zu erreichen. Der Code zeigt eine ausgezeichnete Liebe zum Detail, einschließlich der Verwendung von `__slots__` für die Knotenklasse und einer robusten Handhabung verschiedener Cache-Operationen wie die Aktualisierung bestehender Schlüssel und die Auslagerung des zuletzt verwendeten Elements. Die Demonstrationsausgabe ist vollkommen korrekt und die Erklärung der Zeitkomplexität ist klar und präzise.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
100

Die Implementierung ist vollkommen korrekt. Die gesamte LRU-Cache-Logik, einschließlich Schlüsselabruf, Aktualisierungen, Einfügungen und Auslagerung des zuletzt verwendeten Elements, funktioniert wie erwartet. Die bereitgestellte Demonstrationssequenz erzeugt exakt die korrekte Ausgabe.

Vollstandigkeit

Gewichtung 20%
100

Die Antwort liefert eine vollständige `LRUCache`-Klasse mit allen erforderlichen Methoden (`__init__`, `get`, `put`), eine klare Demonstration ihrer Verwendung und eine prägnante Erklärung ihrer Zeitkomplexität. Nichts Gefordertes fehlte.

Codequalitat

Gewichtung 20%
100

Die Codequalität ist ausgezeichnet. Er ist gut organisiert mit Hilfsmethoden für die Operationen der verketteten Liste, verwendet Sentinel-Knoten für eine sauberere Listenmanipulation und enthält `__slots__` für Speichereffizienz in der `_Node`-Klasse. Die Variablennamen sind beschreibend und die Gesamtstruktur ist sehr gut lesbar und wartbar.

Praktischer Nutzen

Gewichtung 15%
100

Diese Implementierung ist äußerst praktisch und produktionsreif. Sie zeigt ein tiefes Verständnis der für einen LRU-Cache erforderlichen Datenstrukturen und liefert eine robuste und effiziente Lösung. Die explizite Implementierung einer benutzerdefinierten doppelt verketteten Liste bietet volle Kontrolle und Einblick in den zugrunde liegenden Mechanismus, was sie in Szenarien wertvoll macht, in denen `collections.OrderedDict` möglicherweise nicht geeignet ist oder ein tieferes Verständnis erforderlich ist.

Befolgung der Anweisungen

Gewichtung 10%
100

Alle Anweisungen wurden präzise befolgt. Die Klasse heißt `LRUCache`, die Methoden entsprechen den angegebenen Signaturen, die durchschnittliche Zeitkomplexität von O(1) wird erreicht und erklärt, die Kapazitätsprüfung ist vorhanden und die Demonstrationssequenz sowie ihre Ausgabe entsprechen exakt den Anforderungen.

Bewertungsmodelle OpenAI GPT-5 mini

Gesamtpunktzahl

97

Gesamtkommentar

Gut implementierter LRU-Cache: korrektes Verhalten, effiziente O(1)-Operationen mittels Hashmap + doppelt verketteter Liste, und die bereitgestellte Demonstration liefert die erwartete Ausgabe. Der Code ist klar und lauffähig, kleine Stil-/Anmerkungsverbesserungen sind möglich (z.B. mehr Typanmerkungen oder Docstrings), aber nichts davon beeinträchtigt die Korrektheit oder Leistung.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
100

Die Implementierung ist korrekt: get und put verhalten sich wie spezifiziert, Updates verschieben Elemente zu MRU, Eviction entfernt das LRU bei Überschreiten der Kapazität, und die Demonstration gibt die erwartete Sequenz aus (10, -1, -1, 30, 40). Randfälle wie das Aktualisieren eines vorhandenen Schlüssels und Null-/Negative-Kapazität (ValueError) werden behandelt.

Vollstandigkeit

Gewichtung 20%
100

Die Lösung umfasst eine vollständige, lauffähige LRUCache-Klasse mit __init__, get und put, eine Demonstration der erforderlichen Operationssequenz und eine prägnante Erklärung der O(1)-Komplexität. Alle im Prompt geforderten Verhaltensweisen sind vorhanden.

Codequalitat

Gewichtung 20%
90

Der Code ist sauber und gut strukturiert: innere Node-Klasse mit __slots__, Sentinel-Kopf-/Schwanzknoten und klare Hilfsmethoden für Listenoperationen. Kleinere Stilverbesserungen könnten zusätzliche Typanmerkungen (z.B. für self.map) und Docstrings/Kommentare für öffentliche Methoden beinhalten, aber diese beeinträchtigen die Korrektheit nicht.

Praktischer Nutzen

Gewichtung 15%
90

Die Implementierung ist effizient und praktisch für die reale Nutzung: O(1) durchschnittliche Operationen, Node-Design mit geringem Overhead und klare Semantik. Für den Produktionseinsatz könnte man Thread-Sicherheitsüberlegungen oder reichhaltigere Typisierung/Dokumentation hinzufügen, aber die Kernfunktionalität ist solide.

Befolgung der Anweisungen

Gewichtung 10%
100

Alle Anweisungen wurden befolgt: Die Klasse LRUCache wurde bereitgestellt, die erforderlichen Methoden mit korrekten Signaturen implementiert, die Demonstration enthalten und die Erklärung der O(1)-Komplexität ist zutreffend.

```python import collections class LRUCache: """ Eine Implementierung eines Least Recently Used (LRU)-Caches. Dieser Cache verwendet ein Wörterbuch für O(1)-Schlüssel-Lookups und eine doppelt verkettete Liste, um die Reihenfolge der Nutzung beizubehalten. Das Wörterbuch ordnet Schlüssel Knoten in der verketteten Liste zu. """ # Innere Klasse zur Darstellung eines Knotens in der doppelt verketteten Liste class _Node: def __init__(self, key=0, value=0): self.key = key self.value = value self.prev = None self.next = None...

Vollstandige Antwort anzeigen

```python import collections class LRUCache: """ Eine Implementierung eines Least Recently Used (LRU)-Caches. Dieser Cache verwendet ein Wörterbuch für O(1)-Schlüssel-Lookups und eine doppelt verkettete Liste, um die Reihenfolge der Nutzung beizubehalten. Das Wörterbuch ordnet Schlüssel Knoten in der verketteten Liste zu. """ # Innere Klasse zur Darstellung eines Knotens in der doppelt verketteten Liste 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): """ Initialisiert den Cache mit einer positiven Ganzzahl-Kapazität. """ if capacity <= 0: raise ValueError("Kapazität muss eine positive Ganzzahl sein.") self.capacity = capacity self.cache = {} # Sentinel-Knoten für Kopf und Schwanz, um Listenoperationen zu vereinfachen self.head = self._Node() self.tail = self._Node() self.head.next = self.tail self.tail.prev = self.head def _remove_node(self, node: _Node): "Entfernt einen Knoten aus der verketteten Liste." 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): "Fügt einen Knoten vorne in die verkettete Liste ein (zuletzt verwendet)." 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): "Verschiebt einen vorhandenen Knoten an den Anfang der Liste." self._remove_node(node) self._add_to_front(node) def get(self, key: int) -> int: """ Gibt den Wert zurück, der dem Schlüssel zugeordnet ist, wenn er existiert, andernfalls -1. Der Zugriff auf einen Schlüssel markiert ihn als zuletzt verwendet. """ if key in self.cache: node = self.cache[key] # Verschiebt den zugegriffenen Knoten nach vorne, um ihn als kürzlich verwendet zu markieren self._move_to_front(node) return node.value return -1 def put(self, key: int, value: int) -> None: """ Fügt ein Schlüssel-Wert-Paar ein oder aktualisiert es. Wenn die Kapazität überschritten wird, wird der zuletzt verwendete Schlüssel verdrängt. """ if key in self.cache: # Schlüssel existiert, aktualisiert seinen Wert und verschiebt ihn nach vorne node = self.cache[key] node.value = value self._move_to_front(node) else: # Schlüssel ist neu, erstellt einen neuen Knoten new_node = self._Node(key, value) self.cache[key] = new_node self._add_to_front(new_node) # Wenn der Cache die Kapazität überschreitet, wird das zuletzt verwendete Element verdrängt if len(self.cache) > self.capacity: # Das LRU-Element ist dasjenige direkt vor dem Schwanz-Sentinel lru_node = self.tail.prev self._remove_node(lru_node) del self.cache[lru_node.key] # --- Demonstration --- print("Demonstration der LRUCache-Funktionalität:") cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(f"get(1): {cache.get(1)}") # Erwartet: 10 cache.put(3, 30) # Verdrängt Schlüssel 2 print(f"get(2): {cache.get(2)}") # Erwartet: -1 cache.put(4, 40) # Verdrängt Schlüssel 1 print(f"get(1): {cache.get(1)}") # Erwartet: -1 print(f"get(3): {cache.get(3)}") # Erwartet: 30 print(f"get(4): {cache.get(4)}") # Erwartet: 40 # --- Erwartete Ausgabe der Demonstration --- # Demonstration der LRUCache-Funktionalität: # get(1): 10 # get(2): -1 # get(1): -1 # get(3): 30 # get(4): 40 # --- Erklärung der O(1)-Zeitkomplexität --- # Die durchschnittliche O(1)-Zeitkomplexität für sowohl `get` als auch `put` wird durch die Kombination zweier Datenstrukturen erreicht: # 1. **Eine Hash-Map (Wörterbuch):** Pythons `dict` bietet eine durchschnittliche Zeitkomplexität von O(1) für Einfügungen, Löschungen und Lookups. In dieser Implementierung speichert das Wörterbuch `self.cache` Schlüssel und ordnet sie direkt ihren entsprechenden Knoten in der doppelt verketteten Liste zu. Dies ermöglicht es uns, jeden Knoten im Cache sofort anhand seines Schlüssels zu lokalisieren. # 2. **Eine doppelt verkettete Liste:** Diese Datenstruktur behält die Reihenfolge der Nutzung bei. Das Hinzufügen eines neuen Knotens an den Anfang (zuletzt verwendet) oder das Entfernen des letzten Knotens (am wenigsten zuletzt verwendet) sind O(1)-Operationen, da nur wenige Zeiger aktualisiert werden müssen. Wenn auf ein Element zugegriffen oder es aktualisiert wird, kann sein entsprechender Knoten (der per Hash-Map in O(1) gefunden wird) durch einfaches Neuverknüpfen seiner Nachbarn in O(1) an den Anfang der Liste verschoben werden. # Durch die gemeinsame Verwendung beider Strukturen können alle Teile der `get`- und `put`-Operationen – Nachschlagen eines Schlüssels, Aktualisieren eines Wertes, Verschieben eines Knotens und Entfernen des LRU-Knotens – in konstanter durchschnittlicher Zeit durchgeführt werden. ```

Ergebnis

#2

Siegstimmen

1 / 3

Durchschnittsscore

97

Gesamtpunktzahl

98

Gesamtkommentar

Dies ist eine ausgezeichnete Implementierung eines LRU-Caches, die alle Anforderungen vollständig erfüllt. Der Code verwendet eine gut konzipierte Kombination aus einer Hashmap und einer doppelt verketteten Liste mit Sentinel-Knoten, um eine Zeitkomplexität von O(1) für sowohl get- als auch put-Operationen zu erreichen. Die Implementierung behandelt alle Randfälle korrekt, einschließlich der Aktualisierung vorhandener Schlüssel und der Verdrängung des am wenigsten verwendeten Elements. Die Demonstration erzeugt die exakt erwartete Ausgabe (10, -1, -1, 30, 40), und die Erklärung der Zeitkomplexität ist klar und genau. Der Code ist sauber, gut dokumentiert und produktionsreif.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
98

Die Implementierung ist funktional korrekt und liefert die exakt erwartete Ausgabesequenz. Alle Operationen (get, put, eviction) funktionieren wie spezifiziert. Randfälle werden ordnungsgemäß behandelt: Die Aktualisierung vorhandener Schlüssel verschiebt sie nach vorne, neue Schlüssel werden korrekt hinzugefügt, und die LRU-Verdrängung entfernt den richtigen Knoten. Die einzige geringfügige Beobachtung ist, dass der ValueError für eine nicht-positive Kapazität zwar eine gute Praxis ist, aber nicht ausdrücklich in der Aufgabenstellung gefordert war.

Vollstandigkeit

Gewichtung 20%
100

Die Antwort ist vollständig vollständig. Sie stellt die gesamte LRUCache-Klasse mit allen erforderlichen Methoden (__init__, get, put) bereit, enthält eine vollständige funktionierende Demonstration mit der exakten Testsequenz, erzeugt alle erwarteten Ausgaben und liefert eine gründliche Erklärung der Zeitkomplexität von O(1). Hilfsmethoden (_remove_node, _add_to_front, _move_to_front) sind gut implementiert und für die Lösung notwendig.

Codequalitat

Gewichtung 20%
95

Der Code ist gut strukturiert und sehr lesbar. Er enthält klare Docstrings für die Klasse und alle Methoden, verwendet aussagekräftige Variablennamen und setzt Sentinel-Knoten elegant ein, um Randbedingungen zu vereinfachen. Die innere _Node-Klasse ist angemessen definiert. Der Code folgt den Python-Konventionen und ist wartbar. Kleinigkeit: Der ungenutzte Import von `collections` könnte entfernt werden, obwohl dies vernachlässigbar ist.

Praktischer Nutzen

Gewichtung 15%
98

Diese Implementierung ist sofort praktisch und produktionsreif. Der Ansatz mit der doppelt verketteten Liste und Sentinel-Knoten ist ein Standard, bewährtes Muster für LRU-Caches. Der Code behandelt reale Szenarien korrekt (Aktualisierung vorhandener Schlüssel, Kapazitätsverwaltung). Die Erklärung zeigt ein tiefes Verständnis dafür, warum dieses Design funktioniert, und macht es daher wertvoll für Lern- und Implementierungsreferenzen.

Befolgung der Anweisungen

Gewichtung 10%
100

Die Antwort folgt präzise allen Anweisungen. Sie stellt eine vollständige, ausführbare Python-Klasse namens LRUCache mit korrekten Methodensignaturen bereit. Sie verwendet geeignete Datenstrukturen (Hashmap + doppelt verkettete Liste), die eine Komplexität von O(1) erreichen. Sie behandelt die Verdrängung korrekt, erzeugt die exakt erwartete Ausgabesequenz (10, -1, -1, 30, 40) und enthält eine klare, genaue Erklärung zur Erzielung der Zeitkomplexität von O(1).

Bewertungsmodelle Google Gemini 2.5 Flash

Gesamtpunktzahl

98

Gesamtkommentar

Die bereitgestellte LRUCache-Implementierung ist ausgezeichnet. Sie implementiert korrekt die LRU-Logik mithilfe eines Dictionaries für O(1)-Lookups und einer benutzerdefinierten doppelt verketteten Liste für O(1)-Ordnungsverwaltung. Der Code ist gut strukturiert, enthält gute Docstrings und behandelt Randfälle wie Kapazitätsvalidierung und Aktualisierung vorhandener Schlüssel robust. Die Demonstration stimmt perfekt mit der erwarteten Ausgabe überein, und die Erklärung der O(1)-Zeitkomplexität ist klar und genau. Die einzige geringfügige Verbesserung wäre das Entfernen des ungenutzten 'collections'-Imports, aber dies beeinträchtigt die insgesamt hohe Qualität nicht.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
98

Die LRUCache-Implementierung ist funktional korrekt. Sie behandelt `get`- und `put`-Operationen korrekt, einschließlich der Aktualisierung vorhandener Schlüssel, der Eviktion des am wenigsten kürzlich verwendeten Elements bei Überschreitung der Kapazität und der Rückgabe von -1 für nicht vorhandene Schlüssel. Die Verwendung eines Dictionaries und einer benutzerdefinierten doppelt verketteten Liste erreicht korrekt eine durchschnittliche Zeitkomplexität von O(1) für beide Operationen. Die Demonstration der Ausgabe stimmt perfekt mit der erwarteten Ausgabe überein.

Vollstandigkeit

Gewichtung 20%
100

Die Antwort ist vollständig. Sie enthält die gesamte `LRUCache`-Klassenimplementierung, einschließlich der Methoden `__init__`, `get` und `put`. Eine umfassende Demonstration ihrer Funktionalität mit der angegebenen Sequenz von Operationen ist enthalten, zusammen mit einer klaren und genauen Erklärung der O(1)-Zeitkomplexität.

Codequalitat

Gewichtung 20%
95

Die Codequalität ist sehr hoch. Die Klasse `LRUCache` ist gut strukturiert mit einer internen `_Node`-Klasse und Hilfsmethoden für verkettete Listenoperationen (`_remove_node`, `_add_to_front`, `_move_to_front`), die Lesbarkeit und Wartbarkeit verbessern. Docstrings sind für die Klasse und die Hauptmethoden vorhanden. Die Verwendung von Sentinel-Kopf- und -Schwanzknoten für die doppelt verkettete Liste vereinfacht die Listenmanipulation und verbessert die Robustheit. Eine Kapazitätsvalidierung ist enthalten. Der einzige sehr geringfügige Punkt ist ein ungenutzter Import (`collections`).

Praktischer Nutzen

Gewichtung 15%
97

Der implementierte LRU-Cache ist äußerst praktisch und effizient. Er verwendet die Standard- und leistungsfähigste Kombination aus Hash-Map und doppelt verketteter Liste, was O(1)-Operationen gewährleistet. Das Design ist robust und wäre für reale Caching-Szenarien geeignet, bei denen die Leistung entscheidend ist. Es behandelt verschiedene Betriebsszenarien korrekt, was es zuverlässig macht.

Befolgung der Anweisungen

Gewichtung 10%
100

Alle Anweisungen in der Eingabeaufforderung wurden sorgfältig befolgt. Die Klasse heißt `LRUCache`, und die Methoden `__init__`, `get` und `put` haben die korrekten Signaturen und Verhaltensweisen. Die Kapazität wird als positive Ganzzahl behandelt, O(1)-Komplexität wird erreicht und erklärt, die Eviktionslogik ist korrekt, und die Demonstrationssequenz und ihre Ausgabe sind genau wie angegeben.

Bewertungsmodelle OpenAI GPT-5 mini

Gesamtpunktzahl

96

Gesamtkommentar

Eine korrekte, gut strukturierte LRUCache-Implementierung mit einer Hashmap und einer doppelt verketteten Liste. Die Klasse implementiert get und put in O(1) durchschnittlicher Zeit, enthält eine Demonstration, die die erwarteten Ergebnisse liefert, und erklärt die Komplexität klar. Kleinere Probleme: ein ungenutzter Import (collections) und kleine stilistische Einwände, die jedoch die Korrektheit oder Leistung nicht beeinträchtigen.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
100

Die Implementierung ist funktional korrekt: get und put verhalten sich wie spezifiziert, die Verdrängung entfernt das am wenigsten zuletzt verwendete Element, die Aktualisierung eines vorhandenen Schlüssels funktioniert, und die Demonstration liefert die erwarteten Ausgaben (10, -1, -1, 30, 40). Randfälle wie die Durchsetzung der Kapazität werden behandelt.

Vollstandigkeit

Gewichtung 20%
95

Bietet eine vollständige, lauffähige LRUCache-Klasse mit __init__, get und put, Hilfsmethoden, einer Demonstration der erforderlichen Sequenz und einer Erklärung der Komplexität. Geringfügige Abzüge nur für die Aufnahme eines unnötigen Imports und die nicht exakte Darstellung der Rohausgabezeilen wie in der Aufforderung (Beschriftungen wurden hinzugefügt), aber die Funktionalität ist vollständig.

Codequalitat

Gewichtung 20%
90

Code ist sauber, lesbar und gut dokumentiert mit Hilfsmethoden und Sentinel-Knoten zur Vereinfachung von Listenoperationen. Kleinere Probleme: ein ungenutzter 'collections'-Import und geringfügige stilistische Entscheidungen bei der Typ-Annotation für die innere Klasse; ansonsten gute Struktur und Benennung.

Praktischer Nutzen

Gewichtung 15%
90

Die Implementierung ist praktisch und effizient für die reale Nutzung: O(1) durchschnittliche Operationen, klare Speicherverwaltung und unkomplizierte API. Der ValueError bei nicht-positiver Kapazität ist sinnvoll. Keine Leistungspannen im Kerndesign.

Befolgung der Anweisungen

Gewichtung 10%
100

Folgt den Anweisungen präzise: Klasse namens LRUCache, korrekte Methodensignaturen, O(1) durchschnittliche Komplexität erreicht mit Dictionary + doppelt verketteter Liste, korrektes Verdrängungsverhalten, Demonstration enthalten und eine prägnante Erklärung, warum Operationen O(1) sind.

Vergleichsuebersicht

Fur jede Aufgabe und Diskussion wird die Endrangfolge per Richter-Rangaggregation bestimmt (Durchschnittsrang + Borda-Tie-Break). Der Durchschnittsscore wird als Referenz angezeigt.

Bewerter: 3

Siegstimmen

2 / 3

Durchschnittsscore

98
Diese Antwort ansehen

Siegstimmen

1 / 3

Durchschnittsscore

97
Diese Antwort ansehen

Bewertungsergebnisse

X f L