当前位置: 首页 > 知识库问答 >
问题:

移动窗口的最小/最大值能否达到O(N)?

罗飞宇
2023-03-14

我有输入数组A

 A[0], A[1], ... , A[N-1]

我想要函数Max(T, A)返回B表示A上的最大值在大小T的前一个移动窗口中

 B[i+T] = Max(A[i], A[i+T])

通过使用最大堆跟踪当前移动窗口A[i]到A[it]上的最大值,该算法产生O(N log(T))最坏情况。

我想知道有没有更好的算法?可能是O(N)算法

共有3个答案

东郭元魁
2023-03-14

图像处理中有一个子领域叫做数学形态学。您正在实现的操作是该领域的一个核心概念,称为膨胀。显然,这个操作已经被广泛研究,我们知道如何非常有效地实现它。

解决这个问题的最有效算法是在1992年和1993年由van Herk、Gil和Werman独立提出的。该算法只需要每个样本进行3次比较,与T的大小无关。

几年后,Gil和Kimmel进一步改进了算法,使每个样本只需要2.5次比较。虽然方法复杂性的增加可能会抵消比较的减少(我发现更复杂的代码运行得更慢)。我从未实现过此变体。

所谓的HGW算法需要两个与输入大小相同的中间缓冲区。对于大得离谱的输入(数十亿个样本),您可以将数据拆分为块并按块处理。

html" target="_blank">排序中,您向前遍历数据,计算大小为T的块的累计最大值。你也一样向后走。每个样本都需要进行一次比较。最后,结果是这两个临时数组中的每一个都有一个以上的最大值。对于数据位置,可以同时对输入进行两次传递。

我想你甚至可以做一个运行版本,其中临时数组的长度为2*T,但实现起来会更复杂。

>

  • van Herk,“矩形和八角形核上局部最小和最大滤波器的快速算法”,模式识别字母13(7):517-5211992(doi)

    Gil,Werman,“计算二维最小、中值和最大滤波器”,IEEE模式分析和机器智能交易15(5):504-5071993(doi)

    Gil,Kimmel,“有效的扩张、侵蚀、打开和关闭算法”,IEEE Transaction on Pattern Analysis and Machine Intelligence24(12):1606-1617, 2002(doi)

    (注:代码审查相关问题交叉发布。)

  • 梅飞龙
    2023-03-14

    它被称为RMQ(范围最小查询)。实际上,我曾经写过一篇关于这一点的文章(使用c代码)。看见http://attiix.com/2011/08/22/4-ways-to-solve-±1-rmq/

    或者您可能更喜欢wikipedia,范围最小查询

    准备完成后,您可以在O(1)中获取任何给定范围的最大数量

    锺离伟彦
    2023-03-14

    O(N)可以使用Deque数据结构。它保存成对(值;索引)。

    at every step:
    
      if (!Deque.Empty) and (Deque.Head.Index <= CurrentIndex - T) then 
         Deque.ExtractHead;
      //Head is too old, it is leaving the window
    
      while (!Deque.Empty) and (Deque.Tail.Value > CurrentValue) do
         Deque.ExtractTail;
      //remove elements that have no chance to become minimum in the window
    
      Deque.AddTail(CurrentValue, CurrentIndex); 
      CurrentMin = Deque.Head.Value
      //Head value is minimum in the current window
    
     类似资料:
    • NowCoder 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。 例如,如果输入数组 {2, 3, 4, 2, 6, 2, 5, 1} 及滑动窗口的大小 3,那么一共存在 6 个滑动窗口,他们的最大值分别为 {4, 4, 6, 6, 6, 5}。 解题思路 // java public ArrayList maxInWindows(int[] num, int size)

    • 一、题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。 举例说明 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小为3,那么一共存在6个滑动窗口,它们的最大值分别为{4,4,6,6,6,5}。 二、解题思路 如果采用蛮力法,这个问题似乎不难解决:可以扫描每一个滑动窗口的所有数字并找出其中的最大值。如果滑动窗口的大小为k,需要O(k)时间才能找出滑动窗口里的最大值

    • 有这么多参考文献来寻找大小为k的所有子阵列的最小值/最大值,但是如何以最好的可能方式找到第n个最大值/最小值。如果我们必须找到子阵列的最小值/最大值,那么我们可以使用具有线性时间复杂度的deque解决方案。但是对于第n分钟/最长时间,我无法找到解决方案。 注意:n 例如:arr = {7,1,4,20,11,17,15} n=2,k=4 输出:4,4,11,15

    • 问题内容: 我想创建一个数组,其中包含通过给定numpy数组移动的窗口的所有es。很抱歉,这听起来令人困惑。我举一个例子。输入: 我的窗口宽度为5的输出应为: 每个数字应为输入数组宽度5的子数组的最大值: 我没有在numpy中找到一个开箱即用的函数来做到这一点(但是如果有一个,我不会感到惊讶;我并不是一直以numpy开发人员的想法来思考)。我考虑过为输入创建偏移的2D版本: 然后,我可以对此进行申

    • 问题内容: 如何在0(1)时间复杂度的任何时间从队列中检索max和min元素?早些时候,我使用Collections.max和min查找元素,但这将是0(n)。 问题答案: 您只有2种方法来获得最小/最大操作的O(1): 如果结构已排序,并且您知道最大值/最小值位于何处 如果结构未排序且仅允许插入:每次插入项目并分别存储值时,您可以重新计算最小值/最大值 如果结构未排序并且允许插入和删除:我认为您

    • 我刚开始使用JFace/SWT进行GUI编程。在我使用普通SWT窗口(http://help.eclipse.org/indigo/index.jsp?topic=%2forg.eclipse.wb.ercp.doc.user%2fhtml%2fwizards%2fercp%2fapplication_window.html)之前,我第一次尝试了JFace应用程序窗口。 现在我要设置这个窗口的最小