Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
如何找到';最大绝对和';具有一组整数的函数的 我试图在C++中解决这个问题,努力寻找一个O(1)的解决方案。_C++_Algorithm_Math - Fatal编程技术网

如何找到';最大绝对和';具有一组整数的函数的 我试图在C++中解决这个问题,努力寻找一个O(1)的解决方案。

如何找到';最大绝对和';具有一组整数的函数的 我试图在C++中解决这个问题,努力寻找一个O(1)的解决方案。,c++,algorithm,math,C++,Algorithm,Math,给定一个由四个整数组成的输入数组,将它们按如下顺序排列:F(s)=abs(s[0]-s[1])+abs(s[1]-s[2])+abs(s[2]-s[3])为最大值(绝对值) 如果每个整数都是唯一的,则最多有24次可能的随机洗牌 e、 g 拖到 A=5, B=-1, C=5, D=3 会导致 F(s) = 14; 这个算法应该是O(1) 注意正负整数的混合 F(s) = abs(s[0]-s[1]) + abs(s[1]-s[2])+ abs(s[2]-s[3]) 如果您从0、a、a+b、a

给定一个由四个整数组成的输入数组,将它们按如下顺序排列:
F(s)=abs(s[0]-s[1])+abs(s[1]-s[2])+abs(s[2]-s[3])
为最大值(绝对值)

如果每个整数都是唯一的,则最多有24次可能的随机洗牌

e、 g

拖到

A=5, B=-1, C=5, D=3
会导致

F(s) = 14;
这个算法应该是O(1)

注意正负整数的混合

F(s) = abs(s[0]-s[1]) + abs(s[1]-s[2])+ abs(s[2]-s[3])

如果您从
0、a、a+b、a+b+c
(使用
a
b
c
正数)进行所有排列,您将看到最大值为:

  • a,a+b+c,0,a+b
  • 通过对称
    a+b,0,a+b+c,a
(导致
2*a+3*b+2*c

不可读的解决方案(“排序”到位):

int重新排列(int&a)[4])
{
if(a[3]}//具有固定大小输入的[2]
O(1)
没有什么意义……因为检查24种可能性是
O(1)
…可能赋值的设置器只是意味着,无论输入值是多少(具有固定大小输入的4),代码都应该花费恒定的时间运行?您需要回到他们那里,澄清他们的意思,因为@Jarod42是正确的,
O(1)
对于固定大小的输入没有多大意义。您找到了什么解决方案?是什么让您认为他们不是
O(1)
?显示a。使用多个输入检查24种可能性。您看到模式了吗?您是否有只使用正数的不同策略?混合符号时正值/负值在哪里?最小值/最大值(绝对值)在哪里值?W.L.O.g,你可以只考虑非负数,因为如果你给每个值加一个常量,答案是不变的。@ Kvutur: <代码> { 1, 8, 2,4 } <代码> -> 15,而<代码> { 4, 1, 8,2 } < /代码> -16。
F(s) = abs(s[0]-s[1]) + abs(s[1]-s[2])+ abs(s[2]-s[3])
int rearrange(int (&a)[4])
{
    if (a[3] < a[2]) {
        std::swap(a[3], a[2]);
    } // a[2] <= a[3]
    if (a[1] < a[0]) {
        std::swap(a[1], a[0]);
    } // a[2] <= a[3] && a[0] <= a[1]
    if (a[0] < a[2]) {
        std::swap(a[0], a[2]);
    } // a[2] <= a[3] && a[2] <= a[0] <= a[1] -> a[2] is the min
    if (a[1] < a[3]) {
        std::swap(a[1], a[3]);
    } // a[2] <= a[3] <= a[1] && a[2] <= a[0] <= a[1] -> a[1] is the max
    if (a[3] < a[0]) {
        std::swap(a[3], a[0]);
    } // a[2] <= a[0] <= a[3] <= a[1]
    // as we know order, we might get rid of abs:
    // (a[1] - a[0]) + (a[1] - a[2]) + (a[3] - a[2]);
    return -a[0] + 2 * a[1] - 2 * a[2] + a[3];
}