Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.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_Data Structures_Segment Tree - Fatal编程技术网

Algorithm 一个范围内不同元素的和

Algorithm 一个范围内不同元素的和,algorithm,data-structures,segment-tree,Algorithm,Data Structures,Segment Tree,考虑一个数组(基于0的索引),我必须找到 所有可能范围[i,n]的元素,其中0

考虑一个数组(基于0的索引),我必须找到 所有可能范围[i,n]的元素,其中0 例子: O(n^2)解决方案是一种可能的解决方案,我读过持久段树也可以做到这一点,尽管我找不到好的教程

它能在不到O(N^2)的时间内解决吗

如果有人指向持久段树,请解释或提供一些好的链接?

这可以通过简单的动态规划算法在O(n)中完成

从数组的后面开始,使用一个基于散列的容器来存储您已经遇到的数字。最后一个元素的值,即
sum\u range[n-1]
设置为
arr[n-1]
。在此之后,
sum\u range[i]
的值应计算如下:

  • 如果
    arr[i]
    不在所看到的数字集合中,
    sum\u range[i]=sum\u range[i+1]+arr[i]
  • 否则,
    sum\u range[i]=sum\u range[i+1]
由于检查散列容器的值的成本为O(1),并且将项目添加到散列容器的成本为n个项目的摊销成本为O(1),因此该算法的总体成本为O(n)

与使用O(1)空间的O(n2)算法相比,此算法为哈希容器使用额外的O(n)空间。

切片数组(O(n)),然后使用集合并向集合添加值

在python3.x代码中,在注释后编辑:

array=[1,2,1,3,5]
范围总和=0
总和=0
valueset=set()
对于反向(数组)中的val:
如果val不在valueset中:
valueset.add(val)
范围_sum+=val
总和+=范围总和
打印(总计)

在哪里可以得到带有set的log n?OP要求“所有可能范围[i,n]的不同元素之和”。这不能回答这个问题。您是否有哈希插入和查找复杂性的来源?我总是听说这最多是O(log(n)),因为碰撞。我找不到任何支持或反对这一点的来源。@ArthurHavlicek dasblinkenlight的算法更好,但另一种策略是对数组中位于范围内的部分进行排序(
O(n log n)
),然后遍历排序后的数组,同时对与其前辈不同的元素进行求和(
O(n)
),总体时间复杂度为
O(n logn)
arr={1,2,1,3}

sum_range[0,3]={1,2,3}=6
sum_range[1,3]={1,2,3}=6
sum_range[2,3]={1,3}=4
sum_range[3,3]={3}=3