日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

LRU算法 -- 链表 完整实现

發(fā)布時(shí)間:2023/11/27 生活经验 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LRU算法 -- 链表 完整实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

LRU算法(Least Recently Used) 算是我們經(jīng)常遇到的一種淘汰算法,其中內(nèi)存管理模塊進(jìn)行內(nèi)存頁回收時(shí)有用到,針對(duì)不經(jīng)常使用的內(nèi)存頁,LRU淘汰策略能夠?qū)⒃搩?nèi)存頁回收給操作系統(tǒng)。

屬于 我們操作系統(tǒng)設(shè)計(jì)中的 時(shí)間局部性原理,最長(zhǎng)時(shí)間未被訪問的數(shù)據(jù)優(yōu)先淘汰,當(dāng)內(nèi)存中已存在的數(shù)據(jù)再次被訪問時(shí),則進(jìn)行熱度的提升。

本文為了鞏固數(shù)據(jù)結(jié)構(gòu)相關(guān)知識(shí),特 使用鏈表數(shù)據(jù)結(jié)構(gòu)方式完整實(shí)現(xiàn)LRU鏈表的功能。關(guān)于數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的學(xué)習(xí)導(dǎo)圖可以借鑒數(shù)據(jù)結(jié)構(gòu)和算法導(dǎo)圖

實(shí)現(xiàn)算法思路:

   LRU 功能的實(shí)現(xiàn):1. 已有鏈表中存在 待插入元素,則將該元素在鏈表中刪除,并頭插法到鏈表頭節(jié)點(diǎn)2. 已有鏈表中不存在 待插入元素:a. 若 LRU 容量已滿,則刪除尾元素,頭插當(dāng)前元素b. 若 LRU 容量未滿,則直接頭插法當(dāng)前元素 

以上實(shí)現(xiàn) 使用其他的線性表數(shù)據(jù)結(jié)構(gòu)(棧、隊(duì)列、數(shù)組)均能夠?qū)崿F(xiàn),鏈表的實(shí)現(xiàn)方式如下:

#include <iostream>using namespace std;typedef int DataType;/*節(jié)點(diǎn)類*/
class Node{public:DataType val;Node *next;
};class List{
private:int maxSize;int length;Node *head;public:List();List(int size);~List();void insertElementBegin(DataType x); //頭插法建立鏈表bool findElement(DataType x);        //查找鏈表中是否存在元素x,存在則返回true,不存在則返回falsevoid deleteElementEnd();             //刪除鏈表的最后一個(gè)節(jié)點(diǎn)bool deleteElem(DataType x);         //刪除鏈表中值為x的節(jié)點(diǎn),刪除成功則返回true,不存在則返回falsebool isEmpty();                      //判斷鏈表是否為空,是則返回true,否則返回falsebool isFull();                       //判斷鏈表是否滿,是則返回true,否則返回falsevoid printAll();                     //打印鏈表中的元素,鏈表長(zhǎng)度,LRU長(zhǎng)度void * findElemOptim(DataType x);       //針對(duì)此應(yīng)用的優(yōu)化,查找,返回指定元素的前一個(gè)節(jié)點(diǎn)的指針void deleteElemOptim(void * node);     //針對(duì)此應(yīng)用的優(yōu)化,刪除
};List::List(){head = new Node;head -> next = NULL;this -> length = 0;this -> maxSize = 10;
}List::List(int size) {head = new Node;head -> next = NULL;this -> length = 0;this -> maxSize = size;
}List::~List() {Node* p, *tmp;p = head;while(p -> next) {tmp = p -> next;p -> next = p -> next -> next;delete tmp;}delete head;this -> head = NULL;this -> length = 0;
}void List::insertElementBegin(DataType x) {Node *p = new Node;p -> val = x;p -> next = head -> next;head -> next = p;this -> length ++;
}bool List::findElement(DataType x) {Node *p = head;while(p -> next != NULL) {if(p -> val == x) {return true;}p = p -> next;}return false;
}void List::deleteElementEnd() {if(head -> next == NULL) {return;}Node *tmp;Node *p = head;while(p -> next != NULL && p -> next -> next != NULL) {p = p -> next;}tmp = p -> next;p -> next = tmp -> next;this -> length --;delete tmp;
}bool List::deleteElem(DataType x) {Node *p = head;Node *tmp;while(p -> next != NULL) {if(p -> next -> val == x) {tmp = p -> next;p -> next = tmp -> next;delete tmp;this -> length --;return true;}p = p -> next;}return false;
}bool List::isEmpty() {return this -> length == 0 ? true:false;
}bool List::isFull() {return this -> length == maxSize ? true:false;
}void List::printAll() {Node *p;p = head;cout << "lru list length :" << this -> length << endl;cout << "lru list maxSize :" << this -> maxSize << endl;cout << "lru list val:" << endl;while(p -> next != NULL) {p = p -> next;cout << p -> val << " ";}cout << endl;
}void * List::findElemOptim(DataType x) {Node *p = head;while(p -> next != NULL) {if(p -> next -> val == x) {return (void *)p;}p = p -> next;}return NULL;
}void List::deleteElemOptim(void *node) {Node *p, *tmp;p = (Node*)node;tmp = p -> next;p -> next = tmp -> next;delete tmp;this -> length --;
}int main() {cout << "test LRU:" << endl;List list(10);int num = 0;while(1) {cout << "please enter a number, 99999 = exit" << endl;cin >> num;if(num == 9999) {break;}/*LRU 功能的實(shí)現(xiàn):1. 已有鏈表中存在 待插入元素,則將該元素在鏈表中刪除,并頭插法到鏈表頭節(jié)點(diǎn)2. 已有鏈表中不存在 待插入元素:a. 若 LRU 容量已滿,則刪除尾元素,頭插當(dāng)前元素b. 若 LRU 容量未滿,則直接頭插法當(dāng)前元素           */Node *node = (Node*)list.findElemOptim(num);if(node != NULL) {list.deleteElemOptim(node);list.insertElementBegin(num);} else {if(list.isFull()) {list.deleteElementEnd();list.insertElementBegin(num);} else {list.insertElementBegin(num);}}list.printAll();}return 0;
}

編譯g++ -std=c++11 lru_list.cc

運(yùn)行如下./a.out

test LRU:
please enter a number, 99999 = exit
2
lru list length :1
lru list maxSize :10
lru list val:
2 
please enter a number, 99999 = exit
3
lru list length :2
lru list maxSize :10
lru list val:
3 2 
please enter a number, 99999 = exit
4
lru list length :3
lru list maxSize :10
lru list val:
4 3 2
...
...
...
please enter a number, 99999 = exit #輸入了34,此時(shí)LRU容量已滿,則刪除尾元素,頭插入34
34
lru list length :10
lru list maxSize :10
lru list val:
34 23 12 11 1 8 7 3 2 6 
please enter a number, 99999 = exit #輸入23,提升23的熱度
23
lru list length :10
lru list maxSize :10
lru list val:
23 34 12 11 1 8 7 3 2 6 
please enter a number, 99999 = exit #輸入2,提升2的熱度
2
lru list length :10
lru list maxSize :10
lru list val:
2 23 34 12 11 1 8 7 3 6 
please enter a number, 99999 = exit
9999

總結(jié)

以上是生活随笔為你收集整理的LRU算法 -- 链表 完整实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。