Estoy buscando calcular la entropía y la información mutua una gran cantidad de veces en el código de rendimiento crítico. Como paso intermedio, necesito contar el número de ocurrencias de cada valor. Por ejemplo:¿La manera más eficiente de contar las ocurrencias?
uint[] myArray = [1,1,2,1,4,5,2];
uint[] occurrences = countOccurrences(myArray);
// Occurrences == [3, 2, 1, 1] or some permutation of that.
// 3 occurrences of 1, 2 occurrences of 2, one each of 4 and 5.
Por supuesto, las formas obvias de hacer esto son ya sea usando una matriz asociativa o por la clasificación de la matriz de entrada usando un algoritmo de ordenación "estándar" como tipo rápido. Para enteros pequeños, como bytes, el código está actualmente especializado para usar una matriz antigua simple.
¿Hay algún algoritmo inteligente para hacer esto de manera más eficiente que una tabla hash o un algoritmo de clasificación "estándar", como una implementación de matriz asociativa que favorece las actualizaciones sobre inserciones o un algoritmo de clasificación que brilla cuando sus datos muchos lazos
Nota: Los enteros no dispersos son solo un ejemplo de un posible tipo de datos. Estoy buscando implementar una solución razonablemente genérica aquí, aunque como los enteros y las estructuras que contienen solo enteros son casos comunes, estaría interesado en soluciones específicas para estos si son extremadamente eficientes.
No se puede pensar en más de lo que dijo anteriormente. Ordene la matriz y luego repásela secuencialmente en in pass. –
¿tal vez podría usar algún tipo de Hadoop o mapa/reducción para acelerar su algoritmo? Aparte de eso, no veo nada. – kgrad
@kgrad: Ya estoy utilizando todos mis núcleos al paralelizar el ciclo externo, por lo que no tendría sentido paralelizar una ejecución individual de esta función. – dsimcha