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

Algorithm 在时间复杂度小于O(n)的数组中查找元素和的最佳方法,algorithm,data-structures,Algorithm,Data Structures,有一种标准的方法可以使用类似循环的 sum =0; for(int i =0;i<arraySize;i++){ sum+=array[i]; } sum=0; 对于(int i=0;i您可以通过始终保留数组总和的记录来执行此操作。从一个空数组和一个空变量sum开始。然后,每当您向数组中添加项时,相应地更新总和 影响数字数组总和的主要操作有两种:向数组中添加新数字和从数组中删除数字。添加时,总和将成为添加到新数字的前一个总和。因此,只需将新数字的值添加到sum变量中即可。删除项

有一种标准的方法可以使用类似循环的

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

对于(int i=0;i您可以通过始终保留数组总和的记录来执行此操作。从一个空数组和一个空变量
sum
开始。然后,每当您向数组中添加项时,相应地更新总和

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

因此,您可以实现
insert
pop
replace
方法或函数来为您抽象这项工作

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

不幸的是,我对C和Java都不太了解,无法提供一个实现。我希望我对数据结构的描述能对此有所帮助

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

类数组sum:
''包含一个数字数组和
在每次插入/弹出/替换操作“”中更新的总和
定义初始化(自):
self._data=[]
self.sum=0
def附加(自我,元素):
''将项添加到数组''
self.sum+=元素#更新和
self._data.append(elem)#添加到数组
def pop(自身,i=None):
''删除数组''索引i处的项'
如果我没有:
i=长度(自身数据)
self.sum-=self.\u数据[i]
返回self.\u data.pop(i)
def更换(自身、i、elem):
''用新元素替换i处的项''
self.sum-=self.\u数据[i]
self.sum+=elem
自身数据[i]=元素
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
a=ArraySum()
a、 附加(4)
打印(a.sum)#sum=0+4
a、 附加(8)
打印(a.sum)#sum=sum+8
a、 流行音乐(1)
打印(a.sum)#sum=sum-8
a、 替换(0,1)
打印(a.sum)#sum=sum-4+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];
}
sum=0;

对于(int i=0;请看:您希望对数组中的每个元素求和…但您希望比查看数组中的每个元素更快,嗯…祝您好运!注意:您可以“更快”(例如,并行运行单独的线程,在GPU上执行,使用指针算术而不是索引等)但您无法提高性能O(n)的“算法复杂性”。你可以通过多线程来提高计算时间。是的,这是不可能的。除非有特殊信息,例如所有元素都相同(或规则序列),否则必须访问所有元素。A)你在交叉标记B)不清楚您要求的是什么。不可能访问N个小于N步的阵列插槽。我们不能仅仅因为您不喜欢现实的行为方式而改变现实。这不会改变复杂性。不仅如此,当
arraySize%5
为非零时,它还会尝试读取超出范围的内容。@TobySpeight我的答案非常正确早期状态需要正确检查越界