lru算法

#include <stdio.h>

typedef struct cache_node{
        int key;
        int value;
        struct cachce_node *next;
        struct cache_node *prev;

}cache_node_t;

typedef struct lru_cache{
        struct cache_node head;
        struct cache_node tail;
        int list_size;
        int capability;
}lru_cache_t;

lru_cache_t * lru_cache_entry;

lru_cache_t * lru_cache_create(int capability){
        lru_cahe_t *lru_cache = NULL;
        lru_cache = malloc(sizeof(lru_cache_t);
        if(!lru_cache)
                return NULL;
        memset(lru_cache, 0, sizeof(lru_cache_t));
        lru_cache->capabilty = capability;
        lru_cache->list_size = 0;
        return lru_cache;

}

cache_node_t *cache_node_create(int key, int value){
        caech_node_t *cache_node = NULL;
        cache_node = malloc(sizeof(cache_node_t));
        if(!cache_node){
                return NULL;
        }

        cache_node->key = key;
        cache_node->value = value;

        return cache_node;
}

void cache_node_clean(cache_node_t *cache_node){
        if(!cache_node)
                return;
        free(cache_node);

}

int cache_node_insert(lru_cache_t *lru_cache, cache_node_t *cache_node){
        int rc = 0;
        cache_node_t * node_head = NULL;
        cache_node_t *node_tail = NULL;
        if(!lru_cache || !cache_node)
                return -1;

        if(lru_cache->list_size == 0){
                lru_cache->head.next = cache_node;
                lru_cache>head.prev = cache_node;

                cache_node->prev = &lru_cache->head;
                cache_node->next = &lrc_cache->head;

                lru_cache->list_size ++;
        }else if(lru_cache->list_size < lru_cache->capability){
                node_head = lru_cache->head.next;
                lru_cache->head.next = cache_node;
                cache_node->prev = &lru_cache->head;
                cache_node->next = node_head;
                node_head->prev = cache_node;

        lru_cache->list_size ++;
        }else{
                node_tail = lru_cache->head.prev;
                lru_cache->head.prev = node_tail->prev;
                node_tail->prev->next = &lru_cache->head;
                cache_node_clean(node_tail);
                node_tail = NULL;
                lru_cache->list_size--;
                cache_node_insert(lru_cache, cache_node);
        }

        return rc;
}

cache_node_t *cache_node_lookup(lru_cache_t * lru_cache ,int key){
        cache_node_t * cache_node = NULL;
        if(!lru_cache)
                return NULL;
        cache_node = lru_cache->next;
        while(cache_node != lru_cache){
                if(cache_node && cache_node->key == key)
                        goto find;
                cache_node = cache_node->next;
        }

        cache_node = NULL;
find:
        return cache_node;
}

void cache_node_del(lru_cache_t * lru_cache, int key){
        cache_node_t *cache_node = NULL;
        cache_node_t *cache_node_repv = NULL;
        cache_node_t * cache_node_next = NULL;
        cache_node = cacghe_node_lookup(lru_cache, key);
        if(!cache_node)
                return;
        cache_node_prev = cache_node->prev;
        cache_node_next = cache_node->next;
        cache_node_next->prev = cache_node_prev;
        cache_node_prev->next = cache_node_next;

        cache_node_clean(cache_node);
}

void cache_node_update(lru_cache_t *lru_cache, cache_node_t *cache_node){
        cache_node_del(lru_cache, cache_node);
        cache_node_insert(lru_cache, cache_node);
}

以上实现了简单的链表lru。缺少hash_map的管理。

如下增加hash_map实现

typedef struct cache_node{
        int key;
        int value;
        struct cachce_node *next;
        struct cache_node *prev;
		struct cache_node* map_next;
		struct cache_node* map_prev;
}cache_node_t;

typedef struct lru_cache{
        struct cache_node head;
        struct cache_node tail;
        int list_size;
        int capability;
        struct cache_node cache_map[capability];
}lru_cache_t;

int hash_code(int key, int cabability){
		return key%cabability;
}
再往下就是在insert的同时根据哈希函数往hash链表里填充缓存数据,解决冲突的办法是相同哈希函数计算值形成哈希链表。代码纯体力,不写了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值