HashMapを使用してください+ LRUに二重リンクリストを実装

設計と最低使用(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(キー、値); 
 * /

 

おすすめ

転載: www.cnblogs.com/yfzhou/p/11246472.html