国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

小林手撕 LRU 算法!

開發 前端 算法
如果采用暴力遍歷所有主機的方式來找到超時的主機,在面對只有幾百臺主機的場景是沒問題,但是這個算法會隨著主機越多,算法復雜度也會上升,程序的性能也就會急劇下降。

[[411501]]

本文轉載自微信公眾號「小林coding」,作者小林coding。轉載本文請聯系小林coding公眾號。

大家好,我是小林。

前幾天,我寫一篇感受計算機基礎之美的文章:堅持一年了

里面介紹了個心跳服務的宕機判斷算法,當時只是理論分析了下使用 LRU 算法來實現,沒有手撕代碼。

今天,就帶大家手撕 LRU 算法,先讓大家回顧下案例,然后后面就進行代碼講解。

宕機判斷算法的設計

心跳服務主要做兩件事情:

  • 發現宕機的主機;
  • 發現上線的主機。

這個心跳服務最關鍵是判斷宕機的算法。

如果采用暴力遍歷所有主機的方式來找到超時的主機,在面對只有幾百臺主機的場景是沒問題,但是這個算法會隨著主機越多,算法復雜度也會上升,程序的性能也就會急劇下降。

所以,我們應該設計一個可以應對超大集群規模的宕機判斷算法。

我們先來思考下,心跳包應該有什么數據結構來管理?

心跳包里的內容是有主機上報的時間信息的,也就是有時間關系的,那么可以用「雙向鏈表」構成先入先出的隊列,這樣就保存了心跳包的時序關系。

由于采用的數據結構是雙向鏈表,所以隊尾插入和隊頭刪除操作的時間復雜度是 O(1)。

如果有新的心跳包,則將其插入到雙向鏈表的尾部,那么最老的心跳包就是在雙向鏈表的頭部,這樣在尋找宕機的主機時,只要看雙向鏈表頭部最老的心跳包,距現在是否超過 5 秒,如果超過 5秒 則認為該主機宕機,然后將其從雙向鏈表中刪除。

細心的同學肯定發現了個問題,就是如果一個主機的心跳包已經在隊列中,那么下次該主機的心跳包要怎么處理呢?

為了維持隊列里的心跳包是主機最新上報的,所以要先找到該主機舊的心跳包,然后將其刪除,再把新的心跳包插入到雙向鏈表的隊尾。

問題來了,在隊列找到該主機舊的心跳包,由于數據結構是雙向鏈表,所以這個查詢過程的時間復雜度時 O(N),也就是說隨著隊列里的元素越多,會越影響程序的性能,這一點我們必須優化。

查詢效率最好的數據結構就是「哈希表」了,時間復雜度只有 O(1),因此我們可以加入這個數據結構來優化。

哈希表的 Key 是主機的 IP 地址,Value 包含主機在雙向鏈表里的節點,這樣我們就可以通過哈希表輕松找到該主機在雙向鏈表中的位置。

這樣,每當收到心跳包時,先判斷其在不在哈希表里。

  • 如果不存在哈希表里,說明是新主機上線,先將其插入到雙向鏈表的尾部,然后將該主機的 IP 作為 Key,主機在雙向鏈表的節點作為 Value 插入到哈希表。
  • 如果存在哈希表里,說明主機已經上線過,先通過查詢哈希表,找到該主機在雙向鏈表里舊的心跳包的節點,然后就可以通過該節點將其從雙向鏈表中刪除,最后將新的心跳包插入到雙向鏈表的隊尾,同時更新哈希表。

可以看到,上面這些操作全都是 O(1),不管集群規模多大,時間復雜度都不會增加,但是代價就是內存占用會越多,這個就是以空間換時間的方式。

有個細節的問題,不知道大家發現了沒有,就是為什么隊列的數據結構采用雙向鏈表,而不是單向鏈表?

因為雙向鏈表比單向鏈表多了個 pre 的指針,可以通過其找到上一個節點,那么在刪除中間節點的時候,就可以直接刪除,而如果是單向鏈表在刪除中間的時候,我們得先通過遍歷找到需被刪除節點的上一個節點,才能完成刪除操作,這里中間多了個遍歷操作。

既然引入哈希表,那我們在判斷出有主機宕機了(檢查雙向鏈表隊頭的主機是否超時),除了要將其從雙向鏈表中刪除,也要從哈希表中刪除。

要將主機從哈希表刪除,首先我們要知道主機的 IP,因為這是哈希表的 Key。

雙向鏈表存儲的內容必須包含主機的 IP 信息,那為了更快查詢到主機的 IP,雙向鏈表存儲的內容可以是一個鍵值對(Key-Value),其 Key 就是主機的 IP,Value 就是主機的信息。

這樣,在發現雙向鏈表中頭部的節點超時了,由于節點的內容是鍵值對,于是就能快速地從該節點獲取主機的 IP ,知道了主機的 IP 信息,就能把哈希表中該主機信息刪除。

至此,就設計出了一個高性能的宕機判斷算法,主要用了數據結構:哈希表 + 雙向鏈表,通過這個組合,查詢 + 刪除 + 插入操作的時間復雜度都是 O(1),以空間換時間的思想,這就是數據結構與算法之美!

熟悉算法的同學應該感受出來了,上面這個算法就是類 LRU 算法,用于淘汰最近最久使用的元素的場景,該算法應用范圍很廣的,操作系統、Redis、MySQL 都有使用該算法。

手撕 LRU 算法

在很多大廠面試的時候,經常會考察 LRU 算法,甚至會要求手寫出來,之前就有朋友在面試鵝廠的時候,當初就要手寫 LRU 算法。

今天,就帶大家用 C++ 語言手撕 LRU 算法,我們就采用上面討論的「哈希表 + 雙向鏈表」這兩個數據結構來實現該算法。

為了要實現 LRU 算法, 鏈表的隊頭要保持是最近訪問或者新加入的數據,鏈表的隊尾要保持是最久未被訪問的,這樣我們在淘汰最久未訪問的時候會很簡單,然后哈希表用于快速查找節點。

雙向鏈表,存放的內容是鍵值對。

  1. typedef std::pair<int key, std::string value> Pair; 
  2. typedef std::list<Pair> List; 

哈希表,存放的是鏈表節點。

  1. typedef std::map<int key, typename List::iterator> Map; 

知道了數據結構后,然后實現兩個函數,分別是 put 用于加入數據,get 用戶獲取數據,

我這里定義了個 LRUCache 模板類,如下:

接下來,看看存放數據的 put 方法實現的方式,如下:

說一下 put 方法的實現思路。

首先,通過哈希表查找是否存在該 Key:

  • 如果存在則表示有老數據,那么就需要將老數據先從鏈表和哈希表里刪除,然后再將新的數據重新加入到鏈表的隊頭,同時該鏈表節點存放到哈希表里,這樣鏈表里就維護了該 key 數據是最熱的。
  • 如果哈希表不存在該 Key,則認為是新的數據,直接將其加入到鏈表的隊頭,并把該鏈表節點更新到哈希表里。

接著,檢查鏈表的元素大小是否超過了 LRU 容量,如果超過了,就要將鏈表的隊尾元素移除,同時也將該節點從哈希表中刪除。

然后,我們再來看看 get 方法的實現方式,如下:

首先先在哈希表中查找是否存在該 key:

  • 如果不存在,則返回 false;
  • 如果存在,則鏈表要將數據刪除,然后再數據加入到鏈表隊頭,目的是為了維持鏈表隊頭是最近訪問的數據。

主要的兩個函數已經介紹完了,這里貼一下整個實現的代碼:

接下來跑一下測試用例。

創建了一個容量為 3 的 LRUCache 對象,然后使用 put 函數加入 3 組 key-value,這時鏈表的順序是 key:3(隊頭) -> key:2 -> key:1(隊尾)。

然后通過 get 訪問 key:1 的元素,這時鏈表的順序變為 key:1(隊頭) -> key:3 -> key:2(隊尾)。

接著,put 加入 key:4 元素,由于鏈表的大小超過了定義的 LRUCache 的容量,于是就會移除隊尾的元素,也就是 key:2。

最后看到,就無法訪問 key:2 元素的了,運行結果如下。

好了,LRU 算法手撕就到了啦。

我是小林,今天你比昨天更博學了嗎?

 

責任編輯:武曉燕 來源: 小林coding
相關推薦

2020-09-15 08:55:07

算法數據基礎

2021-10-31 07:38:37

排序算法代碼

2021-09-06 08:13:35

APM系統監控

2024-12-03 16:49:58

2020-09-17 14:04:32

拷貝

2020-09-16 14:17:42

flat方法

2023-09-18 09:10:11

Golang高性能緩存庫

2020-05-15 17:05:51

Oracle數據庫LRU算法

2019-12-24 10:32:01

OracleLRU臟塊

2022-06-17 07:49:14

緩存LRU

2020-09-18 10:31:47

LRU算法數組

2021-06-09 07:01:30

前端CallApply

2022-05-09 19:59:15

RedisLRU 算法

2021-09-05 18:29:58

Linux內存回收

2020-02-19 19:18:02

緩存查詢速度淘汰算法

2015-11-06 11:02:24

微信羅素生活

2021-05-18 07:52:31

PromiseAsyncAwait

2024-08-06 10:16:52

Java AgentJava

2022-04-27 09:40:25

抓包圖四次揮手TCP

2025-08-18 01:11:00

String類快手C++
點贊
收藏

51CTO技術棧公眾號

日韩在线观看免费高清| 国产欧美精品区一区二区三区| 欧美日韩激情在线| 亚洲综合精品一区二区| 无线免费在线视频| 操欧美老女人| 136国产福利精品导航| 成人黄在线观看| 国产精品一区二区久久久| 久久伊人一区二区| 成人免费福利视频| 久久一区二区三区欧美亚洲| 熟妇人妻无乱码中文字幕真矢织江 | 国产免费黄视频在线观看| 亚洲欧美另类图片| 99国产精品| 狠狠色噜噜狠狠狠狠97| 一区二区亚洲欧洲国产日韩| 久久综合给合久久狠狠色| 色中色在线视频| 九一精品国产| 国产伦精品一区二区三区免费| 午夜精品国产更新| 久久久久久国产| 99热在线播放| 国内在线视频| 美女久久一区| 日韩精品一区二区三区视频在线观看 | gogogo免费高清日本写真| 原千岁中文字幕| 99热国内精品| 欧美性猛交xxxx富婆| 国产精品大全| 亚洲无毛电影| 国产伦精品一区二区三| 动漫3d精品一区二区三区乱码| 一区二区三区丝袜| 91精彩视频在线播放| 久久久国产精品午夜一区ai换脸| 中文字幕视频在线| 久久五月天综合| 精品嫩模一区二区三区| 国产日韩1区| 亚洲第一福利网站| 国产精品99999| 国产精品久久久久久久久免费樱桃| 欧美日韩一区在线播放| 国产在线精品一区二区夜色 | 欧美亚洲国产一区在线观看网站 | 天天色图综合网| 91精品国产91| 青草国产精品| 中文字幕av一区| 国产另类在线| 亚洲成人自拍视频| 亚洲永久精品大片| 精品国模一区二区三区| 91网在线免费观看| 国产人妖乱国产精品人妖| 福利写真视频网站在线| 91免费视频国产| 色综合天天综合网天天看片| 日韩一区二区三区精品| 无码日本精品xxxxxxxxx| 精品国产髙清在线看国产毛片| 久久a爱视频| 福利视频一二区| 亚洲欧洲在线观看| 国产综合成人久久大片91| 欧美一区二区少妇| 成人国产精品一区| 亚洲一区在线观看网站| 欧美先锋资源| 国产成人无码精品久久久性色| 欧美视频一区二| 欧美成人首页| 91官网在线| 国产一区二区不卡视频| 综合欧美一区二区三区| 91九色鹿精品国产综合久久香蕉| 日本一本中文字幕| 国模吧一区二区| 欧美视频中文在线看| 欧美日韩国产在线观看网站 | www.成人网.com| 粉嫩一区二区三区在线观看| 熟妇人妻va精品中文字幕| 国产精品白嫩美女在线观看| 色妹子一区二区| 国产精品1区二区.| 日韩三级电影视频| 亚洲精品一区二区三区四区五区 | 中文字幕毛片| 国产精品激情av在线播放| 国产精品国产三级国产普通话蜜臀 | 亚洲a∨日韩av高清在线观看| 色老头视频在线观看| 国产主播喷水一区二区| 欧美大胆一级视频| 99爱在线视频| 国产天堂视频在线观看| 97在线看免费观看视频在线观看| 亚洲午夜精品在线| 国产乱码精品一区二区三区忘忧草| 免费精品一区二区三区在线观看| 开心丁香婷婷深爱五月| 欧美高清视频一区| 日韩欧美亚洲范冰冰与中字| 日韩毛片在线| 亚洲精品一区二区三区99| 免费成人黄色| 国产精品久久久久久久久| 日韩国产一区二| 日本免费高清视频| 久久天堂av综合合色| 高清在线不卡av| 美国成人xxx| 黄动漫视频高清在线| 91精品婷婷国产综合久久蝌蚪| 色综合久久久久综合一本到桃花网| 欧美精品二区| 成年网站在线播放| 国产亚洲在线播放| 国内久久婷婷综合| 欧美成人精品一区二区男人看| 97久久精品视频| 26uuu另类欧美| 国产91精品对白在线播放| 成人18免费| 成人免费看黄网站| 日韩欧美国产精品一区| 久久精品二区亚洲w码| 成人国产精品| 妞干网2018| 日韩网站免费观看高清| 日韩黄色大片| 国产免费人做人爱午夜视频| 尤物tv国产一区| 99热99精品| 国产精品a久久久久| 爱搞国产精品| 国产精品va无码一区二区| 欧美精品激情视频| 欧美日韩中文在线| 国内成人免费视频| 国产三级精品三级在线观看国产| 黄色网页在线免费看| 夜级特黄日本大片_在线| 九色porny丨入口在线| 欧美色网在线| 国产二区视频在线观看| 婷婷亚洲天堂| 国产成人永久免费视频| 2019国产精品视频| 国产91精品青草社区| 久久99精品国产99久久6尤物| 亚洲美女av网站| 亚洲成人免费在线观看| 中文字幕国产一区二区| 中文字幕一区二区三区精华液| 99久久精品国产导航| 久久亚洲一区二区三区四区| av午夜精品一区二区三区| 99久久夜色精品国产网站| 成人av激情人伦小说| 日韩伦理在线观看| 无码人妻丰满熟妇区96| 久久99久久精品国产| 日本人成精品视频在线| 日韩精品在线观看视频| 日本韩国一区二区三区视频| 成人精品小蝌蚪| 蜜桃视频在线一区| 欧美a一区二区| 国产精品日本| 88国产精品视频一区二区三区| 免费萌白酱国产一区二区三区| 在线看片福利| 成人区精品一区二区不卡| 99re6在线精品视频免费播放| 三上悠亚在线一区二区| 亚洲v欧美v另类v综合v日韩v| 在线观看国产欧美| 玉足女爽爽91| 91麻豆.com| 中文字幕国产一区| 亚洲欧洲中文日韩久久av乱码| 久久蜜臀中文字幕| 成人黄色国产精品网站大全在线免费观看| 另类小说视频一区二区| 欧美日韩激情| 女同性一区二区三区人了人一| 欧美欧美在线| 福利视频一区| 国产精品亲子伦av一区二区三区| 第84页国产精品| 亚欧洲精品视频在线观看| 欧美特黄aaaaaaaa大片| 亚洲91视频| 色噜噜国产精品视频一区二区|