在C++中获得中等价值

Vin*_*ent 13 c++ algorithm max min c++11

考虑三个值x, y, z.

获得中间值的公式是什么(不是平均值,而是既不是min也不是max)的值?

const double min = std::min(x, std::min(y, z));
const double mid = /* what formula here ? */
const double max = std::max(x, std::max(y, z));
Run Code Online (Sandbox Code Playgroud)

n. *_* m. 13

以对称的方式一次性找到所有三个:

min = x; med = y; max = z;

if (min > med) std::swap(min, med);
if (med > max) std::swap(med, max);
if (min > med) std::swap(min, med);
Run Code Online (Sandbox Code Playgroud)


Ala*_*kes 12

这似乎是作弊,但是: x + y + z - min - max

  • 我喜欢.唯一的问题是溢出. (2认同)
  • 这很聪明,但引入了数值误差. (2认同)

dig*_*y91 12

评论中分享了此链接的答案:

const double mid = std::max(std::min(x,y),std::min(std::max(x,y),z));
Run Code Online (Sandbox Code Playgroud)

编辑 - 正如艾伦所指出的那样,我错过了一个案例.我现在给出了一个更直观的证据.

直接证明:在x和y方面不失一般性.
从最里面的表达开始,min(max(x,y),z)......

  1. 如果它返回z,我们找到了关系:max(x,y)> z.然后表达式求值为max(min(x,y),z).通过这个我们能够确定min(x,y)和z之间的关系.
    如果分(X,Y)>Ž,那么z大于x和y都小于(如的关系变为:MAX(X,Y)>分(X,Y)>Ž).因此,min(x,y)确实是中位数并max(min(x,y),z)返回.
    如果min(x,y)<z,则z确实是中值(作为min(x,y)<z <max(x,y)).

  2. 如果它返回x,那么我们有x <zy <z.表达式的评估结果为:max(min(x,y),x).由于max(x,y)求值为x,min(x,y)求值为y.获得关系z> x> y.我们返回x和y的最大值(如表达式所示max(y,x)),即x和中值.(注意y的证明是对称的)

证明结束


旧证明 - 注意它不完整(直接):

不失一般性:假设x> y> z
min的x和y是y.并且min(x和y的最大值)和z是z.
y和z的最大值是y,即中值.

假设x = y> z
min的x和y表示为x.并且min(x和y的最大值是x)并且z是z.
上述两个中的最大值是x,即中位数.

假设x> y = z
min为x,y为y.并且min(x和y的最大值是x)并且z是z.
以上两者中的最大值是y,即中位数.

最后,假设x = y = z
这三个数字中的任何一个都是中位数,并且使用的公式将返回一些数字.