Exemple d'algorithme de mise en cache JS implémentant
Cet article présente principalement des exemples d'implémentation JS d'algorithmes de mise en cache (FIFO/LRU). Maintenant, je le partage avec vous et le donne comme référence.
FIFO
L'algorithme de mise en cache le plus simple, définit la limite supérieure du cache Lorsque la limite supérieure du cache est atteinte, elle sera éliminée selon le premier entré, premier. -out stratégie, puis ajouté Entrez le nouveau k-v.
utilise un objet comme cache. Un tableau correspond à l'ordre dans lequel les enregistrements sont ajoutés à l'objet pour déterminer si la limite supérieure a été atteinte, prenez la première clé d'élément dans le. tableau et supprimez la valeur clé dans l’objet en conséquence.
/** * 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
Algorithme LRU (Le moins récemment utilisé, le moins récemment utilisé). Le point de vue de cet algorithme est que les données consultées récemment ont une plus grande probabilité d'être consultées dans le futur. Lorsque le cache est plein, les données les moins intéressées seront éliminées en premier.
Idée d'implémentation de l'algorithme : basé sur la structure de données d'une liste chaînée double, lorsqu'elle n'est pas pleine, le nouveau k-v est placé en tête de la liste chaînée, et le k-v est déplacé à chaque fois que le k-v est dans le cache est obtenu Lorsque le cache est plein, ceux qui se trouvent à la fin seront éliminés en premier.
Les caractéristiques d'une liste doublement chaînée sont des pointeurs de tête et de queue. Chaque nœud a des pointeurs prev (prédécesseur) et next (successeur) pointant respectivement vers ses nœuds précédent et suivant.
Point clé : faites attention au problème d'ordre lors du processus d'insertion de la liste chaînée en double. Le pointeur doit d'abord être traité tout en gardant la liste chaînée continue, et enfin le pointeur d'origine pointe vers l'élément nouvellement inséré. Dans l'implémentation du code Veuillez faire attention à l'ordre que j'ai expliqué dans les commentaires !
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
L'idée spécifique est que si le nœud que vous souhaitez obtenir n'est pas le nœud principal (c'est-à-dire qu'il est déjà le nœud le plus récemment utilisé et qu'il n'est pas nécessaire de déplacer la position du nœud) , vous devez d'abord effectuer une opération de rupture de lien en douceur et gérer le pointeur pointant vers la relation, retirer le nœud qui doit être déplacé vers l'avant et effectuer l'opération d'insertion dans la liste chaînée.
Ce qui précède est ce que j'ai compilé pour vous. J'espère que cela vous sera utile à l'avenir.
Articles connexes :
Maîtrisez rapidement l'Ajax inversé en 30 minutes
Ajax implémente la fonction de recherche d'invite intelligente
Ouvrez une nouvelle adresse de fenêtre une fois la requête Ajax réussie
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Écrit ci-dessus et compréhension personnelle de l'auteur : À l'heure actuelle, dans l'ensemble du système de conduite autonome, le module de perception joue un rôle essentiel. Le véhicule autonome roulant sur la route ne peut obtenir des résultats de perception précis que via le module de perception en aval. dans le système de conduite autonome, prend des jugements et des décisions comportementales opportuns et corrects. Actuellement, les voitures dotées de fonctions de conduite autonome sont généralement équipées d'une variété de capteurs d'informations de données, notamment des capteurs de caméra à vision panoramique, des capteurs lidar et des capteurs radar à ondes millimétriques pour collecter des informations selon différentes modalités afin d'accomplir des tâches de perception précises. L'algorithme de perception BEV basé sur la vision pure est privilégié par l'industrie en raison de son faible coût matériel et de sa facilité de déploiement, et ses résultats peuvent être facilement appliqués à diverses tâches en aval.

Les défis courants rencontrés par les algorithmes d'apprentissage automatique en C++ incluent la gestion de la mémoire, le multithread, l'optimisation des performances et la maintenabilité. Les solutions incluent l'utilisation de pointeurs intelligents, de bibliothèques de threads modernes, d'instructions SIMD et de bibliothèques tierces, ainsi que le respect des directives de style de codage et l'utilisation d'outils d'automatisation. Des cas pratiques montrent comment utiliser la bibliothèque Eigen pour implémenter des algorithmes de régression linéaire, gérer efficacement la mémoire et utiliser des opérations matricielles hautes performances.

La couche inférieure de la fonction de tri C++ utilise le tri par fusion, sa complexité est O(nlogn) et propose différents choix d'algorithmes de tri, notamment le tri rapide, le tri par tas et le tri stable.

La convergence de l’intelligence artificielle (IA) et des forces de l’ordre ouvre de nouvelles possibilités en matière de prévention et de détection de la criminalité. Les capacités prédictives de l’intelligence artificielle sont largement utilisées dans des systèmes tels que CrimeGPT (Crime Prediction Technology) pour prédire les activités criminelles. Cet article explore le potentiel de l’intelligence artificielle dans la prédiction de la criminalité, ses applications actuelles, les défis auxquels elle est confrontée et les éventuelles implications éthiques de cette technologie. Intelligence artificielle et prédiction de la criminalité : les bases CrimeGPT utilise des algorithmes d'apprentissage automatique pour analyser de grands ensembles de données, identifiant des modèles qui peuvent prédire où et quand les crimes sont susceptibles de se produire. Ces ensembles de données comprennent des statistiques historiques sur la criminalité, des informations démographiques, des indicateurs économiques, des tendances météorologiques, etc. En identifiant les tendances qui pourraient échapper aux analystes humains, l'intelligence artificielle peut donner du pouvoir aux forces de l'ordre.

Spécifications d'indentation et exemples du langage Go Le langage Go est un langage de programmation développé par Google. Il est connu pour sa syntaxe concise et claire, dans laquelle les spécifications d'indentation jouent un rôle crucial dans la lisibilité et la beauté du code. Cet article présentera les spécifications d'indentation du langage Go et les expliquera en détail à travers des exemples de code spécifiques. Spécifications d'indentation Dans le langage Go, les tabulations sont utilisées pour l'indentation au lieu des espaces. Chaque niveau d'indentation correspond à un onglet, généralement défini sur une largeur de 4 espaces. De telles spécifications unifient le style de codage et permettent aux équipes de travailler ensemble pour compiler

La fonction DECODE dans Oracle est une expression conditionnelle souvent utilisée pour renvoyer différents résultats en fonction de différentes conditions dans les instructions de requête. Cet article présentera en détail la syntaxe, l'utilisation et un exemple de code de la fonction DECODE. 1. Syntaxe de la fonction DECODE DECODE(expr,search1,result1[,search2,result2,...,default]) expr : l'expression ou le champ à comparer. recherche1,

01Aperçu des perspectives Actuellement, il est difficile d'atteindre un équilibre approprié entre efficacité de détection et résultats de détection. Nous avons développé un algorithme YOLOv5 amélioré pour la détection de cibles dans des images de télédétection optique haute résolution, en utilisant des pyramides de caractéristiques multicouches, des stratégies de têtes de détection multiples et des modules d'attention hybrides pour améliorer l'effet du réseau de détection de cibles dans les images de télédétection optique. Selon l'ensemble de données SIMD, le mAP du nouvel algorithme est 2,2 % meilleur que YOLOv5 et 8,48 % meilleur que YOLOX, permettant ainsi d'obtenir un meilleur équilibre entre les résultats de détection et la vitesse. 02 Contexte et motivation Avec le développement rapide de la technologie de télédétection, les images de télédétection optique à haute résolution ont été utilisées pour décrire de nombreux objets à la surface de la Terre, notamment des avions, des voitures, des bâtiments, etc. Détection d'objets dans l'interprétation d'images de télédétection

1. Contexte de la construction de la plateforme 58 Portraits Tout d'abord, je voudrais partager avec vous le contexte de la construction de la plateforme 58 Portraits. 1. La pensée traditionnelle de la plate-forme de profilage traditionnelle ne suffit plus. La création d'une plate-forme de profilage des utilisateurs s'appuie sur des capacités de modélisation d'entrepôt de données pour intégrer les données de plusieurs secteurs d'activité afin de créer des portraits d'utilisateurs précis. Elle nécessite également l'exploration de données pour comprendre le comportement et les intérêts des utilisateurs. et besoins, et fournir des capacités côté algorithmes ; enfin, il doit également disposer de capacités de plate-forme de données pour stocker, interroger et partager efficacement les données de profil utilisateur et fournir des services de profil. La principale différence entre une plate-forme de profilage d'entreprise auto-construite et une plate-forme de profilage de middle-office est que la plate-forme de profilage auto-construite dessert un seul secteur d'activité et peut être personnalisée à la demande. La plate-forme de mid-office dessert plusieurs secteurs d'activité et est complexe ; modélisation et offre des fonctionnalités plus générales. 2.58 Portraits d'utilisateurs de l'arrière-plan de la construction du portrait sur la plate-forme médiane 58
