Реализация скользящего окна (Java)

1

Я новичок в 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 для возврата min и max самых последних входов. Это я просто сделаю, ища мин и макс.

  • Если количество входов превышает размер окна, самый старый элемент должен быть отброшен.

Извините за неопределенность вопроса - мы никогда не сталкивались с окнами в классе (через несколько недель я узнал что-нибудь о кодировании), поэтому я действительно в тупике. Я огляделся по интернету за некоторыми ресурсами, но еще не нашел ничего подходящего, чтобы помочь мне.

Если у вас есть какие-либо идеи или советы, чтобы предложить, как создать SlidingWindow w, я думаю, что это поможет мне на правильном пути!

Заранее спасибо!

  • 0
    Отправной точкой для этой проблемы является старый добрый метод «ручка и бумага»: визуализируйте поток входных данных (целые числа) и нарисуйте фиксированное окно вокруг них. Затем подумайте о том, как окно начинает скользить, когда вы накапливаете достаточно данных.
  • 0
    Сделано это, но правильно ли я считаю, что окно реализовано в виде списка FIFO? Я чувствую себя совершенно невежественным!
Показать ещё 1 комментарий
Теги:
arrays
linked-list
sliding-window

2 ответа

8

Для скользящего окна самым простым может быть счетчик для числа вставки. Как это:

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++;
    }
}

Таким образом, вы можете использовать массив фиксированного размера и заменить старое значение более новыми, как только массив будет заполнен, без изменения содержимого.

  • 0
    Спасибо за ответ. Несколько вопросов о том, правильно ли я понимаю: вы создаете в int "ct", чтобы посчитать количество вставок, которые вы делаете. Затем создайте массив «хранилище» определенного размера. Не могли бы вы объяснить свой метод поставить? Я не уверен, что понимаю концепцию.
  • 1
    Счетчик считает, сколько вставок вы сделали. Хранилище содержит все значения, которые в данный момент находятся в окне. вставки будут работать следующим образом: counter % storage.length рассчитывает от 0 до storage.length и начинает снова с 0.
Показать ещё 6 комментариев
0

Я предоставляю вам легкое и относительно простое решение. Я даю код из двух 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

Я только оставил проверку длины окна не должен быть больше, чем массив.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню