Sto usando nth_element per ottenere un valore (circa corretto) per un percentile di un vettore, in questo modo:Perché std :: nth_element restituisce vettori ordinati per vettori di input con N <33 elementi?
double percentile(std::vector<double> &vectorIn, double percent)
{
std::nth_element(vectorIn.begin(), vectorIn.begin() + (percent*vectorIn.size())/100, vectorIn.end());
return vectorIn[(percent*vectorIn.size())/100];
}
ho notato che per lunghezze Vectorin fino a 32 elementi, il vettore viene completamente allineati. A partire da 33 elementi non viene mai ordinato (come previsto).
Non sono sicuro se questo è importante ma la funzione è in un "codice Mat ++ (C++ Matlab-)" compilato tramite Matlab utilizzando "Microsoft Windows SDK 7.1 (C++)".
EDIT:
Vedere anche i sequenti istogramma delle lunghezze dei blocchi più lunga filtrate in vettori 1E5 passati alla funzione (vettori conteneva elementi casuali 1E4 e percentile casuale è stato calcolato). Notare il picco a valori molto piccoli.
La funzione fa una sorta parziale, al fine di restituire il valore richiesto . Quanto di un ordinamento parziale lo fa fino all'implementazione. –
No, non correlato a Mex, ma bella domanda. – chappjc
Il picco sul lato sinistro della trama assomiglia molto all'istogramma della lunghezza della sottosequenza consecutiva più lunga in un vettore casuale. Ciò potrebbe corrispondere alla piccola frazione di valori percentuali scelti casualmente così vicini a una fine del vettore che la sottosequenza più lunga si trova nella parte del vettore mai toccata da nth_vector. Ma quella è solo una congettura. – rici