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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.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
Algorithm 给定序列的平衡指数:找到平衡指数的最佳算法是什么?_Algorithm_Language Agnostic_Math - Fatal编程技术网

Algorithm 给定序列的平衡指数:找到平衡指数的最佳算法是什么?

Algorithm 给定序列的平衡指数:找到平衡指数的最佳算法是什么?,algorithm,language-agnostic,math,Algorithm,Language Agnostic,Math,序列的平衡指数是一个指数,使得较低指数的元素之和等于较高指数的元素之和。例如,在序列a中: A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0 3是一个平衡指数,因为: A[0]+A[1]+A[2]=A[4]+A[5]+A[6] A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0 6也是一个平衡指数,因为: A[0]+A[1]+A[2]=A[4]+A[5]+A[6] A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=

序列的平衡指数是一个指数,使得较低指数的元素之和等于较高指数的元素之和。例如,在序列a中:

A[0]=-7 A[1]=1 A[2]=5 A[3]=2 A[4]=-4 A[5]=3 A[6]=0
3是一个平衡指数,因为:

A[0]+A[1]+A[2]=A[4]+A[5]+A[6]
A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0
6也是一个平衡指数,因为:

A[0]+A[1]+A[2]=A[4]+A[5]+A[6]
A[0]+A[1]+A[2]+A[3]+A[4]+A[5]=0
(零元素之和为零)7不是平衡指数,因为它不是序列a的有效指数。 如果你还有疑问,这是一个精确的定义:整数k是序列的平衡指数当且仅当且仅当和

假设零元素之和等于零。写一个函数

int equi(int[] A);
给定一个序列,返回其平衡指数(any),如果不存在平衡指数,则返回-1。假设序列可能很长

  • 计算
    A中所有元素的总和
  • 对于每个索引
    i
    ,计算从
    A[0]
    A[i-1]
    的元素总和,直到总和等于
    (totalSum-A[i])/2

  • 请注意,从
    A[0]
    A[i-1]
    的元素之和可以作为运行总数进行跟踪,这意味着整个算法的复杂性为O(n)。作为代码实现留给读者作为练习。

    这里有一个使用
    O(n)
    内存的解决方案。计算
    S[i]=A[0]+A[1]+…+A[i]
    。然后子序列
    [i,j]
    的和是
    和(i,j)=S[j]-S[i-1]
    S[x<0]=0

    因此,对于从
    0
    A.Length-1的每个
    i
    检查
    Sum(0,i-1)=Sum(i+1,A.Length-1)


    事实上,如果允许您销毁给定的数组,您甚至不需要
    S
    ,您可以在
    A

    伪代码中完成这一切-最坏的情况是通过A进行2次

    R = sum(A)
    L = e = 0
    for i = 0 .. A.size
      L+=e
      R-=(e=A[i])
      return i if L==R
    end
    return NULL
    
    a=(-7,1,5,2,-4,3,0)

    sumleet=0

    sumright=0

    对于范围内的i(len(a)):


    这可能会在任意序列上失败,因为平衡指数并不总是包含序列的所有元素。在序列{1,2,3,4,5,10}中,根据给定的定义,4将是一个平衡指数,但是元素0-3的和是10,这小于元素的和除以2。事实上,没有元素的子集和这个值相加,但是有一个平衡指数。是的,所以要修正答案
    ,如果我们发现部分和大于整个和的一半,返回-1@Harper,我没有看到“均衡指数”的定义排除了该指数的值。我已经更新了我的答案。看来我明白了。有道理,并且通过了我能看到的测试。保持它为O(n)只会使它更好。对于那些试图阅读它的人来说,顺序是
    {-7,1,5,2-4,3,0}