在数组C ++中查找最常见和中值

时间:2014-06-14 09:09:17

标签: c++ visual-studio-2010

我想通过使用C ++找到给定数组的最常见和中值。我假设我有一个浮点数组,如

float *LRArr=new LRArr[1000];

数组由随机浮点数填充。

std::default_random_engine generator;
generator.seed( rd() );
std::uniform_real_distribution<> distribution(0, 10);
for(int j=0;j<1000;j++)
{
    LRArr[j]=distribution(generator)
}

现在我想获得数组中最常用的值。但这需要很多时间。您能否通过C或C ++向我推荐更快的方法?我假设我有LRArr,例如

LRArr={0.1,1.2,6.5,6.5,4.5,6.5}
==>output is: 6.5 and median 5.5

这是我的方式:

float getMostFreq(float* LRArr;int sizeLRArr)
{
int count = 1;
int currentIndex = 0;
   for (int i = 1; i < sizeLRArr; i++)
   {
    if (LRArr[i] == LRArr[currentIndex])
        count++;
    else
        count--;
    if (count == 0)
    {
        currentIndex = i;
        count = 1;
    }
  }
  mostFreq = LRArr[currentIndex];
  return mostFreq;
} 

1 个答案:

答案 0 :(得分:2)

计算数组中浮点值频率的一种方法是计算直方图并对其进行排序。但是你应该考虑到你应该定义你的值的范围。这样,精度取决于直方图箱的数量:

#include <algorithm>

#define histogramCount 10000
#define upperRange 1000
#define lowerRange 0

class histogram_data
{
public:
  int frequency;
  int index;
};

bool SortPredicate(const histogram_data& d1, const histogram_data& d2)
{
    return d1.frequency> d2.frequency;
}


void computeHistogram(float * array, int len)
{

   std::vector<histogram_data> histogram;

   for(int i=0;i<histogramCount;i++)
   {
       histogram_data hdata;
       hdata.frequency=0;
       hdata.index=i;
       histogram.push_back(hdata);
   }


   for(int i=0;i<len;i++)
   {
       histogram[(array[i]/(upperRange-lowerRange))*(histogramCount-1)].frequency++;
   }

   //sorting the histogram in descending order

    std::sort(histogram.begin(),histogram.end(),SortPredicate);

}

现在,值的频率按降序存储在直方图中。因此,最常见的价值可以通过以下方式获得:

float mostFrequent = ((float)histogram[0].index/(float)(histogramCount-1))*(upperRange-lowerRange);