zoukankan      html  css  js  c++  java
  • 链表&LRU

    简介

    链表就是链式存储数据的一种数据结构。双向链表每个数据存储都包含他的前后数据节点的位置信息(索引/指针)。

       class DSChain<T>
        {
            //使用栈来进行废弃空间回收
            private DSStack<int> _recycle;
    
            //数据需要三个数据来存储内容,分别存储前后节点索引和数据本身
            private int[] _prev;
            private T[] _ds;
            private int[] _next;
    
            //链表头尾的索引,跟踪表尾主要方便LRU使用
            private int _head;
            private int _tail;
    
            public DSChain(int length)
            {
                _head = -1;
                _tail = -1;
                _prev = new int[length];
                _ds = new T[length];
                _next = new int[length];
    
                _recycle = new DSStack<int>(length);
                //将所有可用空间压入栈,也可改良当顺序空间耗尽后再读取栈中记录的回收空间
                for (int i = 0; i < length; i++)
                {
                    _recycle.Push(i);
                }
            }
    
            //搜索数据,返回所在索引
            int Search(T data)
            {
                if (_head == -1) return -1;
                int index = _head;
                while (!_ds[index].Equals(data))
                {
                    index = _next[index];
                    if (index == -1) return -1;
                }
                return index;
            }
    
            public bool Insert(T data)
            {
                int index;
                if (!_recycle.Pop(out index)) return false;
                if (_head == -1)
                {
                    _prev[index] = -1;
                    _ds[index] = data;
                    _next[index] = -1;
                    _tail = index;
                }
                else
                {
                    _prev[index] = -1;
                    _ds[index] = data;
                    _next[index] = _head;
                    _prev[_head] = index;
                }
                _head = index;
                return true;
            }
    
            public bool Delete(T data)
            {
                int index = Search(data);
                if (index == -1) return false;
    
                if (_prev[index] != -1) _next[_prev[index]] = _next[index];
                else _head = _next[index];
    
                if (_next[index] != -1) _prev[_next[index]] = _prev[index];
                else _tail = _prev[index];
    
                _recycle.Push(index);
                return true;
            }
    
            //LRU
            public bool DeleteLast()
            {
                int index = _tail;
                if (index == -1) return false;
                _tail = _prev[index];
                _next[_prev[index]] = -1;
                _recycle.Push(index);
                return true;
            }
    
            //LRU访问方法,读取数据的同时调整数据在链表中位置
            //链表这种数据结构实现LRU非常方便
            public bool LRUAccess(T data)
            {
                int index = Search(data);
                if (index == -1) return false;
                if (_head == index) return true;
                if (_tail == index) _tail = _prev[index];
    
                _next[_prev[index]] = _next[index];
                if (_next[index] != -1) _prev[_next[index]] = _prev[index];
    
                _prev[index] = -1;
                _next[index] = _head;
                _prev[_head] = index;
                _head = index;
                return true;
            }
        }
    作者:SuperEVO
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    51 Nod 1068 Bash游戏v3
    51 Nod Bash 游戏v2
    51 Nod 1073 约瑟夫环
    UVA 12063 Zeros and ones 一道需要好好体会的好题
    51 Nod 1161 Partial sums
    2018中国大学生程序设计竞赛
    UVA 11971 Polygon
    UVA 10900 So do you want to be a 2^n-aire?
    UVA 11346 Possibility
    python with as 的用法
  • 原文地址:https://www.cnblogs.com/zhang740/p/3785711.html
Copyright © 2011-2022 走看看