国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Python算法題集_LRU 緩存

這篇具有很好參考價值的文章主要介紹了Python算法題集_LRU 緩存。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

本文為Python算法題集之一的代碼示例

題146:LRU 緩存

1. 示例說明

  • 請你設計并實現(xiàn)一個滿足 LRU (最近最少使用) 緩存 約束的數(shù)據(jù)結構。

    實現(xiàn) LRUCache 類:

    • LRUCache(int capacity)正整數(shù) 作為容量 capacity 初始化 LRU 緩存
    • int get(int key) 如果關鍵字 key 存在于緩存中,則返回關鍵字的值,否則返回 -1 。
    • void put(int key, int value) 如果關鍵字 key 已經(jīng)存在,則變更其數(shù)據(jù)值 value ;如果不存在,則向緩存中插入該組 key-value 。如果插入操作導致關鍵字數(shù)量超過 capacity ,則應該 逐出 最久未使用的關鍵字。

    函數(shù) getput 必須以 O(1) 的平均時間復雜度運行。

    示例:

    輸入
    ["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"]
    [[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]
    輸出
    [null, null, null, 1, null, -1, null, -1, 3, 4]
    
    解釋
    LRUCache lRUCache = new LRUCache(2);
    lRUCache.put(1, 1); // 緩存是 {1=1}
    lRUCache.put(2, 2); // 緩存是 {1=1, 2=2}
    lRUCache.get(1);    // 返回 1
    lRUCache.put(3, 3); // 該操作會使得關鍵字 2 作廢,緩存是 {1=1, 3=3}
    lRUCache.get(2);    // 返回 -1 (未找到)
    lRUCache.put(4, 4); // 該操作會使得關鍵字 1 作廢,緩存是 {4=4, 3=3}
    lRUCache.get(1);    // 返回 -1 (未找到)
    lRUCache.get(3);    // 返回 3
    lRUCache.get(4);    // 返回 4
    

    提示:

    • 1 <= capacity <= 3000
    • 0 <= key <= 10000
    • 0 <= value <= 105
    • 最多調用 2 * 105getput

2. 題目解析

- 題意分解

  1. 本題為設計一個整形緩存類,可以指定緩存大小
  2. 基本的設計思路是采用隊列控制使用次序,字典進行緩存【哈希】

- 優(yōu)化思路

  1. 通常優(yōu)化:減少循環(huán)層次

  2. 通常優(yōu)化:增加分支,減少計算集

  3. 通常優(yōu)化:采用內(nèi)置算法來提升計算速度

  4. 分析題目特點,分析最優(yōu)解

    1. 可以考慮采用有序字典設計緩存類

    2. 可以考慮采用雙向鏈表設計使用隊列,緩存還是采用字典


- 測量工具

  • 本地化測試說明:LeetCode網(wǎng)站測試運行時數(shù)據(jù)波動很大,因此需要本地化測試解決這個問題
  • CheckFuncPerf(本地化函數(shù)用時和內(nèi)存占用測試模塊)已上傳到CSDN,地址:Python算法題集_檢測函數(shù)用時和內(nèi)存占用的模塊
  • 本題本地化超時測試用例自己生成,詳見【最優(yōu)算法章節(jié)】

3. 代碼展開

1) 標準求解【隊列+字典】

隊列控制使用次序,字典保存鍵值對

勉強通關,超過05%Python算法題集_LRU 緩存,Python,python,算法,緩存,LRU,leetcode

import CheckFuncPerf as cfp

class LRUCache_base:
def __init__(self, capacity):
   self.queue, self.dict, self.capacity, self.queuelen = [], {}, capacity, 0
def get(self, key):
   if key in self.queue:
       self.queue.remove(key)
       self.queue.append(key)
       return self.dict[key]
   else:
       return -1
def put(self, key, value):
   if key in self.queue:
       self.queue.remove(key)
   else:
       if self.queuelen == self.capacity:
           self.dict.pop(self.queue.pop(0))
       else:
           self.queuelen += 1
   self.queue.append(key)
   self.dict[key] = valu

tmpLRUCache = LRUCache_base(5)
result = cfp.getTimeMemoryStr(testLRUCache, tmpLRUCache, actions)
print(result['msg'], '執(zhí)行結果 = {}'.format(result['result']))

# 運行結果
函數(shù) testLRUCache 的運行時間為 561.12 ms;內(nèi)存使用量為 4.00 KB 執(zhí)行結果 = 99

2) 改進版一【有序字典】

采用有序字典【Python3.6之后支持】,同時支持使用順序和保存鍵值對

性能卓越,超越93%Python算法題集_LRU 緩存,Python,python,算法,緩存,LRU,leetcode

import CheckFuncPerf as cfp

class LRUCache_ext1:
 def __init__(self, capacity):
     self.data = dict()
     self.capacity = capacity
 def get(self, key):
     keyval = self.data.get(key, -1)
     if keyval != -1:
         self.data.pop(key)
         self.data[key] = keyval
     return keyval
 def put(self, key, value)
     if key in self.data:
         self.data.pop(key)
         self.data[key] = value
     else:
         if len(self.data) < self.capacity:
             self.data[key] = value
         else:
             firstpop = next(iter(self.data))
             self.data.pop(firstpop)
             self.data[key] = value

tmpLRUCache = LRUCache_ext1(5)
result = cfp.getTimeMemoryStr(testLRUCache, tmpLRUCache, actions)
print(result['msg'], '執(zhí)行結果 = {}'.format(result['result']))

# 運行結果
函數(shù) testLRUCache 的運行時間為 420.10 ms;內(nèi)存使用量為 0.00 KB 執(zhí)行結果 = 99

3) 改進版二【雙向鏈表+字典】

采用雙向鏈表維護使用順序,字典保存鍵值對,要首先定義雙向鏈表類

性能卓越,超過92%Python算法題集_LRU 緩存,Python,python,算法,緩存,LRU,leetcode

import CheckFuncPerf as cfp

class ListNodeDouble:
 def __init__(self, key=None, value=None):
     self.key = key
     self.value = value
     self.prev = None
     self.next = None
class LRUCache_ext2:
 def __init__(self, capacity):
     self.capacity = capacity
     self.dict = {}
     self.head = ListNodeDouble()
     self.tail = ListNodeDouble()
     self.head.next = self.tail
     self.tail.prev = self.head
 def move_to_tail(self, key):
     tmpnode = self.dict[key]
     tmpnode.prev.next = tmpnode.next
     tmpnode.next.prev = tmpnode.prev
     tmpnode.prev = self.tail.prev
     tmpnode.next = self.tail
     self.tail.prev.next = tmpnode
     self.tail.prev = tmpnode
 def get(self, key: int):
     if key in self.dict:
         self.move_to_tail(key)
     result = self.dict.get(key, -1)
     if result == -1:
         return result
     else:
         return result.value
 def put(self, key, value):
     if key in self.dict:
         self.dict[key].value = value
         self.move_to_tail(key)
     else:
         if len(self.dict) == self.capacity:
             self.dict.pop(self.head.next.key)
             self.head.next = self.head.next.next
             self.head.next.prev = self.head
         newkeyval = ListNodeDouble(key, value)
         self.dict[key] = newkeyval
         newkeyval.prev = self.tail.prev
         newkeyval.next = self.tail
         self.tail.prev.next = newkeyval
         self.tail.prev = newkeyval

tmpLRUCache = LRUCache_ext2(5)
result = cfp.getTimeMemoryStr(testLRUCache, tmpLRUCache, actions)
print(result['msg'], '執(zhí)行結果 = {}'.format(result['result']))

# 運行結果
函數(shù) testLRUCache 的運行時間為 787.18 ms;內(nèi)存使用量為 0.00 KB 執(zhí)行結果 = 99

4. 最優(yōu)算法

根據(jù)本地日志分析,最優(yōu)算法為第2種方式【有序字典】LRUCache_ext1

def testLRUCache(lrucache, actiions):
    for act in actiions:
        if len(act) > 1:
            lrucache.put(act[0], act[1])
        else:
            lrucache.get(act[0])
    return 99
import random
actions = []
iLen = 1000000
for iIdx in range(10):
    actions.append([iIdx, random.randint(1, 10)])
iturn = 0
for iIdx in range(iLen):
    if iturn >= 2:
        actions.append([random.randint(1,10)])
    else:
        actions.append([random.randint(1,10), random.randint(1, 1000)])
    iturn += 1
    if iturn >= 3:
        iturn = 0
tmpLRUCache = LRUCache_base(5)
result = cfp.getTimeMemoryStr(testLRUCache, tmpLRUCache, actions)
print(result['msg'], '執(zhí)行結果 = {}'.format(result['result']))

# 算法本地速度實測比較
函數(shù) testLRUCache 的運行時間為 561.12 ms;內(nèi)存使用量為 4.00 KB 執(zhí)行結果 = 99
函數(shù) testLRUCache 的運行時間為 420.10 ms;內(nèi)存使用量為 0.00 KB 執(zhí)行結果 = 99
函數(shù) testLRUCache 的運行時間為 787.18 ms;內(nèi)存使用量為 0.00 KB 執(zhí)行結果 = 99

一日練,一日功,一日不練十日空

may the odds be ever in your favor ~文章來源地址http://www.zghlxwxcb.cn/news/detail-832017.html

到了這里,關于Python算法題集_LRU 緩存的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【LeetCode刷題-鏈表】--146.LRU緩存

    【LeetCode刷題-鏈表】--146.LRU緩存

    方法一:哈希表+雙向鏈表 使用一個哈希表和一個雙向鏈表維護所有在緩存中的鍵值對 雙向鏈表按照被使用的順序存儲了這些鍵值對,靠近頭部的鍵值對是最近使用的,而靠近尾部的鍵值對是最久使用的 哈希表即為普通的哈希映射,通過緩存數(shù)據(jù)的鍵映射到其在雙向鏈表中的

    2024年02月05日
    瀏覽(47)
  • 【LeetCode-中等題】146. LRU 緩存

    【LeetCode-中等題】146. LRU 緩存

    LRU緩存是什么:LRU緩存機制,你想知道的這里都有 實現(xiàn) LRU 緩存算法 map —key存 integer value存鏈表節(jié)點 ListNode 存 next 和prev 引用 以及 存 key 和value 具體值 圖解:官方圖解 步驟: 定義一個自定義的雙向鏈表節(jié)點類 DLinkedNode,該類包含 key 和 value 字段,并且具有 prev 和 next 指針

    2024年02月10日
    瀏覽(30)
  • leetcode做題筆記146. LRU 緩存

    請你設計并實現(xiàn)一個滿足??LRU (最近最少使用) 緩存?約束的數(shù)據(jù)結構。 實現(xiàn)? LRUCache ?類: LRUCache(int capacity) ?以? 正整數(shù) ?作為容量? capacity ?初始化 LRU 緩存 int get(int key) ?如果? key ?存在于緩存中,則返回的值,否則返回? -1 ?。 void put(int key, int value) ?如果

    2024年02月07日
    瀏覽(26)
  • Leetcode 146. LRU 緩存(Hashmap+雙鏈表)

    請你設計并實現(xiàn)一個滿足 LRU (最近最少使用) 緩存 約束的數(shù)據(jù)結構。 實現(xiàn) LRUCache 類: ● LRUCache(int capacity) 以 正整數(shù) 作為容量 capacity 初始化 LRU 緩存 ● int get(int key) 如果 key 存在于緩存中,則返回的值,否則返回 -1 。 ● void put(int key, int value) 如果 key 已

    2024年02月16日
    瀏覽(34)
  • Python算法題集_兩數(shù)之和

    本文為Python算法題集之一的代碼示例 題目1:兩數(shù)之和 說明:給定一個整數(shù)列表(數(shù)值不重復) nums 和一個整數(shù)目標值 target,請在該數(shù)組中找出和為目標值 target 的整數(shù)對,并返回數(shù)組下標對 簡單版【只有一個兩數(shù)和等于目標值】 加強版【有多個兩數(shù)和等于目標值】 一日練

    2024年01月23日
    瀏覽(19)
  • Python算法題集_字母異位詞分組

    本文為Python算法題集之一的代碼示例 題目49:字母異位詞分組 說明:給你一個字符串數(shù)組,請你將 字母異位詞 組合在一起,可以按任意順序返回結果列表 字母異位詞 :是由重新排列原單詞所有字母得到的新單詞 使用同步數(shù)組 list 和檢索集合 set 使用同步數(shù)組 list 和結果數(shù)

    2024年01月20日
    瀏覽(39)
  • 【leetcode100-035】【鏈表/哈希鏈表】LRU緩存

    【題干】 請你設計并實現(xiàn)一個滿足??LRU (最近最少使用) 緩存?約束的數(shù)據(jù)結構。 實現(xiàn)? LRUCache ?類: LRUCache(int capacity) ?以? 正整數(shù) ?作為容量? capacity ?初始化 LRU 緩存 int get(int key) ?如果? key ?存在于緩存中,則返回的值,否則返回? -1 ?。 void put(int key, in

    2024年02月01日
    瀏覽(57)
  • LeetCode講解篇之面試題 16.25. LRU 緩存

    設計和構建一個“最近最少使用”緩存,該緩存會刪除最近最少使用的項目。緩存應該從鍵映射到值(允許你插入和檢索特定鍵對應的值),并在初始化時指定最大容量。當緩存被填滿時,它應該刪除最近最少使用的項目。 它應該支持以下操作: 獲取數(shù)據(jù) get 和 寫入數(shù)據(jù) put 。

    2024年02月09日
    瀏覽(26)
  • 二刷LeetCode--146.LRU緩存(C++版本),必會題目

    本題思路:因為需要記錄元素的出入順序,并且每次訪問之后需要將該節(jié)點提到最前面,因此需要使用雙向鏈表(單鏈表不方便刪除操作),而為了可以在常量時間復雜度內(nèi)找到對應的元素,我們需要使用哈希表,將每一個插入的元素在哈希表中進行記錄.哈希表的key就是插入的key,而哈希

    2024年02月13日
    瀏覽(22)
  • [力扣146. LRU 緩存 ](https://leetcode.cn/problems/lru-cache/description/)

    力扣146. LRU 緩存 使用LinkedHashmap(HashMap的子類,能夠記住插入數(shù)據(jù)的順序). LRU是Lease Recently User的縮寫,意思是最近 最少使用。比如設計一個文件緩存系統(tǒng),每個文件有自己的大小和訪問時間,文件緩存系統(tǒng)有總的大小,當往這個文件系統(tǒng)中放入新的文件時,如果發(fā)現(xiàn)超出文件

    2024年02月11日
    瀏覽(54)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包