pythons实现LRU算法,纯属个人思路,重复造轮子。

前言:

  FIFO:先进先出算法的模拟。若想用链表完成,请参考:http://www.jb51.net/article/55691.htm,使用现成轮子参考:http://www.cnblogs.com/break-python/p/5459169.html

这里我是使用的是纯属List.本人小白,如有错误,请指出,谢谢。

#-*- coding: UTF-8 -*-
#author:若鸟,原创
#data:2016-12-21
#function:实现对LRU算法的模拟,针对FIFO的升级,可改变模块数。

'''
思路:虽说是重复造轮子,但也是锻炼思维
    本想FIFO代码的基础上进行升级,但是,遇到一个问题:当对字典进行记录先后顺序时,如果模块数较多,则需要循环,但是不能
够通过循环赋值,绞尽脑汁,干脆另起炉灶,换一种思路。
    创建一个列表,用来记录已经输入过得页面,但是这个列表必须按 从晚到早 的顺序排列,而且还必须去掉重复的页面,得到这个列表
而这个列表的第 [ 模块数-1]个索引的值,就是需要替换的值。然后通过遍历序列,找出,替换。



'''
import string

def InputList():                                                              #输入函数,输入序列数
    list_input=[]

    input_str=input("请输入序列,并以空格键分隔\n")
    len_input_str=len(input_str)
    for i in range(0,len_input_str,2):                                          #去除空格
        list_input.append(int(input_str[i]))
    print("您输入的页面序列是:",list_input)
    return list_input                                                         #返回一个输入的序列

def LRU_Algorithm(list_input=[],size=3):                                      #LRU算法,模块号默认为3

    list_new=[]                                                                #页面队列

    size=int(size)                                                             #将输入的模块数转化为int型
    for i in range(len(list_input)):                                           #遍历输入的页面队列索引
        if i<size:                                                             #先将空的模块填满
            list_new.append(list_input[i])
            print("原列表有空存储块,直接存入{}页面,现在的序列是:{}".format(i,list_new))



        elif list_input[i] in list_new:                                         #当输入的页面在原来的队列中
            print("不需中断,序列中存在{}页面,现在的序列是:{}".format(i,list_new))
        else:                                                                   #输入的页面不在队列中

            q=list_input[:i]                                                    #先创建已经输入的队列
            q.reverse()                                                         #将已经输入的队列倒叙排列

            list_input_sort=[]                                                  #创建一个新的列表,用于存储去重后的页面序列
            for x in q:
                if x in list_input_sort:                                        #存在在列表中,直接pass
                    pass
                else:
                    list_input_sort.append(x)                                   #如果不存在,直接加入新的列表


            temp=list_input_sort[size-1]                                        #需要被替换的页面

            for n in range(len(list_new)):                                      #在页面中替换掉最早输入的页面
                if temp==list_new[n]:
                    list_new[n]=list_input[i]
            print("页面中断,页面{}被{}替换,现在的序列是:{}".format(temp,list_input[i],list_new))



if __name__=='__main__':
    size=input("请输入存储区域块数:\n")
    LRU_Algorithm(InputList(),size)
    s=input("输入任意退出")

点赞