【发布时间】:2015-02-16 19:14:32
【问题描述】:
我正在使用std::nth_element 来获取向量百分位数的(大致正确的)值,如下所示:
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];
}
我注意到对于最多 32 个元素的 vectorIn 长度,向量会完全排序。从 33 个元素开始,它永远不会排序(如预期的那样)。
不确定这是否重要,但该函数位于通过 Matlab 使用“Microsoft Windows SDK 7.1 (C++)”编译的“(Matlab-)mex c++ 代码”中。
编辑:
另请参阅以下直方图,其中显示了传递给函数的 1e5 个向量中最长排序块的长度(向量包含 1e4 个随机元素,并计算了一个随机百分位数)。请注意非常小的值处的峰值。
【问题讨论】:
-
该函数进行部分排序以返回您请求的值。它做多少部分排序取决于实现。
-
不,与墨西哥无关,但很酷的问题。
-
绘图左侧的尖峰看起来很像随机向量中最长连续子序列的长度直方图。这可能对应于随机选择的百分位值的一小部分,它非常接近向量的末端,以至于最长的子序列位于向量中从未被 nth_vector 触及的部分。但这只是猜测。
-
@rici:好主意,但我检查了它,但事实并非如此。对于向量以这些非常短的排序序列结束的运行,相应的百分位数也均匀分布在 0 到 100 之间。
标签: c++ algorithm sorting mex nth-element