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)
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)......
max(min(x,y),z).通过这个我们能够确定min(x,y)和z之间的关系.max(min(x,y),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
这三个数字中的任何一个都是中位数,并且使用的公式将返回一些数字.