用于查找给定值的最大值和最小值的简单算法

时间:2012-09-20 17:43:28

标签: algorithm

不需要代码,只需要简单的数学理论。

像:

  • 打印“输入你的年龄”
  • 读(年龄)
  • 如果年龄> 20
  • 结果= “成人”
  • 打印“你是”
  • 打印(结果)

我将参加C语言课程,但在此之前我想学习一些基础知识。 我需要一个程序/算法,使用 multiple-if或nested-if 找到最多和最少三个数字。

5 个答案:

答案 0 :(得分:5)

有直截了当的方式:

int min(int a, int b, int c){
    if (a <= b && a <= c){
        return a;
    }
    if (b <= a && b <= c){
        return b;
    }
    if (c <= a && c <= b){
        return c;
    }
}

有最少比较次数的方法:

int min(int a, int b, int c){
    if (a < b){
        if (a < c){
            return a;
        }
        else{
            return c;
        }
    }
    else{
        if (b < c){
            return b
        }
        else{
            return c;
        }
    }
}

由于ternary operator

,有最少的代码行
int min(int a, int b, int c){
    return (a<b)?((a<c)?a:c):((b<c)?b:c);
}

评论中提到了twalberg的方式:

int min(int a, int b){
    if (a <= b){return a;}
    else{return b;}
}

int min(int a, int b, int c){
    return min(min(a,b), c);
}

max也可以通过所有这些方式定义,将<替换为>。您也可以使用min

来定义它
int max(int a, int b, int c){
    return -min(-a, -b, -c);
}

如果您还不想学习如何声明函数,可以将其中的一些直接放入主函数中。例如,第二种方法:

//todo: translate this pseudocode into C
print "enter three numbers"
read(a)
read(b)
read(c)
if (a < b){
    if (a < c){
        min = a;
    }
    else{
        min = c;
    }
}
else{
    if (b < c){
        min = b
    }
    else{
        min = c;
    }
}
print "the minimum value is " + min

答案 1 :(得分:0)

鉴于问题要求,有两个因素将决定问题的最佳解决方案:

  1. 您必须检查每个号码才能获得解决方案
  2. 最佳解决方案意味着只检查每个号码
  3. 会是这样的:

    1: Maximum = 0
    2: Minimum = 0
    3: read(number)
    4: if number > Maximum then Maximum = number
    5: if number < Minimum then Minimum = number
    6: Repeat from 3 as many times as needed
    7: Print Maximum and Minimum
    

答案 2 :(得分:0)

注意:这不是C;它的Javascript。但是,对于这样的一般问题,课程是相同的 - 实际上,由于语法上的相似性,许多相同的代码可以用于等效的C性能测试。

this JSPerf中,我有四种获取数字数组的最小值/最大值的方法。第一种是直截了当的方式:

  1. 将最小值和最大值设置为arr [0]
  2. 使用索引i从1开始循环
    1. 检查arr [i]&lt;分钟;如果是这样,请将min设置为arr [i]
    2. 检查arr [i]&gt;最大;如果是这样,请将max设置为arr [i]
  3. 在循环结束时,使用包含[min,max]
  4. 的数组进行响应

    第二种使用分而治之的方法。这通常是对O(n ^ 2)问题的改进(例如,一种排序,其中每个值必须使用简单的实现与每个其他值进行比较),但是对于像这样的O(n)问题,没有&#39 ; t获得任何东西,并增加堆栈开销。

    1. 如果数组长度为1个元素,则返回[arr [0],arr [0]]
    2. 如果数组长度为2个元素
      1. 如果是arr [0]&gt; arr [1],返回[arr [1],arr [0]]
      2. 否则,返回arr
    3. 将阵列大致分成左半部分和右半部分,每半部分调用minmax
    4. return [min(left [0],right [0]),max(left [1],right [1]]
    5. 还有另一个递归版本,它使用索引来避免创建新数组来执行拆分(Array#slice()从旧数组中的数据创建一个新数组;这种类型的分配可能会使事情陷入困境向下)。

      然后是使用JS的数学库作为参考点的原生解决方案。

      我已在所有主流浏览器中运行它,因此可以看到JS引擎实现中的任何差异。

      这里有几节课:

      1. 有时最简单的解决方案是
      2. 当您处理大量您不会改变的数据时,如果可以,请指向它;不要产生新的物体来做一点数学处理的工作。
      3. 只是因为有些聪明并不意味着它是正确的(作为一个菜鸟,你真的需要把它牢记在心)
      4. 请注意本机实现几乎与指向递归版本一样慢,而在Chrome的情况下,速度较慢。我不确定为什么会这样,但我希望它隐含从数组到本机参数列表的转换,两次(通过Function#apply())。我们采取的性能影响是一个意想不到的后果,并且是您在使用库时需要注意的事情。当您在库代码中遇到性能痛点时,可能只是库代码尝试执行的操作比您想要的更多;可能是将您的数据转换为库的首选格式并不是很有效。无论问题是什么,有时在没有所有额外功能的情况下将一个等效函数混合在一起就是正确的答案。
      5. 平台很重要。一个系统上的快速操作可能不在另一个系统上。您不必测试那里的所有内容,但您应该知道您的用户使用了什么,并针对每个用户进行测试。

答案 3 :(得分:0)

然后是嵌套的宏方法(如评论中的twalberg所述),即让编译器从简单的结构中找出它。现代编译器擅长这一点。

#define MIN(a,b) (a) < (b) ? (a) : (b)

对于获得优先权和操作顺序非常重要。

要获得至少三个数字:

min3 = MIN(MIN(a,b), c);

四个数字:

min4 = MIN(MIN(a,b), MIN(c,d));

等等。这具有进一步的优点,即您不需要不同的整数或实数形式。

答案 4 :(得分:0)

方法很多

<块引用>
  1. 将元素放入数组并找到最大值/最小值。
  2. 声明一个max/min变量,一一检查元素,根据条件更新ver。

对于示例 1,我正在编写代码,在 C++ 中从数组中找到最大值

#include<iostream>
#include <bits/stdc++.h>
using namespace std;

int main(){
    int arr[]{2,1,4,12,6,3,20};
    int sum = INT16_MIN;
    for(int x : arr){
        if(x>sum){
            sum =x;
        }
    }
    cout << sum;
    return 0;
}

对于示例 2,我正在编写一个函数,从 C++ 中的 4 个元素中找到最大值

int max_of_four(int a,int b,int c,int d){
    int max = INT16_MIN; //Min Int(16) possible in Code
    if(a>max){
        max=a;
    }if(b>max){
        max=b;
    }if(c>max){
        max = c;
    }if(d>max){
        max =d;
    }
    return max;
}

您可以用 N 组数字替换“四”,但这不是一种有效的方法。使用第一种方法求最大值/最小值

<块引用>

为了找到最小值 取变量为“INT16_MAX”并更改条件 从“>”到“<”。

相关问题