感謝這位博主解答,搞了很久才弄明白這個問題
# 思路:用列表儲存資料的順序,列表中資料越靠後,表示最新訪問,更新時間越晚
# 最舊資料的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的縮寫,即最近最少使用頁面置換演算法,是為虛擬頁式儲存管理服務的.關於作業系統的記憶體管理,如何節省利用容量不大的記憶體為最多的程序提供資源,一直是研究的重要方向.而記憶體的虛擬儲存管理,是現在最通用,最成...