当前位置: 首页 > wzjs >正文

做水果的有什么网站好wordpress 无法自定义

做水果的有什么网站好,wordpress 无法自定义,wordpress小插件下载地址,南通网站seo服务文章目录 1 相关前置知识(OS)2 面试题 16.25. LRU 缓存2.1 题面2.2 示例2.3 解法1 (双端队列哈希表)思路 2.4 解法2思路 3 参考 1 相关前置知识(OS) 为什么需要页面置换算法:当进程运行时&…

文章目录

    • 1 相关前置知识(OS)
    • 2 面试题 16.25. LRU 缓存
      • 2.1 题面
      • 2.2 示例
      • 2.3 解法1 (双端队列+哈希表)
        • 思路
      • 2.4 解法2
        • 思路
    • 3 参考

1 相关前置知识(OS)

  • 为什么需要页面置换算法:当进程运行时,若其访问的页面不在内存需要将其调入,但内存已无空闲空间时,就需要从内存中调出一页,换出到外存,选择调出哪个页面的算法就称为页面置换算法。页面的换入,换出需要磁盘I/O开销较大,因此要设计一个好的页面置换算法追求更低的缺页率。
  • 常见的页面置换算法:OPT(最佳置换算法) FIFO(先进先出置换算法) LRU(最近最久未使用置换算法) CLOCK(时钟置换算法)
  • 什么是LRU算法:简单来讲就是将一些元素放在一个容量固定的容器中进行存取,由于容器的容量有限,该容器就要保证那些最近才被用到的元素始终在容器内,而将已经很久没有用的元素剔除,实现容器内元素的动态维护。这种算法是一种缓存维护策略,因为缓存空间有限,让缓存中存储的都是最近才被用到的元素可以实现系统缓存的高效运作。

2 面试题 16.25. LRU 缓存

2.1 题面

设计和构建一个“最近最少使用”缓存,该缓存会删除最近最少使用的项目。缓存应该从键映射到值(允许你插入和检索特定键对应的值),并在初始化时指定最大容量。当缓存被填满时,它应该删除最近最少使用的项目。
它应该支持以下操作:

  • 获取数据 get 和 写入数据 put
  • 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。
  • 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。
  • 注意:要求getput的时间复杂度为O(1)

2.2 示例

LRUCache cache = new 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

2.3 解法1 (双端队列+哈希表)

思路
  • 使用双端队列维护,队尾是最近使用的,队头是最久未使用的,哈希表则维护key-value,此外注意在get时若元素存在则要重新将该元素移动到队列尾部,put若元素已存在,则要更新value,并将元素调整到队尾。
class LRUCache {
private:int capacity;std::deque<int> dq; std::unordered_map<int, int> mp;  
public:LRUCache(int capacity) : capacity(capacity) {}int get(int key) { // 若元素存在则将该元素移到队尾if (mp.find(key) != mp.end()) {dq.erase(std::remove(dq.begin(), dq.end(), key), dq.end());dq.push_back(key);return mp[key];}return -1;}void put(int key, int value) {if (mp.find(key) != mp.end()) {// 如果 key 已存在,更新 value,并调整到队尾mp[key] = value;dq.erase(std::remove(dq.begin(), dq.end(), key), dq.end());dq.push_back(key);} else {if (dq.size() == capacity) {int lru_key = dq.front();mp.erase(lru_key);dq.pop_front();}mp[key] = value;dq.push_back(key);}}
};

2.4 解法2

解法1的效率十分低,而且没有满足时间复杂度O(1)的条件,效率只击败了5%,我们想想要如何实现O(1),什么数据结构支持O(1)维护两端元素呢,我们可以用双向链表来实现。

思路
  • 使用双向链表+哈希表维护,表头维护最近使用的元素,表尾维护最久未使用的元素。这里我们要使用双向链表实现在表头添加一个元素、删除某个节点这两个操作。

  • 对于 get 操作,首先判断 key是否存在:如果 key 不存在,则返回 -1;如果 key 存在,则 key 对应的节点是最近被使用的节点。通过哈希表定位到该节点在双向链表中的位置,并将其移动到双向链表的头部,最后返回该节点的值。

  • 对于 put 操作,首先判断 key 是否存在:如果 key 不存在,使用 keyvalue 创建一个新的节点,在双向链表的头部添加该节点,并将 key 和该节点添加进哈希表中。然后判断双向链表的节点数是否超出容量,如果超出容量,则删除双向链表的尾部节点,并删除哈希表中对应的项;如果 key 存在,则与 get 操作类似,先通过哈希表定位,再将对应的节点的值更新为 value,并将该节点移到双向链表的头部。

这里引用灵神的题解,大家可以理解的更清晰。

class Node {
public:int key, value;Node *prev, *next;// 构造函数Node() : key(0), value(0), prev(nullptr), next(nullptr) {}Node(int _key, int _value) : key(_key), value(_value), prev(nullptr), next(nullptr) {}
};class LRUCache {
private:std::unordered_map<int, Node*> cache;Node* dummy;    // 头节点 表头维护最近使用的 表尾维护最久未使用的int capacity;// 删除一个节点void remove(Node *p) {p->prev->next = p->next;p->next->prev = p->prev;}// 表头添加一个节点void push_front(Node *p) {p->prev = dummy;p->next = dummy->next;p->prev->next = p;p->next->prev = p;}Node* get_node(int key) {auto it = cache.find(key);if (it == cache.end()) return nullptr;auto node = it->second;remove(node); // 将元素移出push_front(node); // 放在表头return node;}
public:LRUCache(int capacity) {this->capacity = capacity;dummy = new Node();dummy->next = dummy;dummy->prev = dummy;}int get(int key) {auto node = get_node(key);return node ? node->value : -1;}void put(int key, int value) {auto node = get_node(key);if (node) { //若存在该元素node->value = value; // 更新valuereturn ;}cache[key] = node = new Node(key, value);push_front(node); // 放在表头if (cache.size() > capacity) { // 超容量auto back = dummy->prev;cache.erase(back->key);remove(back); //去掉尾部元素delete back; // 释放内存}}
};/*** Your LRUCache object will be instantiated and called as such:* LRUCache* obj = new LRUCache(capacity);* int param_1 = obj->get(key);* obj->put(key,value);*/

3 参考

  • 【图解】一张图秒懂 LRU!
  • 面试题 16.25. LRU 缓存(C++【OPT/FIFO/LRU】操作系统页面置换算法一网打尽)
http://www.dtcms.com/wzjs/533561.html

相关文章:

  • 微信做自己的网站网站反链一般怎么做
  • 广州网站建设设计哪家好企业网址是怎么写的
  • 电子商务网站的建设与规划书手机网站 需求模板
  • 网页设计师都在什么网站上面找素材下载地图导航手机版免流量费用
  • 公司开发个网站怎么做文山专业网站建设哪家好
  • 做一个网站先做前段 还是后端企业信用信息公示系统网址gsxt
  • 黑龙江做网站的公司股票可以做网站推广吗
  • 微网站是自己做可以不张家口seo
  • 个人网站可以做商城吗网站广告如何做
  • 网站视频打不开什么原因泰州建设局网站安监站通报
  • wordpress 宅男猫网站公司页面设计代码
  • 珠海网站建设科速上海搬家公司电话附近
  • 企维多类似网站宜选网的网站是什么做的
  • 外贸英文网站建设官方正版清理优化工具
  • 建设外围彩票网站响应式网站建设一般多少钱
  • 网站建设优化服务流程博兴网页设计
  • wordpress文章内链指定关键词佛山搜索引擎优化
  • 常平镇仿做网站做响应式网站兼容哪几个尺寸
  • 最高级网站建设crm营销
  • 做短视频的网站都有哪些做网站都需要哪些软硬件
  • one dirve做网站微信商城怎么开商城
  • 零陵旅游建设投资公司网站兰州装修公司口碑排名
  • 网站服务公司案例大数据网站视频
  • 工信部网站首页建设工程质量协会网站
  • 网站运营需要 做哪些工作网站建设 中企动力嘉兴0573
  • 网站兼容问题仿制别人的竞价网站做竞价犯法吗
  • sns社交网站 建设文档网络媒体设计是做什么的
  • 网站推广的策略陵水专业网站建设
  • 关于学校网站建设wordpress 服务器权限
  • 内蒙古住房和城乡建设厅官方网站唐山网站制作软件