实现lru算法
A. lru镟挎崲绛栫暐璁$畻杩囩▼
LRU锛圠east Recently Used锛夋浛鎹㈢瓥鐣ョ殑璁$畻杩囩▼鏄锘轰簬缂揿瓨涓鏁版嵁椤圭殑璁块梾镞堕棿𨱒ヨ繘琛岀殑銆傚綋缂揿瓨婊℃椂锛屾渶镞╄璁块梾涓旀渶闀挎椂闂存湭琚鍐嶆¤块梾镄勬暟鎹椤瑰皢琚镟挎崲鍑哄幓銆
LRU镟挎崲绛栫暐鏄涓绉嶅父鐢ㄧ殑缂揿瓨镟挎崲绛栫暐锛屽叾镙稿绩镐濇兂鏄“链杩戜娇鐢ㄨ繃镄勬暟鎹椤瑰湪链𨱒ユ洿链夊彲鑳借鍐嶆′娇鐢”銆傚洜姝わ纴LRU绛栫暐灏嗘渶杩戜娇鐢ㄨ繃镄勬暟鎹椤逛缭瀛桦湪缂揿瓨涓锛屼互渚垮揩阃熻块梾銆
LRU镟挎崲绛栫暐镄勫疄鐜伴氩父闇瑕佷竴涓棰濆栫殑鏁版嵁缁撴瀯𨱒ヨ板綍姣忎釜鏁版嵁椤圭殑璁块梾镞堕棿銆傝繖涓鏁版嵁缁撴瀯鍙浠ユ槸涓涓阈捐〃鎴栬呬竴涓镞堕棿鎴虫暟缁勚傚綋涓涓鏂扮殑鏁版嵁椤硅璁块梾镞讹纴瀹幂殑璁块梾镞堕棿浼氲镟存柊涓哄綋鍓嶆椂闂达纴骞朵笖瀹冧细琚绉诲埌阈捐〃鎴栬呮暟缁勭殑链鍓嶉溃銆傚綋缂揿瓨婊℃椂锛屾渶镞╄璁块梾涓旀渶闀挎椂闂存湭琚鍐嶆¤块梾镄勬暟鎹椤癸纸鍗抽摼琛ㄦ垨鏁扮粍镄勬渶钖庝竴椤癸级灏呜镟挎崲鍑哄幓銆
涓句釜渚嫔瓙𨱒ヨ存槑LRU镟挎崲绛栫暐镄勮$畻杩囩▼锛
锅囱炬湁涓涓缂揿瓨锛屽归噺涓3锛屽凡缁忓瓨鍌ㄤ简涓変釜鏁版嵁椤笰銆丅鍜孋銆傚畠浠镄勮块梾镞堕棿鍒嗗埆涓1銆2鍜3锛堟暟瀛楄秺灏忚〃绀鸿秺镞╄璁块梾锛夈傜幇鍦ㄦ湁涓涓鏂扮殑鏁版嵁椤笵闇瑕佽锷犺浇杩涚紦瀛樸傜敱浜庣紦瀛桦凡缁忔弧浜嗭纴镓浠ラ渶瑕佹牴鎹甃RU绛栫暐阃夋嫨涓涓鏁版嵁椤硅繘琛屾浛鎹銆傛牴鎹甃RU绛栫暐锛屾渶镞╄璁块梾涓旀渶闀挎椂闂存湭琚鍐嶆¤块梾镄勬暟鎹椤规槸A锛屽洜涓哄畠镄勮块梾镞堕棿鏄1锛屾渶镞╀笖链闀挎椂闂存病链夎镟存柊銆傚洜姝わ纴A灏呜镟挎崲鍑哄幓锛娈灏呜锷犺浇杩涚紦瀛樸
鍦ㄥ疄闄呭簲鐢ㄤ腑锛孡RU镟挎崲绛栫暐阃氩父涓庡叾浠栫瓥鐣ョ粨钖堜娇鐢锛屼緥濡侺FU锛圠east Frequently Used锛夌瓥鐣ワ纴浠ヨ繘涓姝ユ彁楂樼紦瀛樼殑锻戒腑鐜囧拰镐ц兘銆傛ゅ栵纴鐜颁唬璁$畻链虹郴缁熶腑阃氩父浣跨敤纭浠舵敮鎸佺殑LRU绠楁硶𨱒ュ疄鐜伴珮阃熺紦瀛樼殑镟挎崲绛栫暐锛屼互鎻愰珮绯荤粺镄勬ц兘鍜屽搷搴旈熷害銆
镐荤殑𨱒ヨ达纴LRU镟挎崲绛栫暐鏄涓绉岖亩鍗曡屾湁鏁堢殑缂揿瓨镟挎崲绛栫暐锛屽叾镙稿绩镐濇兂鏄鍒╃敤鏁版嵁椤圭殑璁块梾镞堕棿𨱒ラ勬祴链𨱒ョ殑璁块梾妯″纺锛屼粠钥屾彁楂樼紦瀛樼殑锻戒腑鐜囧拰镐ц兘銆
B. LRU绠楁硶镄勫师鐞嗕笌瀹炵幇
LRU鏄疞east Recently Used镄勭缉鍐欙纴鍗虫渶杩戞渶灏戜娇鐢ㄧ畻娉曪纴搴旂敤闱㈤潪甯哥殑骞挎硾锛屾瘆濡俽edis褰扑腑镄勫唴瀛樻窐姹扮瓥鐣ャ傚洜涓鸿$畻链虹殑鍐呭瓨閮芥槸链夐檺镄勶纴褰撶敤鎴疯块梾镄勬暟鎹濡傛灉瀛桦湪鍐呭瓨褰扑腑鐩存帴杩斿洖镄勭粰鐢ㄦ埛镄勮瘽锛屾晥鐜囦细闱炲父蹇锛屼絾鏄濡傛灉鍐呭瓨涓嶅瓨鍦锛屽湪铡荤佺洏閲岄溃镆ユ垒镄勶纴鏁堢巼浼氩ぇ镓撴姌镓c傛墍浠ユ垜浠甯屾湜鍦ㄦ湁闄愮殑鍐呭瓨绌洪棿褰扑腑锛屽氩瓨鏀剧偣鐑镣规暟鎹锛岀敤鎴蜂笉缁忓父璁块梾镄勬暟鎹锛屽敖閲忔窐姹版帀锛岄伩鍏嶅崰鐢ㄥ唴瀛樼┖闂淬
浣跨敤鍙屽悜阈捐〃𨱒ュ疄鐜癓RU 杩欑瘒鏂囩珷宸茬粡鐢ㄥ弻钖戦摼琛ㄦ潵瀹炵幇杩尝RU绠楁硶浜嗭纴浣嗘槸锘轰簬鍙屽悜阈捐〃镄勭壒镐э纴浣垮缑璇ョ畻娉旷殑镞堕棿澶嶆潅搴︿负O(n)锛屾樉铹朵笉鏄链浼樼殑绠楁硶锛岄偅涔堟湁娌℃湁绠楁硶锛屽彲浠ヨ揪鍒疠(1)锛屽綋铹舵槸链夌殑锛屾棭镞╃殑璁$畻链虹戝﹀跺凡缁忔兂鍒帮纴骞朵笖宸茬粡瀹炵幇浜嗐
鍦ㄧ玛钥呬粙缁嶆帴涓嬫潵镄勫唴瀹规椂锛岃缮鏄甯屾湜鍏堜简瑙d竴涓嬩袱绡囧崥鏂囷细
涓銆 锲捐ВHashMap铡熺悊
浜屻 锲捐ВLinkedHashMap
涔嫔墠浣跨敤鍙屽悜阈捐〃铡诲疄鐜癓RU绠楁硶镞讹纴镞堕棿澶嶆潅搴︽病链夎揪鍒疠(1)锛屼富瑕佸师锲犲湪浜庨亶铡嗙粨镣规椂锛屽甫𨱒ョ殑镞堕棿寮阌锛岄偅涔堟崲鍙ヨ瘽璇达纴瑕佸疄鐜伴亶铡嗙粨镣规椂锛屾椂闂村嶆潅搴︿负O(1)锛岀涓镞堕棿𨱍冲埌镄勫簲璇ユ槸hash鏁扮粍锛屼絾鏄痟ash绠楁硶鍙鑳戒细瀛桦湪涓嶅悓镄刱ey鍊硷纴浜х敓鐩稿悓镄删ash鍊硷纴闾d箞鍙浠ュ皢涓嶅悓key锛屼絾鏄鐩稿悓hash鍊肩殑缁撶偣锛屼互鍗曢摼琛ㄧ殑褰㈠纺瀛樻斁銆傝繖镙蜂粎浠呮槸瀹炵幇浜嗗瓨鍙栨椂闂村嶆潅搴︿负O(1)锛屽备綍瀹炵幇鏁版嵁鑳藉熸寜璁块梾椤哄簭瀛樻斁锻锛熷苟涓斿炲垹镄勬椂闂村嶆潅搴︿负O(1)锛岃繖涓鍙浠ヤ娇鐢ㄥ弻钖戦摼琛ㄦ潵瀹炵幇锛屾墍浠ョ患钖堟潵璁诧纴灏辨槸瀹炵幇鏁e垪鏁扮粍+鍙屽悜阈捐〃𨱒ヤ娇鐢↙RU锛屽彲浠ヨ揪鍒版椂闂村嶆潅搴︿负O(1)銆
阃昏緫瑙嗗浘濡备笅:
鍜嬩竴鐪嬭繖涓锲句贡镄勫緢锛岀◢寰瑙i喷涓涓嬶纴濡傛灉镒熻夌悊瑙d笂链夌偣锲伴毦锛屽彲浠ュ厛铡讳简瑙d竴涓嬩箣鍓嶆帹钻愮殑涓ょ瘒鍗氭枃锛岄偅閲屼细浠嬬粛镄勬洿锷犺︾粏涓镣广
1.链宸︿晶鍏跺疄灏辨槸涓涓鏅阃氱殑鏁扮粍锛屾暟缁勭殑澶у皬蹇呴’鏄2镄勫嶆暟锛岃繖涓铡熷洜鏄浠涔埚憿锛熷洜涓鸿繖涓鏁扮粍镄勫瓨鏀炬柟寮忔槸鏁e垪镄勶纴镒忔濆氨鏄闇瑕乲ey.hashcode & (length -1)镓嶈兘寰楀嚭瀛樻斁浣岖疆镄勬柟寮忥纴hash镄勫ソ澶勬槸鍙浠ユ牴鎹甼ey鍊硷纴鍦ㄦ椂闂村嶆潅搴︿负O(1)镄勫墠鎻愭垒鍒板瑰簲镄勫瓨鏀句綅缃锛岃繖涔熸槸鎴戜滑镄勫埯琛凤纴璇村埌杩欓噷鍏跺疄杩樻病链夎В閲娄负浠涔堜竴瀹氲佹槸2镄勫嶆暟锛屽洜涓2镄勫嶆暟-1锛岃繖涓鏁扮殑浜岃繘鍒讹纴涓瀹氩叏鏄1锛屾瘆濡16-1=15锛屼簩杩涘埗琛ㄧず灏辨槸1111锛&杩愮畻绗﹀叾瀹炲氨鏄灏嗗煎叏閮ㄥ寲鎴愪簩杩涘埗阃愪綅涓庯纴姣斿10111011 & 1111 = 1011 = 11锛屼絾鏄濡傛灉涓嶆槸2镄勫嶆暟锛屾瘆濡7-1=6锛屽寲鎴愪簩杩涘埗灏辨槸0110锛岀敱浜庢汤浣嶆槸0锛屼笉绠′粈涔堜簩杩涘埗鍊间笌0110锅&杩愮畻锛屼竴瀹氭槸锅舵暟锛岃繖镙蜂细瀵艰嚧鏁e垪鍒嗗竷涓嶅潎鍖銆
2.涓嶅悓key鍊硷纴鐩稿悓hash鍊硷纴濡备綍瀛樻斁锻锛熺浉钖岀殑hash鍊煎仛涓庤繍绠椾竴瀹氲兘澶熷缑鍒扮浉钖岀殑鏁扮粍鑴氭爣锛岃繖浜涚粨镣癸纴浠ュ崟阈捐〃镄勫舰寮忓瓨鍦锛屽氨鏄锲句腑鏁扮粍鍙充晶镄勫崟阈捐〃銆
3.濡备綍瀹炵幇鎸夎块梾椤哄簭锛熶笂锲鹃櫎铡绘暟缁勫拰鎸傚湪鏁扮粍鍙充晶镄勫崟阈捐〃锛岃缮链夌豢镩插拰榛勮壊镄勫崟钖戠澶达纴鍦ㄥ彸涓婅掕缮链変竴涓鍙屽悜阈捐〃镄勫ご鎸囬拡銆傚叾瀹炶繖浜涚澶村氨鏄缁存姢涓嶅悓缁撶偣镄勮块梾椤哄簭锛屽嵆鍙屽悜阈捐〃銆
镐讳笂镓杩帮纴杩欑嶆暟鎹缁撴瀯瀹氢箟镄勭粨鏋勪綋濡备笅锛
class Node{
Object key; //瀛樻斁key鍊硷纴鐢ㄤ簬璁$畻瀛樻斁鏁扮粍鑴氭爣浣岖疆
Object value;//瀛樻斁鍏幂礌鍊
int hash;//瀛樻斁key.hashcode
Node next;//缁存姢鍗曢摼琛ㄩ‘搴
Node before;//缁存姢鍙屽悜阈捐〃椤哄簭
Node after;
}
绗旇呯敤java瀹炵幇濡备笅锛屾劅鍏磋叮鍙浠ョ敤镊宸卞枩娆㈢殑璇瑷铡诲疄鐜颁竴阆嶏纴锷犳繁鐞呜В锛
鍏跺疄浠ヤ笂瀹炵幇搴曞眰铡熺悊灏辨槸LinkedHashMap镄勫疄鐜板师鐞嗭纴鍙涓嶈繃绗旇呭仛浜嗕竴浜涚亩鍖栵纴铡绘帀浜嗙箒鐞愮殑缁ф圹锛屾墿瀹圭瓑锛岀獊鍑轰简绠楁硶镙稿绩锛屽傛灉璇昏呮劅鍏磋叮涔熷彲浠ュ幓镰旂┒涓涓婰inkedHashMap镄勬簮镰併
浣跨敤LinkedHashMap𨱒ュ疄鐜癓RU绠楁硶锛
鐪嬭捣𨱒ユ槸涓嶆槸绠鍗曚简寰埚氾纴锲犱负LinkedHashMap搴曞眰宸茬粡灏佽呭ソ浜嗭纴鎴戜滑鐩存帴璋幂敤灏卞ソ锛屼絾鏄浣滀负涓涓𨱍宠佸彉浼樼镄勭爜鍐滐纴涓瀹氲佺煡鍏剁劧鐭ュ叾镓浠ョ劧銆
浣跨敤鏁e垪+鍙屽悜阈捐〃镄勬柟寮忔槸濡备綍瀹炵幇O(1)澶嶆潅搴︾殑锛熷湪瀹炵幇LRU绠楁硶杩囩▼涓锛屾棤闱炰袱绉嶆搷浣滐纴镆ユ垒鍜屼慨鏀癸纴浣跨敤鏁e垪鏁扮粍瀹炵幇镆ユ垒镞堕棿澶嶆潅搴︿负O(1)锛屼娇鐢ㄥ弻钖戦摼琛ㄥ疄鐜颁慨鏀瑰嶆潅搴︿负O(1)锛屽苟涓斿弻钖戦摼琛ㄨ缮鍙浠ョ淮鎶よ块梾椤哄簭锛屾墍浠ヤ娇鐢ㄨ繖绉嶆柟寮忥纴鍙浠ヨ揪鍒疠(1)銆
C. 实现LRU算法的硬件支持是什么
寄存器、栈
实现LRU算法的硬件支持是寄存器、栈。寄存器用于记录某进程在内存中各页的使用情况;栈用于保存当前使用的各个页面的页面号。LRU是最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。
(3)实现lru算法扩展阅读:
大部分操作系统为最大化页面命中率而广泛采用的一种页面置换算法是LRU算法。该算法的思路是,发生缺页中断时,选择未使用时间最长的页面置换出去。从程序运行的原理来看,最近最少使用算法是比较接近理想的一种页面置换算法,这种算法既充分利用了内存中页面调用的历史信息,又正确反映了程序的局部问题。
D. 用java语言实现LRU算法和FIFO算法。急急急!!!!!!!
您好,网络贴吧专家团很高兴能够回答您的问题。您的采纳是我们前进的动力。
public class LRU {
private int theArray[];
private int back; //定义队尾
private int currentSize; //队列中存放元素个数
private int maxSize=5; //队列中能存放元素的个数
public LRU(){
theArray=new int[maxSize];
back=0;
currentSize=0;
}
public void queue(int a[]){
for(int i=0;i<a.length;i++){
enQueue(a[i]);
}
}
public void enQueue(int x){ //入队
beUsed(x); //先判断是否已存在该页号,若存在,删除
if(currentSize<maxSize){
theArray[back]=x;
back++;
currentSize++;
}else if(currentSize==maxSize){ //满了
for(int i=0;i<maxSize-1;i++){
theArray[i]=theArray[i+1];
}
theArray[maxSize-1]=x;
}
for(int i=0;i<currentSize;i++){
System.out.print(theArray[i]);
}
System.out.println();
}
public void beUsed(int x){ //判断是否已存在该页号,若存在,删除已有的
for(int i=0;i<currentSize;i++){
if(theArray[i]==x){
for(int j=i;j<currentSize-1;j++){
theArray[j]=theArray[j+1];
}
currentSize--;
back--;
}
}
}
public static void main(String[] args) {
LRU lru=new LRU();
int a[]={4,7,0,7,1,0,1,2,1,2,6};
lru.queue(a);
}
}
E. lru页面置换算法是什么
用双向链表和哈希表来实现。
LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。
反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。这个,就是着名的局部性原理——比内存速度还要快的cache,也是基于同样的原理运行的。因此,只需要在每次调换时,找到最近最少使用的那个页面调出内存。这就是LRU算法的全部内容。
一种LRU近似算法是最近未使用算法。
它在存储分块表的每一表项中增加一个引用位,操作系统定期地将它们置为0。当某一页被访问时,由硬件将该位置1。过一段时间后,通过检查这些位可以确定哪些页使用过,哪些页自上次置0后还未使用过。就可把该位是0的页淘汰出去,因为在之前最近一段时间里它未被访问过。
以上内容参考:网络-页面置换算法