FIFO
最簡單的一種快取演算法,設定快取上限,當達到了快取上限的時候,按照先進先出的策略進行淘汰,再增加進新的k-v 。
使用了一個物件作為緩存,一個陣列配合著記錄加入進物件時的順序,判斷是否到達上限,若到達上限取數組中的第一個元素key,對應刪除物件中的鍵值。
/** * FIFO队列算法实现缓存 * 需要一个对象和一个数组作为辅助 * 数组记录进入顺序 */ class FifoCache{ constructor(limit){ this.limit = limit || 10 this.map = {} this.keys = [] } set(key,value){ let map = this.map let keys = this.keys if (!Object.prototype.hasOwnProperty.call(map,key)) { if (keys.length === this.limit) { delete map[keys.shift()]//先进先出,删除队列第一个元素 } keys.push(key) } map[key] = value//无论存在与否都对map中的key赋值 } get(key){ return this.map[key] } } module.exports = FifoCache
LRU
LRU(Least recently used,最近最少使用)演算法。該演算法的觀點是,最近被存取的資料那麼它將來訪問的機率就大,緩存滿的時候,優先淘汰最無人問津者。
演算法實現想法:基於雙鍊錶的資料結構,在沒有滿員的情況下,新來的k-v 放在鍊錶的頭部,以後每次獲取緩存中的k-v 時就將該k-v移到最前面,緩存滿的時候優先淘汰末尾的。
雙向鍊錶的特點,具有頭尾指針,每個節點都有 prev(前驅) 和 next(後繼) 指針分別指向他的前一個和後一個節點。
關鍵點:在雙鍊錶的插入過程中要注意順序問題,一定是在保持鍊錶不斷的情況下先處理指針,最後才將原頭指針指向新插入的元素,在代碼的實現中請注意看我在註釋中說明的順序注意點!
class LruCache { constructor(limit) { this.limit = limit || 10 //head 指针指向表头元素,即为最常用的元素 this.head = this.tail = undefined this.map = {} this.size = 0 } get(key, IfreturnNode) { let node = this.map[key] // 如果查找不到含有`key`这个属性的缓存对象 if (node === undefined) return // 如果查找到的缓存对象已经是 tail (最近使用过的) if (node === this.head) { //判断该节点是不是是第一个节点 // 是的话,皆大欢喜,不用移动元素,直接返回 return returnnode ? node : node.value } // 不是头结点,铁定要移动元素了 if (node.prev) { //首先要判断该节点是不是有前驱 if (node === this.tail) { //有前驱,若是尾节点的话多一步,让尾指针指向当前节点的前驱 this.tail = node.prev } //把当前节点的后继交接给当前节点的前驱去指向。 node.prev.next = node.next } if (node.next) { //判断该节点是不是有后继 //有后继的话直接让后继的前驱指向当前节点的前驱 node.next.prev = node.prev //整个一个过程就是把当前节点拿出来,并且保证链表不断,下面开始移动当前节点了 } node.prev = undefined //移动到最前面,所以没了前驱 node.next = this.head //注意!!! 这里要先把之前的排头给接到手!!!!让当前节点的后继指向原排头 if (this.head) { this.head.prev = node //让之前的排头的前驱指向现在的节点 } this.head = node //完成了交接,才能执行此步!不然就找不到之前的排头啦! return IfreturnNode ? node : node.value } set(key, value) { // 之前的算法可以直接存k-v但是现在要把简单的 k-v 封装成一个满足双链表的节点 //1.查看是否已经有了该节点 let node = this.get(key, true) if (!node) { if (this.size === this.limit) { //判断缓存是否达到上限 //达到了,要删最后一个节点了。 if (this.tail) { this.tail = this.tail.prev this.tail.prev.next = undefined //平滑断链之后,销毁当前节点 this.tail.prev = this.tail.next = undefined this.map[this.tail.key] = undefined //当前缓存内存释放一个槽位 this.size-- } node = { key: key } this.map[key] = node if(this.head){//判断缓存里面是不是有节点 this.head.prev = node node.next = this.head }else{ //缓存里没有值,皆大欢喜,直接让head指向新节点就行了 this.head = node this.tail = node } this.size++//减少一个缓存槽位 } } //节点存不存在都要给他重新赋值啊 node.value = value } } module.exports = LruCache
具體的想法就是如果所要get的節點不是頭結點(即已經是最近使用的節點了,不需要移動節點位置)要先進行平滑的斷鍊操作,處理好指針指向的關係,拿出需要移動到最前面的節點,進行鍊錶的插入操作。
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
以上是FIFO/LRU實作快取演算法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

特斯拉是一个典型的AI公司,过去一年训练了75000个神经网络,意味着每8分钟就要出一个新的模型,共有281个模型用到了特斯拉的车上。接下来我们分几个方面来解读特斯拉FSD的算法和模型进展。01 感知 Occupancy Network特斯拉今年在感知方面的一个重点技术是Occupancy Network (占据网络)。研究机器人技术的同学肯定对occupancy grid不会陌生,occupancy表示空间中每个3D体素(voxel)是否被占据,可以是0/1二元表示,也可以是[0, 1]之间的

译者 | 朱先忠审校 | 孙淑娟在我之前的博客中,我们已经了解了如何使用因果树来评估政策的异质处理效应。如果你还没有阅读过,我建议你在阅读本文前先读一遍,因为我们在本文中认为你已经了解了此文中的部分与本文相关的内容。为什么是异质处理效应(HTE:heterogenous treatment effects)呢?首先,对异质处理效应的估计允许我们根据它们的预期结果(疾病、公司收入、客户满意度等)选择提供处理(药物、广告、产品等)的用户(患者、用户、客户等)。换句话说,估计HTE有助于我

译者 | 朱先忠审校 | 孙淑娟引言模型超参数(或模型设置)的优化可能是训练机器学习算法中最重要的一步,因为它可以找到最小化模型损失函数的最佳参数。这一步对于构建不易过拟合的泛化模型也是必不可少的。优化模型超参数的最著名技术是穷举网格搜索和随机网格搜索。在第一种方法中,搜索空间被定义为跨越每个模型超参数的域的网格。通过在网格的每个点上训练模型来获得最优超参数。尽管网格搜索非常容易实现,但它在计算上变得昂贵,尤其是当要优化的变量数量很大时。另一方面,随机网格搜索是一种更快的优化方法,可以提供更好的

导读:因果推断是数据科学的一个重要分支,在互联网和工业界的产品迭代、算法和激励策略的评估中都扮演者重要的角色,结合数据、实验或者统计计量模型来计算新的改变带来的收益,是决策制定的基础。然而,因果推断并不是一件简单的事情。首先,在日常生活中,人们常常把相关和因果混为一谈。相关往往代表着两个变量具有同时增长或者降低的趋势,但是因果意味着我们想要知道对一个变量施加改变的时候会发生什么样的结果,或者说我们期望得到反事实的结果,如果过去做了不一样的动作,未来是否会发生改变?然而难点在于,反事实的数据往往是

SimCLR(Simple Framework for Contrastive Learning of Representations)是一种学习图像表示的自监督技术。 与传统的监督学习方法不同,SimCLR 不依赖标记数据来学习有用的表示。 它利用对比学习框架来学习一组有用的特征,这些特征可以从未标记的图像中捕获高级语义信息。SimCLR 已被证明在各种图像分类基准上优于最先进的无监督学习方法。 并且它学习到的表示可以很容易地转移到下游任务,例如对象检测、语义分割和小样本学习,只需在较小的标记

一、盒马供应链介绍1、盒马商业模式盒马是一个技术创新的公司,更是一个消费驱动的公司,回归消费者价值:买的到、买的好、买的方便、买的放心、买的开心。盒马包含盒马鲜生、X 会员店、盒马超云、盒马邻里等多种业务模式,其中最核心的商业模式是线上线下一体化,最快 30 分钟到家的 O2O(即盒马鲜生)模式。2、盒马经营品类介绍盒马精选全球品质商品,追求极致新鲜;结合品类特点和消费者购物体验预期,为不同品类选择最为高效的经营模式。盒马生鲜的销售占比达 60%~70%,是最核心的品类,该品类的特点是用户预期时

10 月 5 日,AlphaTensor 横空出世,DeepMind 宣布其解决了数学领域 50 年来一个悬而未决的数学算法问题,即矩阵乘法。AlphaTensor 成为首个用于为矩阵乘法等数学问题发现新颖、高效且可证明正确的算法的 AI 系统。论文《Discovering faster matrix multiplication algorithms with reinforcement learning》也登上了 Nature 封面。然而,AlphaTensor 的记录仅保持了一周,便被人类

1.线性回归线性回归(Linear Regression)可能是最流行的机器学习算法。线性回归就是要找一条直线,并且让这条直线尽可能地拟合散点图中的数据点。它试图通过将直线方程与该数据拟合来表示自变量(x 值)和数值结果(y 值)。然后就可以用这条线来预测未来的值!这种算法最常用的技术是最小二乘法(Least of squares)。这个方法计算出最佳拟合线,以使得与直线上每个数据点的垂直距离最小。总距离是所有数据点的垂直距离(绿线)的平方和。其思想是通过最小化这个平方误差或距离来拟合模型。例如


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具