Orivel Orivel
Menue oeffnen

Implementieren Sie einen Least Recently Used (LRU)-Cache

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, die die folgenden Operationen unterstützt, jeweils mit durchschnittlicher Zeitkomplexität O(1): 1. `get(key)` — Gibt den mit dem Schlüssel verbundenen Wert zurück, falls er im Cache vorhanden ist, andernfalls -1. Der Zugriff auf einen Schlüssel markiert ihn als kürzlich verwendet. 2. `put(key, value)` — Fügt das Schlüssel-Wert-Paar ein oder aktualisiert es. Wenn der Cache seine Kapazität erreicht hat, entfernen Sie das am wenigsten k...

Mehr anzeigen

Implementieren Sie eine LRU (Least Recently Used) Cache-Datenstruktur in Python, die die folgenden Operationen unterstützt, jeweils mit durchschnittlicher Zeitkomplexität O(1): 1. `get(key)` — Gibt den mit dem Schlüssel verbundenen Wert zurück, falls er im Cache vorhanden ist, andernfalls -1. Der Zugriff auf einen Schlüssel markiert ihn als kürzlich verwendet. 2. `put(key, value)` — Fügt das Schlüssel-Wert-Paar ein oder aktualisiert es. Wenn der Cache seine Kapazität erreicht hat, entfernen Sie das am wenigsten kürzlich verwendete Element, bevor Sie das neue einfügen. Ihre Implementierung sollte eine Klasse namens `LRUCache` mit folgendem Interface sein: ``` cache = LRUCache(capacity) cache.put(key, value) result = cache.get(key) ``` Demonstrieren Sie Ihre Implementierung mit der folgenden Testsequenz: ``` 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 ``` Anforderungen: - Verwenden Sie NICHT `functools.lru_cache` oder `collections.OrderedDict`. Implementieren Sie die zugrunde liegende Datenstruktur selbst. - Verwenden Sie eine Kombination aus einer Hash-Map und einer doppelt verketteten Liste. - Fügen Sie klare Kommentare hinzu, die Ihren Ansatz erläutern. - Behandeln Sie Randfälle wie eine Kapazität von 0 oder 1. - Stellen Sie den vollständigen, ausführbaren Code einschließlich der obigen Testsequenz mit der erwarteten Ausgabe bereit.

Bewertungsrichtlinie

Eine hochwertige Antwort sollte: (1) Eine vollständige, ausführbare Python-Implementierung eines LRU-Caches unter Verwendung einer Hash-Map und einer doppelt verketteten Liste liefern — ohne auf OrderedDict oder functools.lru_cache zurückzugreifen. (2) Sowohl get- als auch put-Operationen sollten durchschnittlich O(1) Zeit haben. (3) Der Code sollte für die bereitgestellte Testsequenz die erwartete Ausgabe korrekt erzeugen (10, -1, -1, 30, 40). (4) Der Code sollte Randfälle wie Kapazität 0 oder 1 korrekt behandeln....

Mehr anzeigen

Eine hochwertige Antwort sollte: (1) Eine vollständige, ausführbare Python-Implementierung eines LRU-Caches unter Verwendung einer Hash-Map und einer doppelt verketteten Liste liefern — ohne auf OrderedDict oder functools.lru_cache zurückzugreifen. (2) Sowohl get- als auch put-Operationen sollten durchschnittlich O(1) Zeit haben. (3) Der Code sollte für die bereitgestellte Testsequenz die erwartete Ausgabe korrekt erzeugen (10, -1, -1, 30, 40). (4) Der Code sollte Randfälle wie Kapazität 0 oder 1 korrekt behandeln. (5) Die Implementierung sollte aussagekräftige Kommentare enthalten, die den Ansatz und wichtige Designentscheidungen erklären. (6) Der Code sollte sauber, gut strukturiert und nach vernünftigen Python-Konventionen geschrieben sein. Abzüge bei der Bewertung gibt es bei: Verwendung verbotener Built-ins, falscher Ausgabe, fehlender Behandlung von Randfällen, fehlenden Kommentaren oder O(n)-Operationen dort, wo O(1) erforderlich ist.

Antworten

Zielsprache: de Antwort: # LRU-Cache-Implementierung unter Verwendung einer Hashmap + doppelt verketteten Liste # - Hashmap (dict) bietet O(1)-Zugriff von Schlüssel -> Knoten # - Die doppelt verkettete Liste hält die Nutzungsreihenfolge: am häufigsten verwendet direkt nach head, am wenigsten verwendet vor tail # - Wenn auf einen Schlüssel zugegriffen oder er aktualisiert wird, verschieben wir dessen Knoten an den head # - Wenn die Kapazität überschritten wird, entfernen wir den tail-Knoten (LRU) und löschen seinen Schlüssel aus der Map class _Node: """Knoten der doppelt verketteten Liste zur Speicherung von...

Vollstandige Antwort anzeigen

Zielsprache: de Antwort: # LRU-Cache-Implementierung unter Verwendung einer Hashmap + doppelt verketteten Liste # - Hashmap (dict) bietet O(1)-Zugriff von Schlüssel -> Knoten # - Die doppelt verkettete Liste hält die Nutzungsreihenfolge: am häufigsten verwendet direkt nach head, am wenigsten verwendet vor tail # - Wenn auf einen Schlüssel zugegriffen oder er aktualisiert wird, verschieben wir dessen Knoten an den head # - Wenn die Kapazität überschritten wird, entfernen wir den tail-Knoten (LRU) und löschen seinen Schlüssel aus der Map class _Node: """Knoten der doppelt verketteten Liste zur Speicherung von Schlüssel und Wert.""" 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): """Initialisiert LRUCache mit gegebener Kapazität. Behandelt capacity <= 0, indem der Cache effektiv unbrauchbar gemacht wird (get gibt -1 zurück, put macht nichts). """ self.capacity = max(0, int(capacity)) self.cache = {} # key -> _Node # Sentinel-Knoten für head und tail, um Randfälle zu vermeiden self.head = _Node() # Am häufigsten verwendete kommen direkt nach head self.tail = _Node() # Am wenigsten häufig verwendete ist direkt vor tail self.head.next = self.tail self.tail.prev = self.head self.size = 0 # Interner Helfer: Knoten direkt nach head einfügen (als kürzlich verwendet markieren) def _add_node(self, node: _Node) -> None: node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node # Interner Helfer: einen vorhandenen Knoten aus der verketteten Liste entfernen def _remove_node(self, node: _Node) -> None: prev = node.prev nxt = node.next if prev: prev.next = nxt if nxt: nxt.prev = prev node.prev = node.next = None # Interner Helfer: einen vorhandenen Knoten an den head verschieben (am häufigsten verwendet) def _move_to_head(self, node: _Node) -> None: self._remove_node(node) self._add_node(node) # Interner Helfer: den am wenigsten kürzlich verwendeten Knoten entfernen (direkt vor tail) def _pop_tail(self) -> _Node: node = self.tail.prev if node is self.head: return None self._remove_node(node) return node def get(self, key: int) -> int: """Gibt den mit dem Schlüssel verknüpften Wert zurück, falls vorhanden; andernfalls -1. Der Zugriff markiert den Schlüssel als kürzlich verwendet. Durchschnittliche Zeit O(1). """ if self.capacity == 0: return -1 node = self.cache.get(key) if not node: return -1 # Verschiebe den aufgerufenen Knoten an den head (kürzlich verwendet) self._move_to_head(node) return node.value def put(self, key: int, value: int) -> None: """Fügt einen Schlüssel mit Wert ein oder aktualisiert ihn. Entfernt LRU, wenn die Kapazität überschritten wird. Durchschnittliche Zeit O(1). """ if self.capacity == 0: return node = self.cache.get(key) if node: # Aktualisieren und als kürzlich verwendet markieren node.value = value self._move_to_head(node) else: # Neuen Knoten einfügen new_node = _Node(key, value) self.cache[key] = new_node self._add_node(new_node) self.size += 1 if self.size > self.capacity: # Am wenigsten kürzlich verwendeten Knoten entfernen tail_node = self._pop_tail() if tail_node: del self.cache[tail_node.key] self.size -= 1 # Demonstration der Implementierung mit der gegebenen Testsequenz if __name__ == "__main__": cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # Erwartet: 10 cache.put(3, 30) # Entfernt Schlüssel 2 print(cache.get(2)) # Erwartet: -1 cache.put(4, 40) # Entfernt Schlüssel 1 print(cache.get(1)) # Erwartet: -1 print(cache.get(3)) # Erwartet: 30 print(cache.get(4)) # Erwartet: 40

Ergebnis

#1 | Sieger

Siegstimmen

3 / 3

Durchschnittsscore

95

Gesamtpunktzahl

93

Gesamtkommentar

Dies ist eine starke, gut strukturierte Implementierung eines LRU-Cache unter Verwendung einer Hashmap und einer doppelt verketteten Liste. Der Code liefert korrekt alle erwarteten Ausgaben (10, -1, -1, 30, 40), behandelt Randfälle wie capacity 0, verwendet Sentinel-Knoten zur Vereinfachung der Listenoperationen und enthält durchgehend klare Kommentare. Die Implementierung ist sauber, folgt den Python-Konventionen und erreicht durchschnittlich O(1)-Zeit für sowohl get als auch put. Kleine Anmerkung: die get-Methode verwendet 'if not node', was theoretisch problematisch sein könnte, falls node einen falsy-Wert hätte, aber da nodes Objekte sind, ist das in der Praxis unproblematisch. Der edge case capacity=1 wird implizit und korrekt behandelt. Insgesamt eine qualitativ hochwertige Antwort mit nur sehr kleinen stilistischen Anmerkungen.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
95

Die Implementierung liefert korrekt alle fünf erwarteten Ausgaben (10, -1, -1, 30, 40). Die Operationen auf der doppelt verketteten Liste sind korrekt, Sentinel-Knoten verhindern Randfallfehler, und die Eviktionslogik ist stimmig. Sowohl get als auch put haben durchschnittlich O(1)-Laufzeit. Der Randfall capacity=0 wird behandelt. Die 'if not node'-Prüfung in get ist technisch in Ordnung, da nodes Objekte sind, aber 'if node is None' wäre expliziter.

Vollstandigkeit

Gewichtung 20%
95

Alle erforderlichen Komponenten sind vorhanden: die _Node-Klasse, die LRUCache-Klasse mit get und put, interne Hilfsfunktionen zur Listenmanipulation, Sentinel-Knoten, Randfallbehandlung für capacity 0 und 1, die vollständige Testsequenz mit erwarteten Ausgabe-Kommentaren und ein main-Guard. Nichts Bedeutendes fehlt.

Codequalitat

Gewichtung 20%
90

Der Code ist sauber, gut organisiert und folgt den Python-Konventionen. Kommentare erklären den Gesamtansatz und jede Methode. Sentinel-Knoten sind eine gute Designwahl. Hilfsmethoden sind treffend benannt und haben jeweils eine einzige Aufgabe. Type-Hinweise werden verwendet. Kleiner Punkt: 'if not node' ist etwas weniger explizit als 'if node is None', und die Nullprüfungen im _remove_node für prev/nxt sind angesichts vorhandener Sentinel-Knoten unnötig, aber das sind sehr kleine Probleme.

Praktischer Nutzen

Gewichtung 15%
90

Die Implementierung ist direkt in realen Szenarien einsetzbar. Sie behandelt capacity 0 korrekt, bietet eine saubere Schnittstelle, und das Design mit Sentinel-Knoten macht sie robust. Der Code ist selbstständig und ausführbar. Er lässt sich leicht erweitern (z. B. Thread-Sicherheit, TTL). Die Demonstration zeigt deutlich das erwartete Verhalten.

Befolgung der Anweisungen

Gewichtung 10%
95

Alle Anweisungen werden befolgt: Es wird kein OrderedDict oder functools.lru_cache verwendet, Hashmap + doppelt verkettete Liste sind implementiert, die Klasse heißt LRUCache und hat die korrekte Schnittstelle, die Testsequenz ist mit erwarteten Ausgabe-Kommentaren enthalten, Randfälle werden behandelt, und Kommentare erläutern den Ansatz. Der Code ist vollständig und ausführbar.

Bewertungsmodelle OpenAI GPT-5.2

Gesamtpunktzahl

93

Gesamtkommentar

Bietet eine korrekte, ausführbare LRUCache-Implementierung, die ein dict plus eine doppelt verkettete Liste mit Sentinelknoten nutzt, erreicht O(1) durchschnittlich für get/put und liefert die erwarteten Ausgaben für den gegebenen Test. Enthält klare Kommentare und behandelt die Kapazität 0 elegant. Kleinere Probleme: _pop_tail ist mit Rückgabetyp _Node annotiert, kann aber None zurückgeben; einige defensive Überprüfungen in _remove_node sind angesichts der Verwendung von Sentineln überflüssig, aber nicht schädlich.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
95

Korrektes LRU-Verhalten: get bewegt Knoten in die MRU-Position, put aktualisiert/bewegt vorhandene Schlüssel und entfernt beim Überlauf das LRU-Element. Die gegebene Testsequenz gibt wie erwartet 10, -1, -1, 30, 40 aus. Kapazität 0 wird so behandelt, dass get = -1 ergibt und put keine Wirkung hat.

Vollstandigkeit

Gewichtung 20%
95

Enthält die vollständige Klassenimplementierung, interne Hilfsfunktionen und die exakt angeforderte Testsequenz. Die Kommentare erklären den Ansatz und die wichtigsten Operationen. Randfälle für Kapazität 0 werden explizit behandelt; Kapazität 1 funktioniert auf natürliche Weise durch die Eviktionslogik.

Codequalitat

Gewichtung 20%
85

Der Code ist sauber, lesbar und gut strukturiert, mit Sentinelknoten zur Vereinfachung der Listenoperationen. Kleine Qualitätskritikpunkte: Die Rückgabeannotation von _pop_tail stimmt nicht mit der möglichen Rückgabe von None überein, und einige Prüfungen in _remove_node sind durch das Sentinel-Invariant redundant.

Praktischer Nutzen

Gewichtung 15%
90

Eine praktische Referenzimplementierung: O(1)-Operationen, vermeidet verbotene Bibliotheken und ist leicht anpassbar. Der Demo-Code ist sofort ausführbar.

Befolgung der Anweisungen

Gewichtung 10%
100

Folgt allen Anweisungen: kein OrderedDict/functools, verwendet hashmap + doppelt verkettete Liste, enthält erläuternde Kommentare, behandelt Randfälle (insbesondere Kapazität 0) und liefert vollständigen, ausführbaren Code mit dem angegebenen Test.

Bewertungsmodelle Google Gemini 2.5 Pro

Gesamtpunktzahl

98

Gesamtkommentar

Dies ist eine hervorragende Antwort, die eine mustergültige Implementierung eines LRU-Cache liefert. Der Code ist korrekt, effizient und außerordentlich gut strukturiert; er verwendet die ausgefeilte Technik von Sentinel-Knoten, um die Logik der doppeltverketteten Liste zu vereinfachen. Er hält alle Vorgaben perfekt ein, enthält ausgezeichnete Kommentare, behandelt Randfälle elegant und liefert den geforderten ausführbaren Testfall. Sie dient als Modellantwort für diese Aufgabe.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
100

Die Implementierung ist vollkommen korrekt. Die Logik für sowohl `get` als auch `put` Operationen erhält korrekt die Least-Recently-Used-Reihenfolge und hält die Kapazitätsbeschränkung ein. Die bereitgestellte Testsequenz erzeugt exakt die erwartete Ausgabe. Die durchschnittliche O(1)-Zeitkomplexität für beide Operationen wird erfolgreich durch die Kombination aus Hashmap und doppelt verketteter Liste erreicht. Randfälle, wie eine Kapazität von 0, werden korrekt behandelt.

Vollstandigkeit

Gewichtung 20%
100

Die Einreichung ist vollständig. Sie enthält die Klasse `LRUCache`, die private Hilfsklasse `_Node` und den vollständigen, ausführbaren Demonstrationsblock (`if __name__ == "__main__":`) wie gefordert. Alle erforderlichen Komponenten der Aufgabenstellung wurden geliefert.

Codequalitat

Gewichtung 20%
95

Die Codequalität ist außergewöhnlich. Der Einsatz privater Hilfsmethoden zur Knotemanipulation (`_add_node`, `_remove_node` usw.) macht die Hauptmethoden `get` und `put` sauber und gut lesbar. Die Implementierung von Sentinel-Head- und Tail-Knoten ist ein ausgefeiltes und effizientes Muster, das die Notwendigkeit von Sonderfallprüfungen innerhalb der Listenmanipulationslogik eliminiert. Die Kommentare sind klar, prägnant und erklären sowohl das Was als auch das Warum der Implementierung. Es ist eine Lösung von professionellem Niveau.

Praktischer Nutzen

Gewichtung 15%
90

Die Antwort hat hohen praktischen und didaktischen Wert. Es ist eine klassische, von Grund auf neu implementierte Umsetzung eines fundamentalen Caching-Algorithmus, der in der Systemarchitektur weit verbreitet ist. Dieser Code dient als ausgezeichnete Referenz für alle, die einen LRU-Cache verstehen oder implementieren müssen, und ist eine kanonische Lösung für ein sehr häufiges Interviewproblem in der Softwareentwicklung.

Befolgung der Anweisungen

Gewichtung 10%
100

Die Antwort folgt akribisch jeder Anweisung in der Aufgabenstellung. Sie implementiert korrekt die Klasse `LRUCache` unter Verwendung einer Hashmap und einer eigenen doppelt verketteten Liste, wobei ausdrücklich die verbotenen `collections.OrderedDict` und `functools.lru_cache` vermieden werden. Der Code ist ausführbar, kommentiert und enthält den angegebenen Testfall.

class Node: """Doppelt verketteter Listenknoten zum Speichern von Schlüssel-Wert-Paaren und zur Aufrechterhaltung der Reihenfolge.""" def __init__(self, key, value): self.key = key self.value = value self.prev = None self.next = None class LRUCache: """Implementiert einen Least Recently Used (LRU)-Cache unter Verwendung einer Hash-Map und einer doppelt verketteten Liste.""" def __init__(self, capacity: int): """Initialisiert den LRUCache mit einer angegebenen Kapazität.""" self.capacity = capacity self.cache = {} # Hash-Map: key -> Node...

Vollstandige Antwort anzeigen

class Node: """Doppelt verketteter Listenknoten zum Speichern von Schlüssel-Wert-Paaren und zur Aufrechterhaltung der Reihenfolge.""" def __init__(self, key, value): self.key = key self.value = value self.prev = None self.next = None class LRUCache: """Implementiert einen Least Recently Used (LRU)-Cache unter Verwendung einer Hash-Map und einer doppelt verketteten Liste.""" def __init__(self, capacity: int): """Initialisiert den LRUCache mit einer angegebenen Kapazität.""" self.capacity = capacity self.cache = {} # Hash-Map: key -> Node self.head = Node(0, 0) # Dummy-Head-Knoten self.tail = Node(0, 0) # Dummy-Tail-Knoten self.head.next = self.tail self.tail.prev = self.head def _remove_node(self, node): """Entfernt einen Knoten aus der doppelt verketteten Liste.""" prev_node = node.prev next_node = node.next prev_node.next = next_node next_node.prev = prev_node def _add_to_head(self, node): """Fügt einen Knoten am Kopf der doppelt verketteten Liste hinzu (am kürzlichsten verwendet).""" node.prev = self.head node.next = self.head.next self.head.next.prev = node self.head.next = node def get(self, key: int) -> int: """Ruft den Wert für einen Schlüssel ab und markiert ihn als kürzlich verwendet. Gibt -1 zurück, wenn der Schlüssel nicht gefunden wurde.""" if key in self.cache: node = self.cache[key] # Verschiebe den zugegriffenen Knoten an den Kopf (am kürzlichsten verwendet) self._remove_node(node) self._add_to_head(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. Entfernt das LRU-Element, wenn die Kapazität erreicht ist.""" if self.capacity == 0: return if key in self.cache: # Aktualisiere vorhandenen Schlüssel node = self.cache[key] node.value = value # An den Kopf verschieben, da es kürzlich verwendet wurde self._remove_node(node) self._add_to_head(node) else: # Neuen Schlüssel einfügen if len(self.cache) >= self.capacity: # Entferne das am wenigsten kürzlich verwendete Element (Knoten vor dem Tail) lru_node = self.tail.prev self._remove_node(lru_node) del self.cache[lru_node.key] new_node = Node(key, value) self.cache[key] = new_node self._add_to_head(new_node) # Demonstriere die Implementierung mit der Testfolge: cache = LRUCache(2) print("Einfügen (1, 10)") cache.put(1, 10) print("Einfügen (2, 20)") cache.put(2, 20) print("Hole Schlüssel 1:") print(cache.get(1)) # Erwartet: 10 print("Einfügen (3, 30)") cache.put(3, 30) # Entfernt Schlüssel 2 print("Hole Schlüssel 2:") print(cache.get(2)) # Erwartet: -1 print("Einfügen (4, 40)") cache.put(4, 40) # Entfernt Schlüssel 1 print("Hole Schlüssel 1:") print(cache.get(1)) # Erwartet: -1 print("Hole Schlüssel 3:") print(cache.get(3)) # Erwartet: 30 print("Hole Schlüssel 4:") print(cache.get(4)) # Erwartet: 40

Ergebnis

#2

Siegstimmen

0 / 3

Durchschnittsscore

91

Gesamtpunktzahl

92

Gesamtkommentar

Die Implementierung ist insgesamt ausgezeichnet. Sie verwendet korrekt eine Hash-Map kombiniert mit einer doppelt verketteten Liste mit Sentinelknoten für Kopf und Schwanz, wodurch sowohl get als auch put O(1) erreichen. Die Testsequenz liefert die korrekten erwarteten Ausgaben (10, -1, -1, 30, 40). Randfälle wie Kapazität 0 werden behandelt. Der Code ist sauber, gut kommentiert und folgt guten Python-Konventionen. Die einzigen kleinen Schwächen sind, dass Kapazität 1 nicht explizit demonstriert wird (obwohl sie per Konstruktion korrekt funktioniert), und die Kommentare, obwohl vorhanden und hilfreich, könnten etwas detaillierter die Gesamtentwurfsüberlegung erläutern. Insgesamt ist dies eine hochwertige, vollständige und korrekte Implementierung.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
95

Alle Operationen sind O(1). Die Testsequenz erzeugt exakt die erwartete Ausgabe: 10, -1, -1, 30, 40. Die LRU-Eviktionslogik ist korrekt — nach get(1) wird Schlüssel 1 zum zuletzt verwendeten, put(3,30) verdrängt korrekt Schlüssel 2 und put(4,40) verdrängt korrekt Schlüssel 1. Der Randfall Kapazität 0 wird behandelt. Es werden keine verbotenen Built-ins verwendet.

Vollstandigkeit

Gewichtung 20%
90

Die Implementierung enthält die Klasse Node, die Klasse LRUCache mit allen erforderlichen Methoden, Helfermethoden zur Listenmanipulation, die Behandlung von Kapazität 0 sowie die vollständige Testsequenz mit beschreibenden print-Anweisungen. Der Randfall Kapazität 1 wird nicht explizit getestet, funktioniert aber per Konstruktion korrekt. Alle erforderlichen Komponenten sind vorhanden.

Codequalitat

Gewichtung 20%
90

Der Code ist sauber, gut strukturiert und verwendet aussagekräftige Bezeichner. Docstrings sind für alle Klassen und Methoden vorhanden. Helfermethoden _remove_node und _add_to_head sind sauber abstrahiert. Typannotationen sind enthalten. Die Sentinelknoten vereinfachen die Randbedingungen elegant. Kleiner Hinweis: Es könnte ein kurzer, hochrangiger Kommentar am Anfang hinzugefügt werden, der die Gesamtentwurfsstrategie erklärt.

Praktischer Nutzen

Gewichtung 15%
85

Die Implementierung ist produktionsreif und direkt einsatzfähig. Sie behandelt den Randfall Kapazität 0 elegant. Die Demonstrationsausgabe ist klar und mit beschreibenden Labels versehen. Sie könnte durch zusätzliche Demonstrationen von Randfällen (Kapazität 1, doppelte puts) erweitert werden, um den praktischen Lernwert zu erhöhen.

Befolgung der Anweisungen

Gewichtung 10%
95

Alle Vorgaben wurden befolgt: Es wird weder OrderedDict noch functools.lru_cache verwendet, Hash-Map + doppelt verkettete Liste wurden von Grund auf implementiert, erläuternde Kommentare zur Vorgehensweise sind vorhanden, Randfälle wurden berücksichtigt und vollständiger ausführbarer Code mit der exakt vorgegebenen Testsequenz ist enthalten. Die Ausgabe stimmt exakt mit den erwarteten Werten überein.

Bewertungsmodelle OpenAI GPT-5.2

Gesamtpunktzahl

85

Gesamtkommentar

Implementiert einen LRU-Cache korrekt mithilfe einer Hashmap sowie einer doppelt verketteten Liste mit Dummy-Head/-Tail und erreicht durchschnittlich O(1) für get/put sowie korrektes Entfernen (Eviction). Behandelt capacity=0 und typische Randfälle (einschließlich capacity=1) korrekt. Die Hauptschwäche ist die Demoausgabe: Sie enthält zusätzliche erklärende Ausgabenzeilen, sodass sie nicht exakt der geforderten erwarteten Ausgabeabfolge entspricht, obwohl die zurückgegebenen Werte korrekt sind. Ansonsten ist der Code sauber und gut kommentiert.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
92

Das grundlegende LRU-Verhalten ist korrekt: get verschiebt Knoten zur MRU-Position, put aktualisiert/verschiebt vorhandene Knoten, und die Eviction entfernt tail.prev (LRU). Die Hashmap verweist auf Knoten, und Listenoperationen sind O(1). capacity=0 wird durch frühzeitiges Zurückkehren gehandhabt. Keine offensichtlichen logischen Fehler.

Vollstandigkeit

Gewichtung 20%
86

Stellt vollständigen ausführbaren Code mit Node, LRUCache, Hilfsmethoden und einer Demonstrationssequenz bereit. Randfälle werden zumindest für capacity=0 berücksichtigt (und capacity=1 funktioniert implizit). Allerdings präsentiert die Demonstration die Ausgabe nicht in der exakt erwarteten minimalen Form aufgrund zusätzlicher Print-Anweisungen.

Codequalitat

Gewichtung 20%
84

Gut strukturiert mit klarer Aufgabentrennung und hilfreichen Docstrings/Kommentaren. Verwendet Dummy-Head/-Tail-Sentinels angemessen. Kleinere Verbesserungen könnten Typannotationen für Hilfsmethoden und die konsequente Kennzeichnung von Hilfsmethoden als intern umfassen, aber insgesamt solide.

Praktischer Nutzen

Gewichtung 15%
78

Praktische, standardmäßige LRU-Implementierung, die wiederverwendet werden kann. Die zusätzliche Verbosität der Demo kann für automatische Tests unangenehm sein, aber die Datenstruktur selbst ist nützlich und effizient.

Befolgung der Anweisungen

Gewichtung 10%
70

Hält die Hauptvorgaben ein: verwendet weder OrderedDict noch functools.lru_cache; nutzt Hashmap + doppelt verkettete Liste; enthält Kommentare; enthält Testsequenz. Hauptabweichung ist, dass die ausgegebene Ausgabe nicht exakt den erwarteten Ausgabelinien entspricht (es wird beschreibender Text hinzugefügt), was die Anforderung an die 'erwartete Ausgabe' verletzen kann.

Bewertungsmodelle Google Gemini 2.5 Pro

Gesamtpunktzahl

98

Gesamtkommentar

Die Antwort liefert eine ausgezeichnete und lehrbuchgerechte Implementierung eines LRU-Cache. Sie verwendet korrekt eine Hash-Map und eine doppelt verkettete Liste, um für sowohl `get`- als auch `put`-Operationen O(1)-Zeitkomplexität zu erreichen. Der Code ist sauber, gut kommentiert, verwendet bewährte Praktiken wie Hilfsmethoden und Dummy-Knoten und behandelt Randfälle korrekt. Alle Anweisungen aus dem Prompt wurden sorgfältig befolgt, was in einer vollständigen und korrekten Lösung resultiert.

Bewertungsdetails anzeigen

Korrektheit

Gewichtung 35%
100

Die Implementierung ist vollkommen korrekt. Sie verwendet erfolgreich eine Hash-Map für O(1)-Abfragen und eine doppelt verkettete Liste für O(1)-Reihenfolgeaktualisierungen. Die Logik für `get`, `put` und die Eviction (Entfernung älterer Einträge) ist solide. Der Code besteht die gegebene Testsequenz und behandelt den Randfall capacity=0 korrekt.

Vollstandigkeit

Gewichtung 20%
100

Die Einreichung ist vollständig und ausführbar. Sie enthält die erforderliche `LRUCache`-Klasse, eine Hilfsklasse `Node`, alle notwendigen Methoden und den vollständigen Demonstrationscode mit der Testsequenz, wie im Prompt gefordert.

Codequalitat

Gewichtung 20%
95

Die Codequalität ist außerordentlich hoch. Der Code ist gut strukturiert, verwendet separate Klassen und private Hilfsmethoden (`_remove_node`, `_add_to_head`) zur Klarheit. Die Verwendung von Dummy-Head- und Tail-Knoten ist eine klassische, robuste Technik, die die Logik zur Manipulation der Liste vereinfacht. Der Code enthält klare Docstrings, Typannotationen und folgt den Python-Konventionen.

Praktischer Nutzen

Gewichtung 15%
90

Die Lösung hat hohen praktischen Wert, da sie eine kanonische, effiziente Implementierung einer grundlegenden und weit verbreiteten Datenstruktur bietet. Dieser Code ist nicht nur eine theoretische Übung; er ist eine direkte und robuste Lösung, die in realen Anwendungen verwendet werden könnte.

Befolgung der Anweisungen

Gewichtung 10%
100

Die Antwort hält sich perfekt an alle Anweisungen. Sie implementiert den LRU-Cache von Grund auf unter Verwendung einer Hash-Map und einer doppelt verketteten Liste, ohne sich auf untersagte Bibliotheken wie `collections.OrderedDict` zu stützen. Sie enthält Kommentare, behandelt Randfälle und liefert den vollständigen ausführbaren Code mit der Testsequenz.

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

3 / 3

Durchschnittsscore

95
Diese Antwort ansehen

Siegstimmen

0 / 3

Durchschnittsscore

91
Diese Antwort ansehen
X f L