【问题标题】:Best way to find the sum of elements in an array with less than O(n) time complexity找到时间复杂度小于 O(n) 的数组中元素总和的最佳方法
【发布时间】:2017-05-23 01:49:32
【问题描述】:

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

sum =0;
for(int i =0;i<arraySize;i++){
     sum+=array[i];
}

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

【问题讨论】:

  • 让我们看看:你想对数组中的每个元素求和......但你想要比查看数组中的每个元素更快的东西,嗯......祝你好运!注意:您 可以 获得“更快”(例如,并行运行单独的线程、在 GPU 上执行、使用指针算法而不是索引等)...但是您 不能 i> 提高 O(n) 的“算法复杂度”。
  • 多线程可以提高计算时间。
  • 是的,这不可能。
  • 必须访问所有元素,除非有特殊信息,例如所有元素都相同(或正则序列)。
  • A)你在交叉标记 B)不清楚你在问什么。不可能访问小于 N 步的 N 个数组槽。我们不能仅仅因为你不喜欢现实的行为方式就改变现实。

标签: algorithm data-structures


【解决方案1】:

考虑在块中循环

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];
}

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

在这个微不足道的例子中我怀疑有什么收获

【讨论】:

  • 这不会改变复杂性。
  • 不仅如此,它还会在arraySize%5 非零时尝试越界读取。
  • @TobySpeight 我的回答很清楚地指出您需要正确检查是否越界
【解决方案2】:

您可以通过始终记录数组的总和来做到这一点。从一个空数组和一个空变量sum 开始。然后,每当您向数组中添加一个项目时,相应地更新总和。

有 2 个主要操作会影响数字数组的总和:向数组中添加一个新数字,以及从数组中删除一个数字。相加时,总和变为先前加到新数的总和。因此只需将新数字的值添加到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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-24
    • 2019-10-12
    • 2015-05-25
    • 2023-01-16
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多