找到时间复杂度小于O(n)的数组中元素总和的最佳方法

时间:2017-05-23 01:49:32

标签: algorithm data-structures

有使用循环添加整数的标准方法,

/Users/<Username>/AppData/Local/Android/sdk/tools

上述逻辑时间复杂度为O(n),但如果n非常大(考虑10 ^ 10),那么计算需要更多时间。所以,请给我任何能够以低于O(n)时间复杂度工作的解决方案。

2 个答案:

答案 0 :(得分:0)

考虑在块中循环

sum =0;
for(int i =0;i<arraySize; i = i + 5){
     sum+=array[i];
     sum+=array[i+1];
     sum+=array[i+2];
     sum+=array[i+3];
     sum+=array[i+4];
}

当然你需要正确检查是否有界限。

在这个简单的示例中,我怀疑是否有任何收获

答案 1 :(得分:-2)

您可以通过始终记录数组总和来实现此目的。从空数组和空变量sum开始。然后,每当您向数组添加项目时,相应地更新总和。

有两个主要操作影响数字数组的总和:向数组添加新数字,并从数组中删除数字。添加时,总和将成为添加到新数字的先前总和。因此,只需将新数字的值添加到sum变量即可。删除项目时,总和将减去要删除的数量。因此,从sum中减去要删除的项的值。可以执行更多操作,但它们都基于这两种操作。

因此,您可以实施insertpopreplace 方法或函数来为您抽象这项工作。

因此,无论何时添加或删除项目,都需要通过一些O(1)算法来重新计算总和。但是您可以在O(1)时间内访问总和,因为总和在变量中。这当然要求您不要在不使用函数/方法的情况下直接更改数组的值。

不幸的是,我不太清楚C和Java是否足以提供实现。我希望我的数据结构草图有助于实现这一目标。

编辑:这是一个展示概念的Python实现。希望你能从中获得核心。

class ArraySum:
    ''' contains an array of numbers and a representation of the
        sum, which is updated in each insert/pop/replace operation '''
    def __init__(self):
        self._data = []
        self.sum = 0

    def append(self, elem):
    ''' add an item to the array'''
        self.sum += elem # update sum
        self._data.append(elem) # add to array

    def pop(self, i=None):
    ''' remove the item at index i of the array'''
        if i is None:
            i = len(self._data)
        self.sum -= self._data[i]
        return self._data.pop(i)

    def replace(self, i, elem):
    ''' replace the item at i by a new element'''
        self.sum -= self._data[i]
        self.sum += elem
        self._data[i] = elem

if __name__ == '__main__':
    a = ArraySum()

    a.append(4)
    print(a.sum) # sum = 0 + 4 
    a.append(8)
    print(a.sum) # sum = sum + 8 
    a.pop(1)
    print(a.sum) # sum = sum - 8 
    a.replace(0, 1) 
    print(a.sum) # sum = sum - 4 + 1