基於python實現LRU演算法及思路詳情

2021-09-17 01:29:45 字數 2347 閱讀 1378

感謝這位博主解答,搞了很久才弄明白這個問題

# 思路:用列表儲存資料的順序,列表中資料越靠後,表示最新訪問,更新時間越晚

# 最舊資料的key---->最新資料的key

# [data1,data2,data3,data4,...,]

# 完整資料

# '''

# 基於列表&字典實現

class lru:

def __init__(self,capacity):

# 儲存資料的key&value

self.cache = {}

# 儲存資料key,用來排序

self.used_list =

# 限制資料最大條數

self.capacity = capacity

#使用乙個list來記錄資料訪問的順序,最先訪問的資料放在list的前面,最後訪問的資料放在list的後面,所以儲存的資料量(capacity)達到上限時,則刪除排序表中最先訪問(最舊的)的資料list[0],然後插入新項;

def get(self,key):

# 如果訪問的資料在快取列表中,代表曾經訪問過該資料

if key in self.cache:

# 判斷這個訪問的資料是不是最近一次訪問過的,如果不是,就把資料提到列表最後(即最新訪問元素的位置),即刪除原有記錄,再把資料當成最新訪問的新增到列表最後

if key != self.used_list[-1]:

# 把上一次訪問過的該資料清除

self.used_list.remove(key)

# 把當前訪問的資料追加到列表最後

# 修改cache中的資料並返回乙個修改過的真實資料值

return self.cache[key]

else:

# 如果未訪問過該條資料,將呼叫set方法,更新排序列表used_list並更新cache字典完整資料(刪除最舊的,新增當前訪問這條最新的資料),並返回最新新增的資料的值

return self.set()

def set(self,key,value):

# 判斷資料庫要求儲存的資料是否達到上限,如果達到上限,刪除排序列表中的第一位(最舊的資料的key)並且刪除cache中對應的最舊的資料鍵值對

if len(self.cache) == self.capacity:

self.cache.pop(self.used_list.pop(0))

# 然後把當前訪問的資料(最新)的key新增到列表,最新資料鍵值對新增到cache字典中

self.cache[key] = value

return value

'''

import collections

#基於ordereddict實現

class lrucache(collections.ordereddict):

'''利用orderedict特殊的方法popitem(last=false)時則實現佇列,彈出最先(最舊)插入的元素

而當last=true則實現堆疊方法,彈出的是最近(最新)插入的那個元素。

實現了兩個方法:get(key)取出鍵中對應的值,若沒有返回none

set(key,value)更具lru特性新增元素

'''def __init__(self,size=5):

self.size = size

self.cache = collections.ordereddict()#建立乙個空的有序字典

def get(self,key):

if key in self.cache.keys():

# 刪除並獲取到當前訪問的資料的value

value = self.cache.pop(key)

# 重新新增鍵值對來實現orderdict中當前資料設為最近(最新)插入元素

self.cache[key] = value

# 返回最新訪問的資料

return value

else:

# 如果未訪問過該條資料,將呼叫set方法,更新orderdict資料(刪除最舊的,新增當前訪問這條最新的資料),並返回最新新增的資料的值

return set()

def set(self,key,value):

# 判斷資料庫要求儲存的資料是否達到上限,如果達到上限,刪除orderdict中最舊的鍵值對,新增最新資料為鍵值對

if self.size == len(self.cache):

self.cache.popitem(last=false)

self.cache[key] = value

else:

self.cache[key] = value```

python實現LRU演算法

學習mysql資料庫時,了解了一下ib buffer pool的儲存機制,使用lru演算法施行將少用的資料淘汰,儲存使用更頻繁的資料。再基於3.6版本python的字典資料型別改變,想試試新字典預設有序的話能否直接使用於lru演算法。from collections import ordereddi...

LRU演算法實現

jdk 中的實現 在jdk 中linkedhashmap 可以作為lru 演算法以及插入順序的實現,linkedhashmap 繼承自hashmap 底層結合hash 表和雙向鍊錶,元素的插入和查詢等操作通過計算hash 值找到其陣列位置,在做插入或則查詢操作是,將元素插入到鍊錶的表頭 當然得先刪除...

LRU演算法的實現

0 推薦 lru演算法的實現 什麼是lru演算法lru是least recently used的縮寫,即最近最少使用頁面置換演算法,是為虛擬頁式儲存管理服務的.關於作業系統的記憶體管理,如何節省利用容量不大的記憶體為最多的程序提供資源,一直是研究的重要方向.而記憶體的虛擬儲存管理,是現在最通用,最成...