Top K Frequent Elements
Es un problema bastante sencillo que te tiene que enseñar todavia un par de trucos interesantes, especificamente con el algoritmo de sorting Bucket Sort. El problema dicta lo siguiente:
Dado un array de numeros
numsretorna la cantidad dekvalores que se repitan mas veces. Por ejemplo, dado el array [1,1,1,2,2,3] retorna los 2 valores mas comunes. La respuesta es [1,2].
# Solucion
Para solucionar este problema tenemos dos alternativas (realmente mas pero escenciales de enteder solamente dos). Una conlleva el uso de un algoritmo de sorting y la otra el uso de una variacion del Bucket Sort.
# Usando Sorting O(n log n)
Es posible solucionar el problema de forma bastante sencilla utilizando un algoritmo de sorting:
- Inicializar un mapa vacio en el que la llave correspondera a un numero particular y el valor a la cantidad de veces que este aparece en el array.
- Cargar el mapa con los datos del array
- Ordenar el mapa por los valores en forma descendente, de modo que, el elemento que se repite mas veces se encuentre al inicio
- Retornar los k primeros elementos
# Codigo
| |
# Usando variacion de Bucket Sort O(n)
Se puede utilizar un truquito una vez que entiendes algo intereasnte del problema: Como maximo, un elemento puede repetirse hasta nums.length veces, NO MAS. Con eso en mente podemos desarrollar lo siguiente:
- Inicializar un mapa vacio en el que la llave correspondera a un numero particular y el valor a la cantidad de veces que este aparece en el array.
- Cargar el mapa con los datos del array
- Inicializar un array en el que el indice
ithcontendra una lista con los elementos que se repiten dicha cantidad de veces. Por ejemplo - Cargamos el array con los datos del mapa, de modo que, si un elemento se repite tres veces (1) se encontrara en el indice
3del array. - Inicialziamos una variable que tendra la respuesta
- Iteramos el mapa iniciando por el final (debido a que alli se encuentran las listas que contienen los elementos que se repiten mas veces).
- Vamos agregando elementos de las listas conforme vayan apareciendo en el mapa recorriendolo de fin a principio
- Cada vez que agreguemos un elemento, debemos comprobar si ahora tenemos la cantidad
kde elementos que buscamos. - De ser asi, retornamos el resultado
- De no ser asi, seguimos con la iteracion hasta que retornemos
# Codigo
| |
# Notas
En este problema, el hecho de que se necesite contar la cantidad de apariciones de cada numero ya implica el uso de un notes/Hash Table (hashmap, map, diccionario, objeto, pares de clave-valor) que sirva para guardar dos cosas:
- Llave: Cada numero unico dentro del array
- Valor: La cantidad de veces que aparece
Esto es asi, debido a que, por la definicion del Hash Table, podemos saber que las llaves seran unicas, lo que nos permitira contar la cantidad de veces que este ocurre en el array nums.
De modo que, dado un array como el siguiente: [1, 1, 7, 7, 7, 5, 5, 5, 5] podamos tener un hashmap como:
| |
Con esto ya tenemos la primera parte del problema resuelto. Ahora, podemos tomar varios approaches para terminar de solucionar el problema.
La siguiente parte implica obtener los K elementos mas comunes, para esto, necesitamos re-ordenar el mapa basado en valores, o obtener de alguna forma los K valores mas comunes.
Una forma de hacerlo, es utilizando sorted en python, este recibe tres valores: sorted(iterable, key, reverse=?)
- Iterable. La coleccion iterable que se quiere ordenar
- Key. Un callback para una funcion que indica como se ordenara
- Reverse. Si la lista se busca inversa o no
| |
Una vez se aplica esta funcion, podemos retornar las llaves hasta los k elementos.
# Codigo
| |