設計と最低使用(LRU)キャッシュのためのデータ構造を実装しています。これは、次の操作をサポートする必要があります。getおよびput。
(キー)を取得-キーがキャッシュに存在する場合は、キーの値を(常に正となります)を取得し、そうでない場合は-1を返します。
(キー、値)を置く-設定またはキーが既に存在していない場合は、値を挿入します。キャッシュがその容量に達したとき、それは新しい項目を挿入する前に、最低使用項目を無効にする必要があります。
キャッシュは正の容量で初期化されます。
フォローアップ:
あなたはO(1)時間複雑に両方の操作を行うことができますか?
例:
LRUCacheキャッシュ= 新しい LRUCache(2 / * 容量* / ); cache.put( 1、1 )。 cache.put( 2、2 ); cache.get( 1)。// リターン1 cache.put(3,3)。// 追い出すキー2 cache.get(2); // 戻り-1(見つかりません) cache.put(4、4); // 追い出すキー1 cache.get(1); // 戻り-1(見つかりません) cache.get(3)。// 戻り3 cache.get(4)。// 戻り4
アイデア:
これは、直接使用することができLinkHashMap LRUを実装します。
LinkedHashMap実装原理ベースのHashMap +二重にリンクされたリストには、再びここに自分自身を実現します。
ソリューション:
インポートのjava.util.HashMapを、 クラスLRUCache { クラスノード{ int型キー; int型の値、 ノードPREV、 ノード次に; } / ** *新しいノードが追加されている二重連結リスト *がヘッダに追加される * / プライベート 空隙にaddNode(ノードノード) { node.prev = ヘッド; node.next = head.next; head.next.prev = ノード; head.next = ノード; } / ** *ノードを削除する * / プライベート ボイドがremoveNode(ノードノード){ node.prev.next = node.next; node.next.prev = node.prev; } / ** *削除テーブルテールノード * / プライベートノードpopTail(){ ノードノード = tail.prev。 がremoveNode(ノード); 戻りノード; } / ** *メートルに移動 * 1.古いノード削除 * 2は、ヘッダノードに挿入した * / プライベート ボイドmoveToHead(ノードnode){ がremoveNode(ノード) にaddNode(ノード); } プライベート int型の容量、 プライベート int型のサイズ。 民間のHashMap <整数、ノード> キャッシュ; プライベートノードヘッド。 プライベートノード尾。 公共 LRUCache(int型の容量){ この .capacity = 容量。 この .size = 0 ; キャッシュ = 新しい HashMapの<> (); ヘッド = 新しいノード(); テール = 新しいノード(); head.next = 尾。 tail.prev = ヘッド。 } / ** * GET()操作 *対応するキー値が存在しない場合、-1 *存在する場合、値が取得され、ヘッダノードへ移動 * / パブリック int型 GET(INT キー){ ノードノード = cache.get(キー); IF(ノード== NULL)リターン -1 ; moveToHead(ノード); 戻りnode.value; } / ** * PUT()操作 キーが存在しない場合*は、新しいノードがノード・キャッシュ・マップに追加され、配置ヘッダ,. 1つの+サイズ *サイズ>容量、テール・ノード・テーブルを削除し、キャッシュから削除する場合は、サイズ- 。1 キーが存在する場合*、ノードの値を更新し、ヘッダに移動 * / 公共 ボイド PUT(int型のキー、int型値){ ノードノード = cache.get(キー)。 もし(ノード== NULL ){ ノード = 新しいノード()。 node.key = キー。 node.value = 値。 cache.put(キー、ノード)。 addNode(ノード)。 サイズ ++ ; もし(サイズ> 容量){ ノードデル = popTail()。 cache.remove(del.key)。 サイズ - ; } } 他{ node.value = 値。 moveToHead(ノード)。 } } パブリック 静的 ボイドメイン(文字列[]引数)を{ LRUCache lruCache = 新しい LRUCache(2 )。 lruCache.put( 1、1 )。 lruCache.put( 2、2 ); lruCache.get( 1 )。 lruCache.put( 3、3 ); lruCache.get( 2 )。 lruCache.put( 4、4 ); lruCache.get( 1 )。 lruCache.get( 3 )。 lruCache.get( 4 )。 } } / ** *あなたのLRUCacheオブジェクトがインスタンス化され、などと呼ばれます: * LRUCache OBJ =新しいLRUCache(容量); * int型PARAM_1 = obj.get(キー); * obj.put(キー、値); * /