ゴールデンプログラマのインタビュー - フェイス質問16.25 LRUキャッシュ

トピック:

デザインは、最低使用の項目を削除します「最低使用」キャッシュを構築し。初期化の最大容量を指定します(キーはあなたが挿入すると、特定の対応する値を取得することができます)、キーの値からキャッシュにマッピングする必要があります。キャッシュがいっぱいになると、それは、最低使用の項目を削除する必要があります。

これは、次の機能をサポートする必要があります。データの取得  get および書き込みデータを  put 。

データ収集  get(key) -キー(キー)がキャッシュに存在する場合、そのキーの値を取得する(常に正)、そうでない場合は-1。
データの書き込み  put(key, value) -キーが存在しない場合は、データ値が書き込まれます。キャッシュ容量の上限に達すると、それは新しいデータ値のための部屋を作るために新しいデータを書き込む前に、最低使用データ値を削除する必要があります。

例:

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)を得る; //戻り-1(見つかりません)
cache.get(3); //戻り3。
cache.get(4); //戻り4

分析:

LeetCode 146 LRU CacheLRUキャッシング機構(C ++ / Java)のこの説明を参照。

手順:

クラスLRUCache { 

    LRUCache(int型の容量){
         この .capacity = 容量。
        この .MAP = 新しい HashMapの<> ();
        この .dummyHead = 新しいノード(0,0 )。
        この .tail = 新しいノード(0,0 )。

        dummyHead.prev = nullを
        dummyHead.next = 尾。
        tail.prev = dummyHead。
        tail.next = nullを
    } 
    
    int型のget(int型のキー){
         場合(map.containsKey(キー)){ 
            ノードノード = map.get(キー)。
            int型の値= node.val。
            がremoveNode(ノード)。
            addToHead(ノード)。
            戻り値; 
        } 
        戻り -1 
    } 
    
    ボイド PUT(INTキー、INT 値){
         場合(map.containsKey(キー)){ 
            ノードノード = map.get(キー)。
            がremoveNode(ノード)。
            map.remove(キー); 
            サイズ - ;
        } 
        ノードノード = 新しいノード(キー、値)。
        map.put(キー、ノード)。
        もし(サイズ< 容量){ 
            addToHead(ノード)。
            サイズ ++ ; 
        } { 
            map.remove(tail.prev.key)。
            がremoveNode(tail.prev)。
            addToHead(ノード)。
        } 
    } 
    プライベート ボイドがremoveNode(ノードノード){ 
        node.prev.next = node.next。
        node.next.prev = node.prev。
    } 
    プライベート のボイドaddToHead(ノードノード){
        node.next = dummyHead.next。
        node.next.prev = ノード。
        dummyHead.next = ノード。
        node.prev = dummyHead。
    } 
    クラスノード{
         int型のキー。
        int型のval; 
        ノードの前; 
        次のノード; 
        パブリックノード(int型のキー、INT ヴァル){
             この .KEY = キー。
            この .val = valの; 
        } 
    } 
    プライベートのHashMap <整数、ノード> マップ。
    プライベート int型の容量;
    プライベートノードdummyHead。
    プライベートノード尾。
    プライベート int型のサイズ。
} 

/ ** 
 *あなたのLRUCacheオブジェクトがインスタンス化され、などと呼ばれます:
 * LRUCache OBJ =新しいLRUCache(容量); 
 * int型PARAM_1 = obj.get(キー); 
 * obj.put(キー、値); 
 * /
クラスLRUCache { 

    LRUCache(int型の容量){
         この .capacity = 容量。
        マップ = 新しいのLinkedHashMap <> (); 
    } 
    
    INT GET(int型のキー){
         場合(map.containsKey(キー)){
             int型値= map.get(キー)。
            map.remove(キー); 
            map.put(キー、値)。
            戻り値; 
        } 
        戻り -1 
    } 
    
    ボイド PUT(INTキー、int型の値){
        もし(map.containsKey(キー)){ 
            map.remove(キー)。
        } 
        map.put(キー、値)。
        もし(map.size()> 容量){ 
            map.remove(map.keySet()イテレータ()次の()); 
        } 
    } 
    プライベート int型の容量;
    民間のLinkedHashMap <整数、整数> マップ。
} 

/ ** 
 *あなたのLRUCacheオブジェクトがインスタンス化され、などと呼ばれます:
 * LRUCache OBJ =新しいLRUCache(容量); 
 * int型PARAM_1 = obj.get(キー); 
 * obj.put(キー、値); 
 * /

 

おすすめ

転載: www.cnblogs.com/silentteller/p/12531707.html