Orivel Orivel
メニューを開く

LRUキャッシュの実装

このプログラミングベンチマークに対する各AIの回答と比較結果を確認できます。

いいね・お気に入り機能を使うにはログインまたは新規登録が必要です。 新規登録

X f L

目次

お題概要

比較ジャンル

プログラミング

お題作成モデル

回答モデル

採点モデル

お題本文

PythonでLRU(Least Recently Used)キャッシュデータ構造を実装してください。実装は`LRUCache`という名前のクラスで、以下の操作をサポートする必要があります。 1. `__init__(self, capacity: int)` — キャッシュを正の整数`capacity`で初期化します。 2. `get(self, key: int) -> int` — キーが存在する場合は、それに関連付けられた値を返します。存在しない場合は-1を返します。キーへのアクセスは「使用」とみなされます。 3. `put(self, key: int, value: int) -> None` — キーと値のペアを挿入または更新します。挿入後、キャッシュが容量を超えた場...

さらに表示

PythonでLRU(Least Recently Used)キャッシュデータ構造を実装してください。実装は`LRUCache`という名前のクラスで、以下の操作をサポートする必要があります。 1. `__init__(self, capacity: int)` — キャッシュを正の整数`capacity`で初期化します。 2. `get(self, key: int) -> int` — キーが存在する場合は、それに関連付けられた値を返します。存在しない場合は-1を返します。キーへのアクセスは「使用」とみなされます。 3. `put(self, key: int, value: int) -> None` — キーと値のペアを挿入または更新します。挿入後、キャッシュが容量を超えた場合は、最も最近使用されていないキーを削除します。 `get`と`put`の両方は、平均O(1)の時間計算量で実行される必要があります。 完全なクラス実装を提供してください。次に、次の操作シーケンスの出力によってその正しさを実証してください。 ``` cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # 期待値: 10 cache.put(3, 30) # キー2を削除 print(cache.get(2)) # 期待値: -1 cache.put(4, 40) # キー1を削除 print(cache.get(1)) # 期待値: -1 print(cache.get(3)) # 期待値: 30 print(cache.get(4)) # 期待値: 40 ``` 実装によって両方の操作でO(1)の時間計算量がどのように達成されるか簡単に説明してください。

採点方針

良い回答は以下を提供する必要があります。 (1) 正しい `__init__`、`get`、`put` メソッドを備えた、完全で実行可能な Python クラス `LRUCache`。 (2) 両方の `get` と `put` で O(1) 平均時間を達成するために適切なデータ構造の組み合わせ(例:ハッシュマップと双方向連結リスト、またはPythonの`OrderedDict`)を使用する。 (3) 容量を超えた場合に最も最近使用されていないアイテムを削除する処理を正しく行う。 (4) デモンストレーションシーケンスに対して正しい出力を生成する:10、-1、-1、30、40。 (5) 選択されたデータ構造がO(1)時間計算量をもたらす理由についての明確で正確な説明を含める。 品質の低下につながるもの:不正な出力、エッジケースの処理漏れ(例:既存のキーの更新)、O(1)を達成しないデータ構造の使用(例:リストのスキャン)、または不完全/実行不可能なコード。

回答

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 は正の整数でなければなりません") self.capacity = capacity self.map = {} # key -> _Node # 番兵付き双方向連結リスト: # head <-> ... <-> tail # 最も最近使用されたものは head の直後。 # 最も長く使用されていないものは tail の直前。...

全文を表示

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 は正の整数でなければなりません") self.capacity = capacity self.map = {} # key -> _Node # 番兵付き双方向連結リスト: # head <-> ... <-> tail # 最も最近使用されたものは head の直後。 # 最も長く使用されていないものは 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: # head の直後に挿入する(最も最近使用されたものとしてマークする) 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: # 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() # 正しさのデモンストレーション cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(cache.get(1)) # 期待される出力: 10 cache.put(3, 30) # キー 2 を削除する print(cache.get(2)) # 期待される出力: -1 cache.put(4, 40) # キー 1 を削除する print(cache.get(1)) # 期待される出力: -1 print(cache.get(3)) # 期待される出力: 30 print(cache.get(4)) # 期待される出力: 40 # 出力: # 10 # -1 # -1 # 30 # 40 # O(1) の簡単な説明: # - 辞書(ハッシュマップ)がキーをノードに対応付けることで、get/put の平均ルックアップは O(1) になる。 # - 双方向連結リストが使用順序を維持する。ノードを先頭へ移動すること、 # 新しいノードを挿入すること、LRU ノードを削除することはすべて O(1) のポインタ更新である。 # これらを組み合わせることで、get と put の両方で平均 O(1) 時間が得られる。

判定

1位 | 勝者

勝利票

2 / 3

平均スコア

98

総合点

98

総評

LRUキャッシュの優れた実装であり、すべての要件を完全に満たしています。このソリューションは、ハッシュマップとセンチネルノードを備えた双方向連結リストのよく設計された組み合わせを使用しており、get と put の両方の操作で O(1) の時間計算量を達成しています。コードはクリーンで構造化されており、既存のキーの更新や適切な追い出しを含むすべてのエッジケースを正しく処理しています。デモンストレーションは、期待される正確な出力(10、-1、-1、30、40)を生成し、O(1) の複雑さの説明は正確かつ明確です。Nodeクラスでの__slots__の使用は、メモリ効率への配慮を示しています。軽微な観察点:容量が正でない場合のValueErrorは、防御的なタッチとしては良いですが、明示的に要求されたものではありませんでした。ハッシュマップの検索が平均 O(1) である理由について、説明がもう少し詳細であってもよかったかもしれません。全体として、これは本番環境品質の実装です。

採点詳細を表示

正確さ

重み 35%
98

実装は正しく、期待される正確な出力シーケンス(10、-1、-1、30、40)を生成します。すべてのコア操作は正しく機能します。get は正しい値を返し、アイテムを最近使用されたとマークし、put は新しいアイテムを正しく挿入し、既存のアイテムを更新し、eviction は容量を超えたときに最も最近使用されていないアイテムを正しく削除します。センチネルを備えた双方向連結リストは、更新順序を正しく維持します。既存のキーの更新などのエッジ ケースは正しく処理されます。唯一の軽微な減点は、正でない容量に対する ValueError が、良い習慣ではありますが、タスクによって明示的に要求されたものではなかったことです。

完全性

重み 20%
100

回答は完全に包括的です。必要なすべてのメソッド (__init__, get, put) を備えた LRUCache クラス全体が含まれており、指定された正確なテスト シーケンスを含む完全な動作デモンストレーションが含まれており、すべての期待される出力を生成し、O(1) の時間計算量の明確な説明で締めくくられています。実装には、ソリューションに必要でよく整理されたヘルパー メソッド (_remove, _add_to_front, _move_to_front, _evict_lru) が含まれています。欠けているものや不完全なものはありません。

コード品質

重み 20%
95

コードは優れた構造と可読性を備えた高品質です。__slots__ を備えたネストされた _Node クラスの使用は、メモリ効率への意識を示しています。メソッド名は説明的であり、Python の慣例に従っています。センチネル ノードを備えた双方向連結リストの実装はエレガントであり、null チェックのエッジ ケースを回避します。コメントは、データ構造のレイアウトと各メソッドの目的を明確に説明しています。コードは、関心の論理的な分離により、うまく整理されています。軽微な点:最後に説明コメントがハッシュマップの平均ケースの複雑さについてもう少し詳細であってもよかったかもしれませんが、これは非常に軽微な点です。

実用性

重み 15%
95

この実装は、参照ソリューションとして高い実用価値があります。適切なデータ構造(ハッシュマップ + 双方向連結リスト)、エッジ ケースを排除するための適切なセンチネル ノードの使用、ヘルパー メソッドのクリーンな分離など、LRU キャッシュを実装するためのベスト プラクティスを示しています。コードは本番環境に対応しており、実際のアプリケーションで直接使用できます。防御的な ValueError チェックは、堅牢性を高めます。この実装は、特定の時間計算量要件を達成するためにデータ構造を組み合わせる方法を理解するための優れた教育的例として役立ちます。

指示遵守

重み 10%
100

回答はすべての指示に正確に従っています。正確に 'LRUCache' という名前の完全なクラスと、正しいシグネチャを持つ 3 つの必要なメソッドを提供します。get と put の両方が、適切なデータ構造を使用して O(1) の平均時間計算量を達成します。デモンストレーションシーケンスは、正しい出力で正確に指定どおりに実行されます。O(1) の複雑さの説明が含まれており、正確です。ジャッジメントポリシーからのすべての要件が満たされています。正しい出力、適切なエッジ ケース処理(既存のキーの更新)、O(1) データ構造の使用、および完全な実行可能なコードです。

総合点

100

総評

提供されたLRUCache実装は、構造が非常に優れており、正確で、かつ非常に効率的です。ハッシュマップと、センチネルノードを備えたカスタム双方向連結リストを組み合わせて使用し、`get`と`put`操作の両方で要求されるO(1)の平均時間計算量を正しく達成しています。コードは細部にまで配慮されており、ノードクラスの`__slots__`の使用や、既存キーの更新、最も使用頻度の低い項目の追い出しなどの様々なキャッシュ操作の堅牢な処理が含まれています。デモンストレーション出力は完全に正しく、時間計算量の説明も明確かつ正確です。

採点詳細を表示

正確さ

重み 35%
100

実装は完全に正しいです。キーの取得、更新、挿入、および最も使用頻度の低い項目の追い出しを含む、すべてのLRUキャッシュロジックは期待どおりに機能します。提供されたデモンストレーションシーケンスは、正確に正しい出力を生成します。

完全性

重み 20%
100

回答は、必要なすべてのメソッド(`__init__`, `get`, `put`)を備えた完全な`LRUCache`クラス、その使用方法の明確なデモンストレーション、およびその時間計算量の簡潔な説明を提供しています。要求されたものに不足はありませんでした。

コード品質

重み 20%
100

コード品質は優れています。連結リスト操作のためのヘルパーメソッド、よりクリーンなリスト操作のためのセンチネルノードの使用、メモリ効率のための`_Node`クラスの`__slots__`の包含など、よく整理されています。変数名は記述的であり、全体的な構造は非常に読みやすく、保守しやすいです。

実用性

重み 15%
100

この実装は非常に実用的で、本番環境での使用に適しています。LRUキャッシュに必要なデータ構造に対する深い理解を示しており、堅牢で効率的なソリューションを提供しています。明示的なカスタム双方向連結リスト実装は、基盤となるメカニズムに対する完全な制御と洞察を提供するため、`collections.OrderedDict`が適さない場合や、より深い理解が必要なシナリオで価値があります。

指示遵守

重み 10%
100

すべての指示が正確に守られました。クラス名は`LRUCache`であり、メソッドは指定されたシグネチャに準拠し、O(1)の平均時間計算量が達成され説明されており、容量検証が存在し、デモンストレーションシーケンスとその出力は要件に正確に一致しています。

採点モデル OpenAI GPT-5 mini

総合点

97

総評

LRUキャッシュの実装は良好:動作は正しく、ハッシュマップと双方向連結リストを使用したO(1)操作は効率的であり、提供されたデモンストレーションは期待通りの出力を生成します。コードは明確で実行可能ですが、スタイルや注釈の改善点(例:型アノテーションの追加やdocstring)はありますが、正確性やパフォーマンスに影響を与えるものではありません。

採点詳細を表示

正確さ

重み 35%
100

実装は正確です:getとputは指定通りに動作し、更新はアイテムをMRUに移動させ、容量を超えた場合はevictionがLRUを削除し、デモンストレーションは期待されるシーケンス(10, -1, -1, 30, 40)を印刷します。既存キーの更新やゼロ/負の容量(ValueError)などのエッジケースも処理されています。

完全性

重み 20%
100

ソリューションには、__init__、get、putを備えた完全で実行可能なLRUCacheクラス、必要な操作シーケンスのデモンストレーション、およびO(1)複雑性に関する簡潔な説明が含まれています。プロンプトで要求されたすべての動作が存在します。

コード品質

重み 20%
90

コードはクリーンでよく構造化されています:内部Nodeクラスには__slots__、センチネルのhead/tailノード、リスト操作のための明確なヘルパーメソッドがあります。型アノテーション(例:self.map用)やパブリックメソッドのdocstring/コメントの追加といった軽微なスタイル改善は可能ですが、これらは正確性には影響しません。

実用性

重み 15%
90

実装は効率的で実用的です:O(1)の平均操作、低オーバーヘッドのノード設計、明確なセマンティクスを備えています。本番環境での使用には、スレッドセーフの考慮事項や、より豊富な型指定/ドキュメントを追加することも考えられますが、コア機能は堅牢です。

指示遵守

重み 10%
100

すべての指示に従いました:LRUCacheという名前のクラスが提供され、必要なメソッドが正しいシグネチャで実装され、デモンストレーションが含まれ、O(1)複雑性に関する説明も正確です。

```python import collections class LRUCache: """ 最も最近使われていない(LRU)キャッシュの実装。 このキャッシュは、キーの検索を O(1) で行うために辞書を使用し、 使用順序を維持するために双方向連結リストを使用します。辞書はキーを 連結リスト内のノードに対応付けます。 """ # 双方向連結リスト内のノードを表す内部クラス 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): """ 正の整数の容量でキャッシュを初期化しま...

全文を表示

```python import collections class LRUCache: """ 最も最近使われていない(LRU)キャッシュの実装。 このキャッシュは、キーの検索を O(1) で行うために辞書を使用し、 使用順序を維持するために双方向連結リストを使用します。辞書はキーを 連結リスト内のノードに対応付けます。 """ # 双方向連結リスト内のノードを表す内部クラス 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): """ 正の整数の容量でキャッシュを初期化します。 """ if capacity <= 0: raise ValueError("容量は正の整数でなければなりません。") self.capacity = capacity self.cache = {} # リスト操作を簡単にするための先頭と末尾の番兵ノード self.head = self._Node() self.tail = self._Node() self.head.next = self.tail self.tail.prev = self.head def _remove_node(self, node: _Node): """連結リストからノードを削除します。""" 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): """連結リストの先頭(最新)にノードを追加します。""" 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): """既存のノードをリストの先頭に移動します。""" self._remove_node(node) self._add_to_front(node) def get(self, key: int) -> int: """ キーが存在する場合はそのキーに対応する値を返し、そうでない場合は -1 を返します。 キーにアクセスすると、それは最も最近使用されたものとしてマークされます。 """ if key in self.cache: node = self.cache[key] # アクセスされたノードを先頭に移動して、最近使用されたものとしてマークする self._move_to_front(node) return node.value return -1 def put(self, key: int, value: int) -> None: """ キーと値のペアを挿入または更新します。 容量を超えた場合は、最も最近使われていないキーを追い出します。 """ if key in self.cache: # キーが存在する場合は、その値を更新して先頭に移動する node = self.cache[key] node.value = value self._move_to_front(node) else: # キーが新しい場合は、新しいノードを作成する new_node = self._Node(key, value) self.cache[key] = new_node self._add_to_front(new_node) # キャッシュが容量を超えた場合は、最も最近使われていない項目を追い出す if len(self.cache) > self.capacity: # LRU 項目は末尾の番兵の直前にあるもの lru_node = self.tail.prev self._remove_node(lru_node) del self.cache[lru_node.key] # --- デモンストレーション --- print("LRUCache の機能をデモンストレーションします:") cache = LRUCache(2) cache.put(1, 10) cache.put(2, 20) print(f"get(1): {cache.get(1)}") # 期待される結果: 10 cache.put(3, 30) # キー 2 を追い出す print(f"get(2): {cache.get(2)}") # 期待される結果: -1 cache.put(4, 40) # キー 1 を追い出す print(f"get(1): {cache.get(1)}") # 期待される結果: -1 print(f"get(3): {cache.get(3)}") # 期待される結果: 30 print(f"get(4): {cache.get(4)}") # 期待される結果: 40 # --- デモンストレーションの期待される出力 --- # LRUCache の機能をデモンストレーションします: # get(1): 10 # get(2): -1 # get(1): -1 # get(3): 30 # get(4): 40 # --- O(1) 時間計算量の説明 --- # `get` と `put` の両方で平均 O(1) の時間計算量が達成されるのは、2 つのデータ構造を組み合わせているためです: # 1. **ハッシュマップ(辞書):** Python の `dict` は、挿入、削除、検索に対して平均 O(1) の時間計算量を提供します。この実装では、辞書 `self.cache` がキーを格納し、それらを双方向連結リスト内の対応するノードに直接対応付けます。これにより、キャッシュ内の任意のノードをそのキーによって即座に見つけることができます。 # 2. **双方向連結リスト:** このデータ構造は使用順序を維持します。新しいノードを先頭(最も最近使用された位置)に追加することや、最後のノード(最も最近使われていないもの)を削除することは、いくつかのポインタを更新するだけでよいため O(1) の操作です。項目にアクセスまたは更新されたとき、その対応するノード(ハッシュマップによって O(1) で見つかる)は、隣接ノードを単純につなぎ替えることで O(1) でリストの先頭に移動できます。 # 両方の構造を一緒に使用することで、`get` および `put` 操作のすべての部分――キーの検索、値の更新、ノードの移動、LRU ノードの削除――を一定の平均時間で実行できます。 ```

判定

2位

勝利票

1 / 3

平均スコア

97

総合点

98

総評

LRUキャッシュの優れた実装であり、すべての要件を完全に満たしています。コードは、ハッシュマップとセンチネルノードを持つ双方向連結リストをうまく設計された組み合わせで使用しており、getとput操作の両方でO(1)の時間計算量を達成しています。実装は、既存キーの更新や最も使用頻度の低いアイテムの削除など、すべてのエッジケースを正しく処理しています。デモンストレーションは期待される正確な出力(10、-1、-1、30、40)を生成し、時間計算量の説明は明確かつ正確です。コードはクリーンで、よく文書化されており、本番環境で使用できる状態です。

採点詳細を表示

正確さ

重み 35%
98

実装は機能的に正しく、期待される正確な出力シーケンスを生成します。すべての操作(get、put、eviction)は指定どおりに機能します。エッジケースは適切に処理されています:既存キーの更新はそれらを先頭に移動させ、新しいキーは正しく追加され、LRUエビクションは正しいノードを削除します。唯一の軽微な観察は、容量が正でない場合のValueErrorが、良い実践ではありますが、タスク仕様で明示的に要求されていなかったことです。

完全性

重み 20%
100

回答は完全に網羅されています。必要なすべてのメソッド(__init__、get、put)を備えたLRUCacheクラス全体が提供され、完全な動作デモンストレーションと正確なテストシーケンスが含まれており、すべての期待される出力が生成され、O(1)の時間計算量に関する詳細な説明が提供されています。ヘルパーメソッド(_remove_node、_add_to_front、_move_to_front)はよく実装されており、ソリューションに不可欠です。

コード品質

重み 20%
95

コードはよく構造化されており、非常に読みやすいです。クラスとすべてのメソッドに対して明確なドキュメンテーション文字列が含まれており、意味のある変数名が使用され、境界条件を簡素化するためにセンチネルノードがエレガントに採用されています。内部の_Nodeクラスは適切に定義されています。コードはPythonの慣例に従っており、保守可能です。マイナーな点:未使用の`collections`のインポートは削除できますが、これは些細なことです。

実用性

重み 15%
98

この実装は即座に実用的であり、本番環境で使用できる状態です。センチネルノードを備えた双方向連結リストのアプローチは、LRUキャッシュの標準的で実績のあるパターンです。コードは実際のシナリオ(既存キーの更新、容量管理)を正しく処理します。説明は、この設計が機能する理由についての深い理解を示しており、学習や実装の参照として価値があります。

指示遵守

重み 10%
100

回答はすべての指示に正確に従っています。完全で実行可能なPythonクラスLRUCacheが、正しいメソッドシグネチャで提供されています。適切なデータ構造(ハッシュマップ+双方向連結リスト)を使用してO(1)の計算量を達成しています。エビクションを正しく処理し、期待される正確な出力シーケンス(10、-1、-1、30、40)を生成し、O(1)の時間計算量達成に関する明確で正確な説明が含まれています。

総合点

98

総評

提供されたLRUCache実装は優れています。O(1)ルックアップのための辞書と、O(1)順序管理のためのカスタム双方向連結リストを使用してLRUロジックを正しく実装しています。コードはよく構造化されており、優れたドキュメンテーション文字列が含まれ、容量検証や既存キーの更新などのエッジケースを堅牢に処理します。デモンストレーションは期待される出力と完全に一致し、O(1)時間計算量に関する説明は明確かつ正確です。唯一のマイナーな改善点は、未使用の「collections」インポートを削除することですが、これは全体的な高品質を損なうものではありません。

採点詳細を表示

正確さ

重み 35%
98

LRUCache実装は機能的に正しいです。`get`および`put`操作を正確に処理します。これには、既存キーの更新、容量を超えた場合のLRUアイテムの削除、存在しないキーに対する-1の返却が含まれます。辞書とカスタム双方向連結リストの使用により、両方の操作でO(1)の平均時間計算量が正しく達成されます。デモンストレーションの出力は、期待される出力と完全に一致します。

完全性

重み 20%
100

回答は完全に包括的です。`__init__`、`get`、`put`メソッドを含む`LRUCache`クラス全体の実装が提供されています。指定された操作シーケンスを使用した機能の包括的なデモンストレーションと、O(1)時間計算量に関する明確で正確な説明が含まれています。

コード品質

重み 20%
95

コード品質は非常に高いです。`LRUCache`クラスは、内部の`_Node`クラスと連結リスト操作のためのヘルパーメソッド(`_remove_node`、`_add_to_front`、`_move_to_front`)でよく構造化されており、可読性と保守性が向上しています。クラスと主要なメソッドにはドキュメンテーション文字列が存在します。双方向連結リストのセンチネルヘッドとテイルノードの使用は、リスト操作を簡素化し、堅牢性を向上させます。容量検証が含まれています。唯一非常にマイナーな点は、未使用のインポート(`collections`)です。

実用性

重み 15%
97

実装されたLRUキャッシュは非常に実用的で効率的です。ハッシュマップと双方向連結リストの標準的で最もパフォーマンスの高い組み合わせを使用しており、O(1)操作を保証します。設計は堅牢であり、パフォーマンスが重要な実際のキャッシュシナリオに適しています。さまざまな操作シナリオを正しく処理するため、信頼性があります。

指示遵守

重み 10%
100

プロンプトのすべての指示が綿密に守られました。クラス名は`LRUCache`であり、`__init__`、`get`、`put`メソッドは正しいシグネチャと動作を持っています。容量は正の整数として処理され、O(1)の複雑さが達成され説明されており、削除ロジックは正しく、デモンストレーションシーケンスとその出力は指定どおりです。

採点モデル OpenAI GPT-5 mini

総合点

96

総評

ハッシュマップと双方向連結リストを使用した、正しく構造化されたLRUCacheの実装です。クラスは平均O(1)時間でgetとputを実装し、期待どおりの結果を生成するデモンストレーションを含み、複雑さを明確に説明しています。軽微な問題点として、未使用のインポート(collections)と些細なスタイルの問題がありますが、これらは正しさやパフォーマンスに影響しません。

採点詳細を表示

正確さ

重み 35%
100

実装は機能的に正しく、getとputは指定どおりに動作し、evictionは最も使用頻度の低いアイテムを削除し、既存のキーの更新は機能し、デモンストレーションは期待どおりの出力(10、-1、-1、30、40)を生成します。容量 enforcement のようなエッジケースも処理されています。

完全性

重み 20%
95

__init__、get、put、ヘルパーメソッド、要求されたシーケンスのデモンストレーション、および複雑さの説明を含む、完全で実行可能なLRUCacheクラスを提供します。不要なインポートが含まれていることと、プロンプトの生出力行を正確に(ラベルが追加されている)示していないことによるわずかな減点のみですが、機能は完全です。

コード品質

重み 20%
90

コードはクリーンで読みやすく、ヘルパーメソッドとセンチネルノードを使用してリスト操作を簡素化しており、適切に文書化されています。軽微な問題点としては、未使用の 'collections' インポートと、内部クラスの型ヒントに関する些細なスタイルの選択がありますが、それ以外は構造と命名は良好です。

実用性

重み 15%
90

実装は実際の使用に対して実用的かつ効率的です。平均O(1)の操作、明確なメモリ管理、および簡単なAPIを備えています。正でない容量に対するValueErrorは妥当です。コア設計にパフォーマンス上の落とし穴はありません。

指示遵守

重み 10%
100

クラス名がLRUCacheであること、正しいメソッドシグネチャ、辞書+双方向連結リストで達成された平均O(1)の複雑さ、正しいeviction動作、デモンストレーションが含まれていること、および操作がO(1)である理由の簡潔な説明など、指示に正確に従っています。

比較結果サマリー

最終順位は、採点者ごとの順位集約(平均順位 + ボルダ方式の同点処理)で決定します。平均点は参考表示です。

採点者数: 3

勝利票

2 / 3

平均点

98
この回答を見る

勝利票

1 / 3

平均点

97
この回答を見る
X f L