Sto convertendo un algoritmo da C# a C++. Una piccola parte dell'algoritmo consiste nel calcolare i valori medi per determinate aree in un dizionario.Modo efficiente per calcolare il valore medio su intervalli secondari disgiunti della mappa STL
I dati del dizionario sono memorizzati nel seguente modo:
Index Value
1 10
3 28
290 78
1110 90
Ho bisogno di calcolare il valore medio di tutti i valori, con un indice più piccolo di un certo numero e tutti i valori index più grande di un certo numero di . In C# Io lo faccio nel modo seguente:
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]);
}
}
So che non è molto efficiente e il codice piuttosto scadente, ma sapevo che avrei dovuto riscrivere completamente questa parte del algoritmo in C++ in ogni caso, così ho deciso per implementarlo veloce e sporco.
In ogni caso, ora sto eseguendo il porting su C++ e poiché verrà eseguito su una piattaforma mobile, le prestazioni sono molto importanti. Con la mia conoscenza limitata di C++/STL, molto probabilmente avrei finito il lavoro, ma il risultato sarebbe probabilmente molto peggio del codice C#.
Quindi, se si conosce un modo valido ed efficiente per eseguire questa attività in C++, per favore dimmi.
MODIFICA: Grazie per tutte le vostre risposte. Come ho accennato nel mio post, la mia conoscenza STL è limitata, quindi è davvero difficile per me scegliere una soluzione, soprattutto perché ci sono molte opinioni diverse. Sarebbe bello se qualcuno potesse aiutarmi con la decisione, confrontando le soluzioni pubblicate qui. Per darvi qualche informazione in più:
La funzione verrà chiamata circa 500 volte con 1000 valori nella mappa. L'aspetto più importante è la stabilità, la performance è la seconda più importante.
Con quali parti hai problemi? –
Dove si trova l'STL in questo? – gregg
@gregg Penso che la risposta dovrebbe usare da STL. –
Flexo