获取最大、平均和最小值
Get the largest, average and smallest value
为了简化我的问题,我将使用像素作为模板。
计算像素值最高、中值和最低的最快方法是什么?
例如:
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
要计算 N 个值的 min
、max
或 average/median
,您需要检查每个值。如果你不这样做,那么你没有检查的值之一可能是真实的 min
/max
/average/median
,如果你检查过的话。
因此,最快的方法是 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.
}
对于正好三个值进行排序,最坏情况 运行 时间
将包括三个比较。没有办法避免这种情况。
这里是一个最多比较3次的算法:
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 个函数。
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;
}
因为你用 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;
}
}
为了简化我的问题,我将使用像素作为模板。
计算像素值最高、中值和最低的最快方法是什么? 例如:
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
要计算 N 个值的 min
、max
或 average/median
,您需要检查每个值。如果你不这样做,那么你没有检查的值之一可能是真实的 min
/max
/average/median
,如果你检查过的话。
因此,最快的方法是 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.
}
对于正好三个值进行排序,最坏情况 运行 时间 将包括三个比较。没有办法避免这种情况。
这里是一个最多比较3次的算法:
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 个函数。
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;
}
因为你用 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;
}
}