美文网首页
C++ 实现有序字典(哈希表加双向链表)

C++ 实现有序字典(哈希表加双向链表)

作者: 忻恆 | 来源:发表于2019-12-05 19:46 被阅读0次

来自LeetCode的一道题目,要求在O(1)时间实现带有LRU的Get,Set数据结构。

下面给出实现的方法:

Public需要实现的有,put; get; 构造函数;

Private需要实现的有,size;capacity;head,tail结点;hash表cache;poptail;moveToHead;removeNode;addNode;(通常的双向链表的实现方式)

下面给出代码:

class LRUCache {

public:

    struct LRUNode{

        int key;

        int val;

        LRUNode* pre;

        LRUNode* next;

    };

    LRUCache(int capacity) {

        this->size    = 0;

        this->capacity = capacity;

        head = new LRUNode;

        tail = new LRUNode;

        head->next    = tail;

        tail->pre    = head;

    } 


    int get(int key) {

        if(hash_table.count(key) == 0){

            return -1;

        }

        else{

            auto item = hash_table[key];

            moveToHead(item);

            return item->val;

        }

    }


    void put(int key, int value) {

        if(hash_table.count(key) == 0){

            auto newNode = new LRUNode;

            newNode->key  = key;

            newNode->val  = value;

            hash_table[key] = newNode;

            addNode(newNode);

            size++;

            if(size > capacity){

                popTail();

                size--;

            }

        }

        else{

            hash_table[key]->val = value;

        }

        moveToHead(hash_table[key]);

    }

private:

    int size;

    int capacity;

    LRUNode* head;

    LRUNode* tail;

    unordered_map<int, LRUNode*> hash_table;

    void popTail(){

        auto node = tail->pre;

        tail->pre = this->tail->pre->pre;

        tail->pre->next = tail;

        hash_table.erase(node->key);

        delete node;

    }

    void moveToHead(LRUNode* node){

        removeNode(node);

        addNode(node);

    }

    void removeNode(LRUNode* node){

        node->pre->next = node->next;

        node->next->pre = node->pre;

    }

    void addNode(LRUNode* node){

        node->next    = head->next;

        node->pre      = head;

        head->next    = node;

        node->next->pre = node;

    }

};

/**

* 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);

*/

相关文章

  • C++ 实现有序字典(哈希表加双向链表)

    来自LeetCode的一道题目,要求在O(1)时间实现带有LRU的Get,Set数据结构。 下面给出实现的方法: ...

  • leetcode146. LRU缓存机制

    双向链表+哈希表实现LRU

  • LRU算法—Swift代码实现

    Swift 需要用到哈希表和双向链表进行实现。哈希表可以快速查找,双向链表能够通过自身从链表中删除自身

  • LRU 缓存机制实现:哈希表 + 双向链表

    算法详解 LRU 缓存机制可以通过哈希表辅以双向链表实现,我们用一个哈希表和一个双向链表维护所有在缓存中的键值对。...

  • LRU缓存

    1.LRU 缓存机制可以通过哈希表辅以双向链表实现,用一个哈希表和一个双向链表维护所有在缓存中的键值对 2.使用 ...

  • redis入门(四) redis底层结构简介(哈希表,跳跃表,压

    一些常用的redis结构,底层实现及方法 哈希表 在redis当中,使用哈希表作为字典的底层实现,底层是数组+链表...

  • LinkedHashMap原理分析

    一、概述 LinkedHashMap是通过哈希表和链表实现的,它通过维护一个链表来保证对哈希表迭代时的有序性,而这...

  • 4.字典

    字典 1. 字典的实现 Redis的字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,每个哈希表节点...

  • 2020-07-23

    一、hashMap 数组加链表形式的哈希表,时间复杂度O(1) 二、双向指针问题 1. 快慢指针 a. 判断链表是...

  • Redis数据结构与对象——哈希

    1 字典的实现 Redis的字典使用哈希表作为底层实现,一个哈希表可以有多个哈希表节点,即每个哈希表节点就保存了字...

网友评论

      本文标题:C++ 实现有序字典(哈希表加双向链表)

      本文链接:https://www.haomeiwen.com/subject/tstrgctx.html