zoukankan      html  css  js  c++  java
  • 设计可以变更的缓存结构(LRU)

    设计一种缓存结构, 该结构在构造时确定大小, 假设大小为K, 并有两个功能:
    set(key,value): 将记录(key,value)插入该结构。
    get(key): 返回key对应的value值。

    1. set和get方法的时间复杂度为O(1)。
    2. 某个key的set或get操作一旦发生, 认为这个key的记录成了最经常使用的。
    3. 当缓存的大小超过K时, 移除最不经常使用的记录, 即set或get最久远的。

    假设缓存结构的实例是cache, 大小为3, 并依次发生如下行为:
    1. cache.set("A",1)。 最经常使用的记录为("A",1)。
    2. cache.set("B",2)。 最经常使用的记录为("B",2), ("A",1)变为最不经常的。
    3. cache.set("C",3)。 最经常使用的记录为("C",2), ("A",1)还是最不经常的。
    4. cache.get("A")。 最经常使用的记录为("A",1), ("B",2)变为最不经常的。
    5. cache.set("D",4)。 大小超过了3, 所以移除此时最不经常使用的记录("B",2),加入记录 ("D",4), 并且为最经常使用的记录, 然后("C",2)变为最不经常使用的记录



    上一题实现了LRU缓存算法, LFU也是一个著名的缓存算法
    自行了解之后实现LFU中的set 和 get
    要求: 两个方法的时间复杂度都为O(1)

    解:实现:

    哈希表(Map)和双向链表(LinkedList)

    map中存的是(key, value) = (数据,结点(数据和值))  当map中存放的是String,Integer.....时,存放的是,的是自己定义的类型Node......时,实际存放的是引用,即存地址

    双向链表:尾进头出

    当有结点加入的话,加入双向链表尾部, 加入map中,

    当进行get操作时,从map中找到那个结点,然后从链表中分离出这个结点,然后加到尾部

    进行set操作时,在map中进行修改,然后从链表中再分离出这个结点,然后加到尾部

    当数据超过指定大小之后,在双向链表的头部删除,然后找到map中的值,也删掉

  • 相关阅读:
    ionic localstorage
    angular 中文鏈接
    把jqmobi 變成jQuery 的插件 從此使用jQuery
    jqmobi 的一些設置
    ionic ngcordova map 地圖
    ionic pull to refresh 下拉更新頁面
    json 對象的序列化
    鍵盤彈出,頁面佈局被推上去了.....
    Cordova V3.0.0中config.xml配置文件的iOS Configuration
    android ios 只能輸入數字 不能輸入小數點的 函數 cordova
  • 原文地址:https://www.cnblogs.com/SkyeAngel/p/9170379.html
Copyright © 2011-2022 走看看