IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C语言----设计LRU缓存结构 -> 正文阅读

[数据结构与算法]C语言----设计LRU缓存结构

?用双向链表,头插法,思路很简单链表头是最常访问的地方,链表尾是最不常访问的地方:

1,如果操作为1,说明要加入到链表,插入到表头

2,如果操作为2,说明节点被访问,从当前节点删除并移动到表头

????????其中要考虑到缓冲区的大小,即链表长度,如果加入前链表长度已经到了最大,则需要删除链表尾节点,再加入

/**
 * lru design
 * @param operators int整型二维数组 the ops
 * @param operatorsRowLen int operators数组行数
 * @param operatorsColLen int* operators数组列数
 * @param k int整型 the k
 * @return int整型一维数组
 * @return int* returnSize 返回数组行数
 */
#define FALSE 0
#define TRUE 1
typedef struct LruLink
{
    int key;
    int value;
    struct LruLink *pre;
    struct LruLink *next;
}LruLink;
int addNodeToLink(LruLink *head,int key, int value)
{
    LruLink *node = (LruLink *)malloc(sizeof(LruLink));
    if(node == NULL)
        return FALSE;
    node->key = key;
    node->value = value;
    if(head ->next == NULL)
    {
        node ->next = head ->next;
        head ->next = node;
        node ->pre = head;
    }
    else
    {
        node ->next = head->next;
        head ->next->pre = node;
        node ->pre = head;
        head ->next = node;
    }
    
    return TRUE;
}
void delTail(LruLink *head)
{
    LruLink *p = head->next;
    while( p != NULL)
    {
        if(p->next == NULL)
        {
            p->pre->next = NULL;
            p->pre = NULL;
            free(p);
        }
        p = p->next;
    }
}
int getNode(LruLink *head,int key)
{
    LruLink *p = head;
    while(p != NULL)
    {
        if(p->key == key)
        {
            if(p->next == NULL)
            {
                p->pre->next = NULL;
                p ->next = head->next;
                head ->next->pre = p;
                p ->pre = head;
                head ->next = p;
            }
            else
            {
                p->next->pre = p->pre;
                p->pre->next = p->next;
                p ->next = head->next;
                head ->next->pre = p;
                p ->pre = head;
                head ->next = p;
            }
            return p->value;
        }
        p = p->next;
    }
    return -1;
}

int* LRU(int** operators, int operatorsRowLen, int* operatorsColLen, int k, int* returnSize ) 
{
    // write code here
    LruLink *pHead = (LruLink *)malloc(sizeof(LruLink));
    LruLink *pIndex;
    pHead -> next = NULL;
    int LruLinkLen = 0;
    int *retArr = (int *)malloc(sizeof(int)*operatorsRowLen);
    int retLen = 0;
    memset(retArr,0,operatorsRowLen);
    
    int i = 0,j=0;
    for(i=0; i<operatorsRowLen; i++)
    {
        if(operators[i][0] == 1)
        {
            //头插法插入到表头,表头始终为最常用的,如果缓存队列满则删除队尾节点
            if(0 == k)
            {
                delTail(pHead);
                addNodeToLink(pHead,operators[i][1],operators[i][2]);
            }
            else
            {
                addNodeToLink(pHead,operators[i][1],operators[i][2]);
                k--;
            }
        }
        else if(operators[i][0] == 2)
        {
            //查找操作,如果没找到输出-1,如果找到将节点移动到头
            retArr[retLen++] = getNode(pHead,operators[i][1]);
        }
    }
    for (pIndex = pHead->next; pIndex != NULL; pIndex = pIndex->next)
    {
        free(pIndex);
    }
    free(pHead);
    if (returnSize)
    {
        *returnSize = retLen;
    }
    return retArr;
}

?

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-02 11:02:29  更:2021-08-02 11:04:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:58:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码