460 LFUキャッシュ

トピック住所:https://leetcode-cn.com/problems/lfu-cache/submissions/

コード住所:https://github.com/javartisan/edx-ds/blob/master/src/main/java/com/javartisan/leetcode/LFUCache460.java

 

クラスLFUCache { 

    プライベート 静的 クラスノード{
         公共の int型キー= -1 ;
        公共 int型の値= -1 ;
        公共ノードの次。
        公共ノードLNEXT。
        公共ノードlBefore。
        公共 int型のカウント= 1 ; 
    } 

    プライベート int型の容量;
    プライベート int型のサイズ。
    プライベート int型 = 15 tabSize 

    プライベートノードhashTab []; 

    プライベートノードヘッド。
    プライベートテイルノードと

    パブリック LFUCache(int型の容量){ 
        
        この .capacity = 容量;
         //はハッシュマップが実装参照、そうでない場合、+1でなければならない7、キー= 7意志アレイ境界場合。 
        HashTab = 新しい新しいノード[TabSize + 1 ]; 
        ヘッド = 新しい新しいノード();  = 新しい新しいノード(); 
        head.lNext = 尾; 
        tail.lBefore = ヘッド; 
    } 
    
    公共 int型の GET(INT キー){ 

        int型ハッシュ= ハッシュ(KEY)、
        ノードnode =hashTab [ハッシュ]。
        一方、(!ノード= NULL ){
             場合(node.key == キー){ 
                node.count = node.count + 1 
                ノードnodeNext = node.lNext。
                (node.lBefore、node.lNext)接続。
                更新(ノード、nodeNext)。
                返すnode.value; 
            } 
            ノード = node.next。
        } 
        戻り -1 
        
    } 
    
    公共 ボイド置く(int型のキー、int型の値){
         場合(容量== 0){
             返します
        } 
        ensureCapacity(キー)。

        int型のハッシュ= ハッシュ(キー); 
        ノードnode = hashTab [ハッシュ]。
        もし(ノード!= NULL ){
             場合(node.key == キー){ 
                   node.value = 値。
                   node.count = node.count + 1 
                   (node.lBefore、node.lNext)接続。
                   更新(ノード、尾)。

            } { 
                ノード最後 = ノード。
                ノード= node.next。
                一方(ノード!= NULL ){
                     場合(node.key == キー){ 
                        node.value = 値。
                        node.count = node.count + 1 
                        (node.lBefore、node.lNext)接続。
                           更新(ノード、尾)。
                        破ります; 
                    } 
                    最後 = ノード。
                    ノード = node.next。
                } 
                であれば(ノード== NULL ){ 
                    ノード= 新しいノード()。
                    node.key = キー。
                    node.value = 値。
                    last.next = ノード。
                    サイズ ++ ; 
                    更新(ノード、尾)。
                } 
            } 
        } { 
            ノード = 新しいノード()。
            node.key = キー。
            node.value = 値。
            サイズ ++ ; 
            hashTab [ハッシュ] =ノード。
            更新(ノード、尾)。
        } 
    } 
  


    公共 ボイド更新(ノードノード、ノード現ノード){ 

        前に、ノード = currentNode.lBefore。
        しばらく(!前= nullを!&&前= ヘッド){
             場合(before.count> node.count){
                 破ります
            }  = before.lBefore。
        } 
        (ノード、前、before.lNext)を挿入します。
    } 


    パブリック ブール containKey(INT キー){
         int型のハッシュ= ハッシュ(キー)。
        ノードnode = hashTab [ハッシュ]。
        一方、(!ノード= NULL ){
             場合(node.key == キー){
                 戻り 
            } 
            ノード = node.next。
        } 

        を返す 
    } 

    公共 ボイド ensureCapacity(INT キー){ 

        場合(サイズ<容量||(サイズ==容量&& containKey(キー))){
             返します
        } 
        サイズ - 
        ノードdelNode =tail.lBefore; 
        前ノード = delNode.lBefore。
        (前に、尾)接続します。
        int型のハッシュ= ハッシュ(delNode.key)。
        ノードnode = hashTab [ハッシュ]。
        もし(node.key == delNode.key){ 
            hashTab [ハッシュ] = node.next。
            返します
        } 
        ノード最後 = ノード。
        ノード = node.next。
        一方(ノード!= NULL ){
             場合(node.key == delNode.key){ 
                last.next =node.next; 
            } 
            最後 = ノードと、
            ノード = node.next; 
        } 
    } 


    公共 のintハッシュ(INT キー){
         // より均一に分布&使用して高効率-12 N電力計算
        戻り Math.absを(キー)&TabSize; 
    } 

    公共 ボイド接続(ノードの前に、ノードの後に){ 
        before.lNext = 後、
        after.lBefore = 前; 
    } 

    公共 ボイドINSERT(後に、前に、ノードのノードのノードを挿入){ 
            insert.lNext =後; 
            insert.lBefore = 前; 
            before.lNext = 挿入します。
            after.lBefore = 挿入します。
    } 


    パブリック 静的 ボイドメイン(文字列[]引数){ 
        LFUCacheキャッシュ = 新しい LFUCache(2 )。
        cache.put( 1,1 )。
        cache.put( 2,2 )。
        cache.put( 3,3 )。
        System.out.println(cache.get( 1 ))。
        System.out.println(cache.get( 2 ))。
        System.out.println(cache.get(3 ))。
        

    } 

} 

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

 

おすすめ

転載: www.cnblogs.com/leodaxin/p/11329927.html