c# - 数组的平衡索引如何工作?

标签 c# arrays algorithm

我在 Codility 上尝试了一个演示测试,用于查找数组的平衡索引。我不确定测试是为了找到数组的平衡索引还是什么。我四处搜索,发现了以下示例:

The equilibrium index of a sequence is an index such that the sum of elements at lower indexes is equal to the sum of elements at higher indexes. For example, in a sequence A:

A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0

3 is an equilibrium index, because:

A[0] + A[1] + A[2] = A[4] + A[5] +A[6]

6 is also an equilibrium index, because:

A[0] + A[1] + A[2] + A[3] + A[4] + A[5] = 0

根据此信息,我看到测试数组包含 7 个元素。中间元素 A[3]=2 似乎被忽略了。是因为它在前3个元素和后3个元素之间吗?这个例子中的平衡指数 6 是如何得出的?

这是用来计算这个的方法:

int equi(int arr[], int n) {
    if (n==0) return -1; 
    long long sum = 0;
    int i; 
    for(i=0;i<n;i++) sum+=(long long) arr[i]; 

    long long sum_left = 0;    
    for(i=0;i<n;i++) {
        long long sum_right = sum - sum_left - (long long) arr[i];
        if (sum_left == sum_right) return i;
        sum_left += (long long) arr[i];
    } 
    return -1; 
}  

当我进行 Codility 演示测试时,我使用了方法(如下)和最初从 0 开始的 for 循环。我收到了 1 测试用例的“错误答案”消息, 5, 2, 1, 4, 0 并且 Codility 正在寻找结果 11。

我修改了方法中的两个 for 循环,并在 i = 1 开始第一个循环,在 i = 2 开始第二个循环直到它产生 11 的结果,Codility 对此感到满意。我基本上只是调整方法,直到 Codility 满意为止(我拍摄 11,因为 Codility 指定这是他们正在寻找的答案),但我真的不知道为什么 Codility 很高兴或者我的调整有什么意义 -只是命中注定:

        ...
        int[] B = new int[] { 1, 5, 2, 1, 4, 0 };

        Console.WriteLine(solution3(B));
    }

    public int solution3(int[] A)
    {
        long rsum = 0;

        for (int i = 1; i < A.Count(); i++)
            rsum += A[i];

        long lsum = A[0];
        int min = (int)Math.Abs(lsum - rsum);
        
        for (int i = 2; i < A.Count() - 1; i++)
        {
            lsum += A[i];
            rsum -= A[i];
            int diff = (int)Math.Abs(lsum - rsum);
            if (diff >= min)
                min = diff;
        }

        return min;
    } 

为什么这种调整(命中与未命中)满足了 Codility 测试?什么是均衡指数?它是如何到达的?注意:如果步骤 A 和步骤 E 之间有步骤(我必须凭直觉判断步骤之间的步骤),那么步骤 B、C 和 D 是什么?

最佳答案

什么是平衡指数,它是如何确定的?

将您的阵列想象成一 block 板上有不同大小的重物(负重可以被认为是附着在板上的氦气球)。每个重量从左到右编号。你的任务是在木板下方的任何编号位置放置一个支点,以使木板保持平衡。 (我们将棋盘本身视为失重,并假设重量与中心的距离无关紧要。)使棋盘平衡的位置是均衡指标。支点处的重量不“重要”,因为它不在任何一侧;它在中间。

这是第一个例子的图片:

Equilibrium index = 3

这里,3是均衡指数,因为支点左边的权重之和等于支点右边的权重之和(-7 + 5 + 1 = -1 = -4 + 3 + 0).

这是第二个例子:

Equilibrium index = 6

出于同样的原因,我们看到 6 也是一个均衡指数。支点左边的所有元素加起来为零。由于支点右侧没有元素,因此该和也为零。

找到平衡指标的基本算法是这样的:

  1. 遍历数组并将所有元素相加。称此总和为总计
  2. 将变量 left_sum 初始化为零。
  3. 将变量right_sum 初始化为total
  4. 现在再次遍历数组。对于每个数组项:
    1. right_sum 中减去当前项的值。
    2. 比较 left_sumright_sum。如果相等,则当前项的指标为均衡指标。
    3. 将当前项的值添加到left_sum

这就是它的全部。现在有意义吗?


我的算法怎么了?

至于为什么“Codility 演示测试”期望包含元素 { 1, 5, 2, 1, 4, 0 } 的数组的结果为 11,我不能说。您从未在问题中说过演示问题实际上是什么。如果问题是在该数组中找到第一个平衡索引,那么答案是该数组没有。逐步完成上述算法,这里是每个数组索引的左右总和:

Index  Left  Right
-----  ----  -----
    0     0     12
    1     1      7
    2     6      5
    3     8      4
    4     9      0
    5    13      0

如您所见,不存在左和等于右和的索引。 11 的预期结果甚至没有任何意义,因为只有六个元素。所以如果这个数组有一个平衡索引,它必须在 0 到 5 之间(含)。所以我猜提出的问题一定是别的原因。在我开始猜测你的算法为什么正确或不正确之前,你必须在你的问题中包含问题陈述。

关于c# - 数组的平衡索引如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45394265/

相关文章:

java - java中int类型数组的4个字节是否分布在数组的元素中?

algorithm - 如何有效地实现二元决策图(BDD)?

c# - 更好的淡化 winform 的算法

c# - WPF 模板和绑定(bind)到 GridView 中的 DataContext

c# - 为什么 C# 编译器在 XML 文档中包含非公共(public)成员?

arrays - JSONB 或整数数组

java - 如何按字母顺序对数组排序,标点符号优先

algorithm - 分组符号最大长度平衡子序列

java - Java 中的对象池模式

c# - 使用 C# 和正则表达式将字符添加到空的 html 标签