Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 我有4个整数。如何找到最大/最小值?_.net_Algorithm - Fatal编程技术网

.net 我有4个整数。如何找到最大/最小值?

.net 我有4个整数。如何找到最大/最小值?,.net,algorithm,.net,Algorithm,我有4个整数(a,b,c,d) 如何找到最大/最小值 最有效的方法是什么。我应该填写一个列表,然后应用排序方法吗 .NET 对于最大值,请对Math.Max()执行相同的操作,如果您总是有4个数字,并且它们已经在变量a、b、c和d中,则排序是毫无意义的,因为它需要将它们放入一个数组中,然后对数组进行排序。最有效的方法就是加入几个if语句: int min1, max1; if (a > b) { min1 = b; max1 = a; } else { min1 =

我有4个整数(a,b,c,d)

如何找到最大/最小值

最有效的方法是什么。我应该填写一个列表,然后应用排序方法吗

.NET


对于最大值,请对
Math.Max()

执行相同的操作,如果您总是有4个数字,并且它们已经在变量
a
b
c
d
中,则排序是毫无意义的,因为它需要将它们放入一个数组中,然后对数组进行排序。最有效的方法就是加入几个
if
语句:

int min1, max1;
if (a > b)
{
    min1 = b;
    max1 = a;
}
else
{
    min1 = a;
    max1 = b;
}
int min2, max2;
if (c > d)
{
    min2 = d;
    max2 = c;
}
else
{
    min2 = c;
    max2 = d;
}
int min = min1, max = max1;
if (min2 < min1)
    min = min2;
if (max2 > max1)
    max = max2;
intmin1,max1;
如果(a>b)
{
min1=b;
max1=a;
}
其他的
{
min1=a;
max1=b;
}
int min2,max2;
如果(c>d)
{
min2=d;
max2=c;
}
其他的
{
min2=c;
max2=d;
}
int min=min1,max=max1;
if(min2max1)
max=max2;
您可以创建一个方法:

    public int FindMaxInt(params int[] numbers)
    {
        return numbers.Max();
    }
然后按如下方式使用:

FindMaxInt(1,2,3,4,5,6)

当然,你也可以去掉中间人:

var max=new[]{1,2,3,4,5,6}.max()

或者,如果只想使用一个数组并从中找到最小/最大值:

int[] numbers = new [] { 1, 2, 3, 4, 5, 6 };
int max = numbers.Max();
int min = numbers.Min();

功能性方法=

var max = new [] { a, b, c, d }.Max();
var min = new [] { a, b, c, d }.Min();

如果你所说的效率是指最小比较,以找出最大值和最小值,我认为你可以做如下操作:

int[] maxMin1 = (a>b)?new []{a,b}:new []{b,a};
int[] maxMin2 = (c>d)?new []{c,d}:new []{d,c};

max = Math.Max(maxMin1[0],maxMin2[0]);
min = Math.Min(maxMin1[1],maxMin2[1]);
它使用4个比较来查找它们,正常工作使用6个比较,还可以定义一个结构或类来提高可读性,而不是数组

编辑:为了测试这一点,最好使用一些自定义类型,在这种情况下,我将使用.net中可用的
(但最好有一个自定义类型的类):

//一次性创建:
var min=新点{X=0,Y=0};
var max=新点{X=0,Y=0};
.....
..... 

如果(a一个解决方案,使比较次数最小化

var max1 = Math.Max(a,b);
var max2 = Math.Max(c,d);

var max = Math.Max(max1, max2);
var min = Math.Min(a+b-max1, c+d-max2);

只需4次比较

假设这些是32位有符号整数,它们都在-230到230-1的范围内,并且当整数右移时,它们会进行算术移位并保留符号位……假设所有这些,您可以避免所有比较和条件跳转,并在某种程度上并行计算找到最小值:

var max1 = Math.Max(a,b);
var max2 = Math.Max(c,d);

var max = Math.Max(max1, max2);
var min = Math.Min(a+b-max1, c+d-max2);
using System;
public class Exercise
{
  public static void Main()
  {
    int a = 5;
    int b = 100;
    int c = -33;
    int d = -1000;
    int tmp1 = (a - b) >> 31;
    int tmp2 = (c - d) >> 31;
    int min1 = (tmp1 & a) | (~tmp1 & b);
    int min2 = (tmp2 & c) | (~tmp2 & d);
    tmp1 = (min1 - min2) >> 31;
    int min = (tmp1 & min1) | (~tmp1 & min2);
    Console.WriteLine(min);
  }
}
输出:

-1000
您还可以再添加4行代码以获得最大值



你总是有4个数字吗?那就足够了。或者你可以做一些像max(a,max(b,max(c,d)),很糟糕的事情;你只会有4个吗?或者你会有一个动态数字,需要找到最小/最大值吗?我想你被否决了,因为你使用了“有效”和“有效”这样的主观术语没有定义它们。您是在寻找最容易输入、使用最少内存、使用最少CPU时间的方法还是什么?这并不是最有效的方法,因为它需要创建单独的数组来计算最小值和最大值,但它肯定是最干净的。@Gabe-它对程序员来说是最有效的,这通常更重要!@Gabe Fair,更新为包含单个数组示例。这比三层嵌套版本更好-两个内部比较可以同时进行。这比其他答案更好吗?不仅不清楚,而且它还创建了对象来进行比较!如果您要选择一个邪恶,省去其他…@codekaizen你可以读到为什么它会更好,我在我的回答中描述了它,我说如果效率比较对op很重要,如果这4个项目的数量很大,应该同时计算最小值和最大值,通过一次对象创建,你可以使用这种方式,我还说它可以更改为使用一些用户dEFIN类更可读,我不认为任何人都很难做到这一点。我怀疑创建一个数组对于速度来说更好,即使操作更少。请记住CLR有引用数组,而不是像C++那样直接排列的堆栈分配数组。此外,为这个简单的问题创建自定义类型的所有努力,特别是当有现有的操作符使用LINQ为我们这样做时,并不能满足我“更好”的感觉对于程序员来说。一些测试似乎证明了我的推理:
数组:1507ms;无数组:1079ms
@codekaizen首先我编辑了我的答案来描述它,其次你的基准点不好,在当前状态下,你改变我的方式的位置,其他方式你会得到另一个结果,第二,生成随机数should无法计算最小值和最大值,事实上,你可以有一个由n个随机数组成的数组,并对每个4个连续数进行比较,最后,如果你使用我上面的方法,你会得到更好的结果。另外,例如,在并行计算中,决策是重要的,而不是赋值,因此我说如果“效率意味着比较数…”第一行…我很希望被否决的投票者能说出他们被否决的理由。也许我会学到一些东西。我不是一个被否决的投票者,但我打赌你的方法比我的方法慢(修订版1被修改,我的声明又不是在正常的cpu性能上),而且我认为它比我的正常答案慢,但你也没有描述你的方法是如何有效的。当然它慢了,但它对程序员来说更有效,这通常更重要。它简洁、易于阅读和理解,有助于清晰、可维护的软件。我提供它作为一种可能在未来几年内采用的方法功能性风格,因为OP在“高效和有效”的含义上几乎没有留下指导.你应该在你的回答中描述这一点,我知道正因为如此,我不会投你反对票,但可能对某人来说并不明显,他会投你反对票,可能还有其他原因,但这是我的观点。+1代表gene
-1000