C ++中小数据集的有效中值计算

时间:2013-03-27 16:18:59

标签: c++ median

我有很多(数十万,m)组双打d,~5-10(n,常数小)长。这些双打基本上是随机分布的。我需要得到每组的中位数:因为m非常大,我们需要非常快地计算中位数......虽然这些组很小,所以我认为这将在选择怎么做方面发挥重要作用中位数。我知道我可以用nth_element用选择算法得到O(n)的中位数,我知道我不会在复杂性上打败。但是,由于常量n很小,我可能正在寻找具有最小开销的方法。

我找到了一些不同的方法来做中位数(下面),但如果有人知道在这里使用的“正确”方法,我只是好奇。

Min max heaps(O(n)构建时间,持续访问,可能过多开销)

This question from 2010这可能已经过时了(新的STL / Boost代码可能已经实现了这个东西),也更多地关注时间复杂性而不是开销。

2 个答案:

答案 0 :(得分:1)

这可能无法很好地扩展到您的数据大小,但它是我发现的代码片段(不记得在哪里)并在我的图像处理函数中使用以获得9个无符号字符像素的中位数。

// optimised median search on 9 values
#define PIX_SWAP(a, b) { unsigned char uTemp = (a); (a) = (b); (b) = uTemp; }
#define PIX_SORT(a, b) { if ((a) > (b)) PIX_SWAP((a), (b)); }

unsigned char GetMedian9(unsigned char *pNine)
{
    // nb - this is theoretically the fastest way to get the median of 9 values
    PIX_SORT(pNine[1], pNine[2]); PIX_SORT(pNine[4], pNine[5]); PIX_SORT(pNine[7], pNine[8]); 
    PIX_SORT(pNine[0], pNine[1]); PIX_SORT(pNine[3], pNine[4]); PIX_SORT(pNine[6], pNine[7]); 
    PIX_SORT(pNine[1], pNine[2]); PIX_SORT(pNine[4], pNine[5]); PIX_SORT(pNine[7], pNine[8]); 
    PIX_SORT(pNine[0], pNine[3]); PIX_SORT(pNine[5], pNine[8]); PIX_SORT(pNine[4], pNine[7]); 
    PIX_SORT(pNine[3], pNine[6]); PIX_SORT(pNine[1], pNine[4]); PIX_SORT(pNine[2], pNine[5]); 
    PIX_SORT(pNine[4], pNine[7]); PIX_SORT(pNine[4], pNine[2]); PIX_SORT(pNine[6], pNine[4]); 
    PIX_SORT(pNine[4], pNine[2]); return(pNine[4]);
}

#undef PIX_SWAP
#undef PIX_SORT

编辑 - 好的,它也被引用in this answer too

答案 1 :(得分:0)

如果它是std :: set(你没有回答BoBTFish)那么它已经被排序了。因此,您将通过迭代到n / 2得到中值,其总是更好或等于O(n),通常应该是O(ld n)。第n个元素在这里没有帮助。