获得最大,平均和最小的值

时间:2015-05-01 17:17:44

标签: c++ c math pixel

为了简化我的问题,我将使用像素作为模板。

我能计算出哪个像素值最高,中位数和最低值的最快方法是什么? 例如:

unsigned char pixel[] = {128, 255, 64};
unsigned char highest, median, lowest;

get_pixel_values_priority(pixel, &highest, &median, &lowest);
printf("Highest %u\nMedian %u\nLowest %u", highest, median, lowest);

应该结果:

Highest 255
Median 128
Lowest 64

4 个答案:

答案 0 :(得分:1)

要计算N个值的minmaxaverage/median,您需要检查每个值。如果你不这样做,那么你不检查的其中一个值可能是真正的min / max / average/median,只要你检查过它。 / p>

因此,最快的方法是O(N),例如循环。

std::vector<Pixel> pixels = ...
Pixel min = max = pixels[0];
for (auto item: pixels)
{
  if (item < min)
    min = item;
  if (item > max)
    max = item;
  // etc.
}

答案 1 :(得分:1)

嗯..这是我的解决方案合并为3个函数。

unsigned char rgb_min(structRGB source)
{
    unsigned char minimum = source.R;

    if (source.G < minimum) { minimum = source.G; }
    if (source.B < minimum) { minimum = source.B; }

    return minimum;
}

unsigned char rgb_max(structRGB source)
{
    unsigned char maximum = source.R;

    if (source.G > maximum) { maximum = source.G; }
    if (source.B > maximum) { maximum = source.B; }

    return maximum;
}

unsigned char rgb_med(structRGB source)
{
    fgiByte median = source.R;

    if (source.G > median && source.G < source.B) { median = source.G; }
    if (source.B > median && source.B < source.R) { median = source.B; }

    return median;
}

答案 2 :(得分:0)

对于要排序的三个值,最差的运行时间 将包括三个比较。没有办法避免这种情况。

这是一个最多三次比较的算法:

unsigned char higher;
unsigned char lower;

if (pixel[0] > pixel[1])
{
  higher = pixel[0];
  lower  = pixel[1];
}
else
{
  higher = pixel[1];
  lower  = pixel[0];
}

if (pixel[2] > higher)
{
  highest = pixel[2];
  median  = higher;
  lowest  = lower;
}
else if (pixel[2] > lower)
{
  highest = higher;
  median  = pixel[2];
  lowest  = lower;
}
else
{
  highest = higher;
  median  = lower;
  lowest  = pixel[2];
}

如果你不介意两次编写相当于最后18行的代码, 你可以在每个代码块中放置一个嵌套的if-elseif-else 第一个if-else语句,并避免存储临时变量。 这(以及一些其他修改)可能会优化运行时 稍微,但如果你真的关心你应该可能的基准 找出实际需要多长时间的功能。

答案 3 :(得分:0)

由于您使用C ++对其进行了标记,因此我会将std::vector个对象与std::sort()算法混合使用,以便于查找这些统计信息。这是一个简单的例子。

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
    std::vector<float> numbers = { 1, 4, 3, 2 };

    std::sort(numbers.begin(), numbers.end());

    // numbers = { 1, 2, 3, 4 }

    float min = numbers.front();
    float max = numbers.back();

    float median;
    if (numbers.size() % 2) {   // odd number of elements
        median = numbers[numbers.size() / 2];
    }
    else {                      // even number of elements
        median = (numbers[numbers.size() / 2] + numbers[numbers.size() / 2 - 1]) / 2;
    }
}