【问题标题】:Sliding Window Algorithm滑动窗口算法
【发布时间】:2021-07-01 14:51:00
【问题描述】:

我知道滑动窗口算法的时间复杂度是o(N),但是可变大小滑动窗口算法的时间复杂度是多少。

例如-

数组 = [1,2,3,4,5,6]

当滑动窗口大小 = 1 窗口 - [1]、[2]、[3]、[4]、[5]、[6]

当滑动窗口大小 = 2 窗口 - [1,2]、[2,3]、[3,4]、[4,5]、[5,6]

当滑动窗口大小 = 3 窗口 - [1,2,3], [2,3,4], [3,4,5], [4,5,6]

等等……

窗口大小的范围为 1 到 n(窗口大小的有效值)。如果创建单个窗口的成本为 O(N),那么创建 N 个窗口的成本为 O(N^2)?

【问题讨论】:

  • 窗口大小的变量也是参数吗?看起来像 O(n) 无论如何。问题是:对于任何i,您访问array[i] 多少次?答案是所有窗口大小中的 2 个,一次被推到窗口的头部,一个从尾部出队。
  • 无论滑动窗口大小,使用滑动窗口的算法都是O(n)。
  • 窗口大小的范围为 1 到 n(窗口的有效值)。如果创建单个窗口的成本为 O(N),那么创建 N 个窗口的成本为 O(N^2)?
  • 如果你想创建一个大小为n 的窗口,那么你会得到一个滑动窗口。为什么会是O(n^2)
  • 是的,但是对于大小为n 的数组,大小为n 的滑动窗口是...一个窗口。包含整个数组。

标签: algorithm data-structures time-complexity pseudocode sliding-window


【解决方案1】:

在一个数组上运行一个滑动窗口是 O(n) 与窗口的大小无关。

头指针和尾指针对于所有窗口大小都是单调递增的。相比之下,典型的嵌套循环二次算法对每个外部索引 i 运行从 in 的内部索引 j

这里的假设是,除了双端队列提供和轮询(每个 i 的时间恒定)之外,您没有做任何额外的工作,例如为每个 i 循环窗口。

如果您要创建从 1nn 窗口,您将回到经典的嵌套循环二次算法 O(n^2)。

【讨论】:

    猜你喜欢
    • 2011-05-06
    • 1970-01-01
    • 2010-11-14
    • 2011-01-13
    • 2018-08-27
    • 2017-09-23
    • 2020-07-01
    • 2012-01-06
    • 2021-06-25
    相关资源
    最近更新 更多