【问题标题】:Difference of elements of 1 unsorted array within given interval给定区间内 1 个未排序数组的元素差异
【发布时间】:2016-10-18 18:31:30
【问题描述】:

假设我们有一个由整数组成的未排序数组。我们还有 2 个给定的整数 L 和 M。我们的任务是计算所有具有以下属性的 (i,j) 对的数量: L

除了检查所有可能对的显而易见的蛮力算法(O(n^2) 复杂度),有没有更快的方法来解决这个问题?

【问题讨论】:

  • 在最坏的情况下,您的输出大小本身是O(n^2)。考虑数组[1,1,1,1,1,1...,1]L=M=0。您需要输出所有对,这是二次的。也就是说,您可以在O(f(n) + m) 中执行此操作,其中m 是输出大小,f(n)o(n^2)(此处为小符号),如果这有助于我可以尝试思考一些事情。

标签: arrays algorithm


【解决方案1】:

我假设您只需要计算不同对的数量,否则您无法期望比 O(n^2) 更好的最坏情况复杂度。

您可以在 O(nlogn) 时间内对数组进行排序,以跟踪原始数组索引。

然后只需扫描已排序的数组并维护两个指针,以便它们指向的索引之间的所有元素在[L, M] 范围内具有绝对差异。这部分可以在线性时间内完成。

【讨论】:

  • This part can be done in linear time.,不是微不足道的(至少我看不到一种简单的方法)。考虑 [1,2,3,4,...,n] 和 L=0,M=k>1 您将需要使用两个指针来回移动(例如获取 (1,4) 然后返回 (2,3),导致它是二次的 - 除非你有一些技巧来防止它并为返回的次数设置硬性上限。
  • @amit,说 L = 0,M = 4。你让指针 lo,hi 指向 1,并不断增加 hi 直到 A[hi]-A[lo]
  • 想我明白了。需要几分钟考虑一下,但对我来说看起来不错。+1,感谢您的解释。
  • 答案似乎很有用,但说实话,我不是算法方面的老手。您能否提供更多详细信息?
【解决方案2】:

通过维护 order statistics trees,可以在 O(nlogn) 中查找此类对的数量。

for each element x:
  find x-L (or closest and higher element) in the tree. Let its index be i1.
  finx x-M (or closest and smaller element) in the tree. Let its index be i2.
  element x is part of i2-i1+1 pairs where x is the higher from the prefix of the array.
  add this value to the sum.
  Repeat for x+L,x+M
  add x to the tree.

这是O(nlogn),每次添加和搜索都是O(logn)。这是完成n 次,所以总共O(nlogn)


下界复杂度:在代数树模型下,它不能比O(nlogn) 做得更好,因为这样做可以解决Omega(nlogn) 中的element distinctness problem,这已知是不可能的。
因此,这个模型下的问题是Omega(nlogn)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多