Estoy convirtiendo un algoritmo de C# a C++. Una pequeña parte del algoritmo es calcular valores promedio para ciertas áreas en un diccionario.Manera eficiente de calcular el valor promedio sobre subintervalos disjuntos del mapa STL
Los datos del diccionario se almacena en la siguiente forma:
Index Value
1 10
3 28
290 78
1110 90
necesito para calcular el valor medio de todos los valores con un índice menor que un cierto número y el índice de todos los valores mayores que un cierto número de . En C# lo hago de la siguiente manera:
if (dictionary.Where(x => x.Key < areaWidth).Count() > 0)
{
avgValue = (int) dictionary.Where(x => x.Key < areaWidth).Average(
x => x.Value);
}
for (var i = 0; i < line.Length; i++)
{
if (i == areaWidth)
{
avgValue = -1;
i = line.Length - areaWidth;
var rightBorder = i - areaWidth;
if (dictionary.Where(x => x.Key > (rightBorder)).Count() > 0)
{
avgValue = (int) dictionary.Where(
x => x.Key > (rightBorder)).Average(
x => x.Value);
}
}
if (line[i] < avgValue * 0.8)
{
reallyImportantValue += (avgValue - line[i]);
}
}
Yo sé que no es muy eficiente y un código bastante malo, pero sabía que iba a tener que reescribir por completo esta parte del algoritmo en C++ de todos modos, así que decidí para implementarlo rápido y sucio.
De todos modos ahora estoy portando esto a C++ y porque se ejecutará en una plataforma móvil, el rendimiento es muy importante. Con mi conocimiento limitado de C++/STL, probablemente podría hacer el trabajo, pero el resultado probablemente sería mucho peor que el código de C#.
Así que si conoce una forma buena y eficiente para realizar esta tarea en C++, por favor dígame.
EDIT: Gracias por todas sus respuestas. Como mencioné en mi publicación, mi conocimiento de STL es limitado, por lo que es muy difícil para mí elegir una solución, especialmente dado que hay muchas opiniones diferentes. Sería genial si alguien pudiera ayudarme con la decisión, comparando las soluciones publicadas aquí. Para darle un poco más de información básica:
La función se llamará aproximadamente 500 veces con 1000 valores en el mapa. El aspecto más importante es la estabilidad, el rendimiento es el segundo más importante.
¿Con qué partes tiene problemas? –
¿Dónde está el STL en esto? – gregg
@gregg Creo que se espera que la respuesta sea usando de STL. –
Flexo