Introducción

1

¿Ya tomaste el Curso Avanzado de Algoritmos: Patrones de Arrays y Strings?

Lista Enlazada

2

Estructura de datos: Lista Enlazada

3

Programando listas enlazadas con Java

4

Cómo Invertir una Lista Enlazada

5

Odd Even Linked List: análisis del problema

6

Solución de Odd Even Linked List

7

Playground: Odd Even Liked List

8

Programando Odd Even Linked List con C++

9

Linked List Cycle: análisis del problema

10

Solución de Linked List Cycle

11

Playground: Linked List Cycle

12

Programando Linked List Cycle con Python

13

Palindrome Linked List: análisis del problema

14

Solución de Palindrome Linked List

15

Playground: Palindrome Linked List

16

Programando Palindrome Linked List con Java

17

Reorder List: análisis del problema

18

Solución de Reorder List

19

Programando Reorder List con JavaScript

20

Playground: Reorder List Without Repeated Values

21

Reto: LRU Caché

22

Ejercicios recomendados de Lista Enlazada

23

Ejercicios resueltos de Lista Enlazada

Pilas y colas

24

Estructura de datos: Pilas y Colas

25

Paréntesis Válido: análisis del problema

26

Solución de Paréntesis Válido

27

Playground: Paréntesis Válido

28

Programando Paréntesis Válido con C++

29

Ejercicios recomendados de Pilas

Colas de prioridad

30

Estructura de datos: Colas de Prioridad

31

K Closest Points to Origin: análisis del problema

32

Solución de K Closest Points to Origin

33

Playground: K Closest Points to Origin

34

Programando K Closest Points to Origin con Python

35

Reorganize String: análisis del problema

36

Solución de Reorganize String

37

Playground: Reorganize String

38

Programando Reorganize String con Python

39

Ejercicios recomendados de Colas de prioridad

40

Ejercicios resueltos de Colas de prioridad

Próximos pasos

41

Toma el Curso Avanzado de Algoritmos: Grafos y Árboles

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Reto: LRU Caché

21/41
Recursos

Aportes 2

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Problema y carateristicas:

  • Algoritmo real usando para almacenar en memoria los datos.

Diseñar una estructura de datos que siga las restricciones de una caché de uso menos reciente (LRU)

Inicializa la clase cache LRU con una capacidad de tamaño positivo.

int get(int key) Devuelve el valor de la llave si esta existe, en caso contrario devuelve -1.

void put(int key, int value) Actualiza el valor de la llave si esta existe. En caso contrario, añade el par llave-valor al caché. Si el número de llaves supera la capacidad del caché, elimina la pareja llave-valor menos utilizada recientemente.


Características:

  • Como entrada en la clase constructor un tamaño, que indica la cantidad que podemos almacenar.
  • Guardamos solo los más recientes si superamos la capacidad que nos pasan por parámetro, eliminamos los datos menos utilizados.
  • Complejidad temporal debe ser O(1)
  • la primera function get return un entero, la cual recibe una llave que también es un entero. Esta devuelve el valor de la llave si esta existe en mis datos almacenados y si no return -1
  • put() no return nada. Tenemos dos entradas, la llave y el valor, si la llave ya existe actualicemos el valor, de lo contrario creamos en nuestra cache, la llave y el valor.
  • cada vez que actualicemos o agreguemos un valor, es decir, cada vez que llamemos put() el valor actualizado o cambiante, o creado es el valor utilizado más recientemente
  • si el numero de llaves supera la capacidad del cache debemos eliminar la pareja llave valor, menos utilizada.
Con una lista doblemente enlazada y hash map se puede muy bien, comparto código en typescript: ``` class DoublyLinkedListNode { key: number; value: number; prev: DoublyLinkedListNode | null; next: DoublyLinkedListNode | null; constructor(key: number, value: number) { this.key = key; this.value = value; this.prev = null; this.next = null; }} class LRUCache { private capacity: number; private cache: Map\<number, DoublyLinkedListNode>; private head: DoublyLinkedListNode; private tail: DoublyLinkedListNode; constructor(capacity: number) { this.capacity = capacity; this.cache = new Map(); this.head = new DoublyLinkedListNode(0, 0); this.tail = new DoublyLinkedListNode(0, 0); this.head.next = this.tail; this.tail.prev = this.head; } get(key: number): number { if (!this.cache.has(key)) { return -1; } const node = this.cache.get(key)!; this.removeNode(node); this.addToFront(node); return node.value; } put(key: number, value: number): void { if (this.cache.has(key)) { const node = this.cache.get(key)!; this.removeNode(node); node.value = value; this.addToFront(node); } else { if (this.cache.size >= this.capacity) { const leastUsed = this.tail.prev!; this.removeNode(leastUsed); this.cache.delete(leastUsed.key); } const newNode = new DoublyLinkedListNode(key, value); this.addToFront(newNode); this.cache.set(key, newNode); } } private removeNode(node: DoublyLinkedListNode): void { const prevNode = node.prev!; const nextNode = node.next!; prevNode.next = nextNode; nextNode.prev = prevNode; } private addToFront(node: DoublyLinkedListNode): void { node.prev = this.head; node.next = this.head.next; this.head.next!.prev = node; this.head.next = node; }} ```