【问题标题】:Implementing a sliding window (java)实现滑动窗口(java)
【发布时间】:2015-06-16 08:28:27
【问题描述】:

我对java(和整体编程)相当陌生,并且已经收到了从头到尾实现Sliding Window对象的任务。骨架代码如下:

import java.util.Scanner;

//implement class SlidingWindow

class Main {

// this is the test code for the judge, do not modify
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int windowSize = scanner.nextInt();
    SlidingWindow window = new SlidingWindow(windowSize);
    while (scanner.hasNextInt())
    {
        int value = scanner.nextInt();
        window.Put(value);
        System.out.println("[" + window.Min() + " " + window.Max() + "]");
    }
    scanner.close();
}

需要做什么(以及到目前为止我解决它的想法)

  • 创建一个滑动窗口 w,可以用窗口大小 n 实例化:

    SlidingWindow w = New SlidingWindow(n) //这是最让我难过的地方——它是一个自增长的数组吗?链表?

  • 一种接受整数且没有返回值的输入法Put:

    public static void Put(int value){ // 实现将依赖于SlidingWindow

  • 返回最近输入的最小值和最大值的 Max 和 Min 方法。我将通过寻找最小值和最大值来做到这一点。

  • 如果输入的数量超过了窗口的大小,最旧的元素应该被丢弃。

很抱歉这个问题含糊不清——我们在课堂上从来没有处理过窗户(我有几周的时间来学习任何关于编码的东西)所以我真的很难过。我在网上四处寻找一些资源,但还没有找到任何适合帮助我的东西。

如果您对如何创建 SlidingWindow w 有任何想法或建议,我认为这将使我走上正轨!

提前致谢!

【问题讨论】:

  • 这个问题的起点是古老的“笔和纸”方法:可视化输入流(整数)并在它们周围绘制一个固定窗口。然后想想当你积累足够的输入时窗口是如何开始滑动的。
  • 做到了,但我认为窗口被实现为 FIFO 列表是否正确?感觉自己一头雾水!
  • 是的,可以使用固定大小的 FIFO 队列作为窗口。但是,有is no implementation for this in the Java API,因此您需要自己编写 FIFO 或使用 Apache Commons 或 Guava 等实用程序库。

标签: java arrays linked-list sliding-window


【解决方案1】:

我在此提供一个简单且相对简单的解决方案。我给出了两个 java 文件的代码。

班级:

    public class Window {           
        public void getValue(int[] a, int w){   
            int t = 0;      
            for(int i=0;i<a.length;i++){
                if(i==a.length-w+1){
                    break;
                }else{
                    for(int j=i;j<i+w;j++){
                        if(t<a[j]){
                            t = a[j];
                        }
                    }
                }           
                System.out.println(t);
                t = 0;
            }
        }   
    }

主要方法:

    public class MainMethod {       
        public static void main(String[] args) {
            int[] a = new int[]{1, 3, -1, -3, 5, 3, 6, 7};
            int w = 3;
            Window ob = new Window();
            ob.getValue(a, w);
        }
    }


    Answer: 3 3 5 5 6 7

我只检查了窗口的长度不应该大于数组。

【讨论】:

    【解决方案2】:

    对于滑动窗口,最简单的可能是插入次数的计数器。像这样:

    class Window{
        int ct = 0;
        int[] storage; 
    
        public Window(int size){
             storage = new int[size];
        }
    
        public void put(int i){
             storage[ct % storage.length] = i;
             ct++;
        }
    }
    

    这样,您可以使用固定大小的数组,并在数组填满后立即将最旧的值替换为较新的值,而无需移动内容。

    【讨论】:

    • 感谢您的回复。关于我是否理解正确的几个问题:您在 int "ct" 中创建以计算您所做的插入次数。然后创建一个特定大小的数组“存储”。你能解释一下你的方法吗?我不确定我是否掌握了这个概念。
    • 计数器会计算您插入的次数。 storage 保存当前在窗口中的所有值。插入将以这种方式工作:counter % storage.length 从 0 计数到 storage.length 并从 0 重新开始。
    • 基本上这相当于使用storage[ct] = i;并在末尾添加if(ct == storage.length)ct = 0;
    • 感谢您的澄清。我仍然停留在 w 实现的第一部分——我需要声明一个大小为 windowSize 的数组窗口。关于如何解决这个问题的任何提示?我是 Java 新手,所以感谢您提出愚蠢的问题!
    • 数组创建很简单,我会编辑帖子显示它
    猜你喜欢
    • 2014-03-28
    • 2015-02-20
    • 2017-09-04
    • 2021-08-10
    • 2015-07-13
    • 2022-11-27
    • 2017-09-23
    • 2021-06-25
    • 1970-01-01
    相关资源
    最近更新 更多