Ricerca…


Algoritmo della finestra scorrevole Informazioni di base

L'algoritmo della finestra scorrevole viene utilizzato per eseguire l'operazione richiesta su dimensioni specifiche della finestra di un determinato buffer o array di grandi dimensioni. La finestra parte dal primo elemento e continua a spostarsi a destra di un elemento. L'obiettivo è trovare i numeri k minimi presenti in ogni finestra. Questo è comunemente noto come problema o algoritmo della finestra scorrevole.

Ad esempio, per trovare l'elemento massimo o minimo da ogni elemento n in un determinato array, viene utilizzato l'algoritmo della finestra scorrevole.

Esempio:

Input Array: [1 3 -1 -3 5 3 6 7]

Dimensione della finestra: 3

Elemento massimo da ogni 3 elementi dell'array di input:

+---------------------------------+---------+
|      Windows Position           |   Max   |
+------------+----+---+---+---+---+---------+
|[1   3   -1]| -3 | 5 | 3 | 6 | 7 |    3    |
+------------+----+---+---+---+---+---------+
| 1 |[3   -1   -3]| 5 | 3 | 6 | 7 |    3    |
+---+-------------+---+---+---+---+---------+
| 1 | 3 |[-1   -3   5]| 3 | 6 | 7 |    5    |
+---+---+-------------+---+---+---+---------+
| 1 | 3 | -1 |[-3   5   3]| 6 | 7 |    5    |
+---+---+----+------------+---+---+---------+
| 1 | 3 | -1 | -3 |[5   3   6]| 7 |    6    |
+---+---+----+----+-----------+---+---------+
| 1 | 3 | -1 | -3 | 5 |[3   6   7]|    7    |
+---+---+----+----+---+-----------+---------+

Elemento minimo da ogni 3 elementi dell'array di input:

+---------------------------------+---------+
|      Windows Position           |   Min   |
+------------+----+---+---+---+---+---------+
|[1   3   -1]| -3 | 5 | 3 | 6 | 7 |   -1    |
+------------+----+---+---+---+---+---------+
| 1 |[3   -1   -3]| 5 | 3 | 6 | 7 |   -3    |
+---+-------------+---+---+---+---+---------+
| 1 | 3 |[-1   -3   5]| 3 | 6 | 7 |   -3    |
+---+---+-------------+---+---+---+---------+
| 1 | 3 | -1 |[-3   5   3]| 6 | 7 |   -3    |
+---+---+----+------------+---+---+---------+
| 1 | 3 | -1 | -3 |[5   3   6]| 7 |    3    |
+---+---+----+----+-----------+---+---------+
| 1 | 3 | -1 | -3 | 5 |[3   6   7]|    3    |
+---+---+----+----+---+-----------+---------+

Metodi per trovare la somma di 3 elementi:

Metodo 1:

Il primo modo è usare l'ordinamento rapido, quando il pivot è in posizione Kth, tutti gli elementi sul lato destro sono maggiori di pivot, quindi, tutti gli elementi sul lato sinistro diventano automaticamente K gli elementi più piccoli di un determinato array.

Metodo 2:

Mantieni un array di elementi K, riempilo con i primi elementi K di un determinato array di input. Ora dall'elemento K + 1, controlla se l'elemento corrente è inferiore all'elemento massimo nell'array ausiliario, se sì, aggiungi questo elemento all'array. L'unico problema con la soluzione di cui sopra è che dobbiamo tenere traccia dell'elemento massimo. Ancora praticabile Come possiamo tenere traccia dell'elemento massimo in un insieme di numeri interi? Pensa al mucchio. Pensa al mucchio di Max.

Metodo 3:

Grande! In O (1) otterremmo il massimo elemento tra gli elementi K già scelti come elementi K più piccoli. Se max nel set corrente è maggiore dell'elemento appena considerato, dobbiamo rimuovere max e introdurre un nuovo elemento nel set di K l'elemento più piccolo. Heapify di nuovo per mantenere la proprietà heap. Ora possiamo facilmente ottenere elementi minimi di K nella matrice di N.

Spazio ausiliario: O(n)

Complessità del tempo: O(n)

Implementazione dell'algoritmo della finestra scorrevole in C #

public class SlidingWindow
{
    public static int[] MaxSlidingWindow(int[] input, int k)
    {
        int[] result = new int[input.Length - k + 1];
        for (int i = 0; i <= input.Length - k; i++)
        {
            var max = input[i];
            for (int j = 1; j < k; j++)
            {
                if (input[i + j] > max) max = input[i + j];
            }
            result[i] = max;
        }
        return result;
    }

    public static int[] MinSlidingWindow(int[] input, int k)
    {
        int[] result = new int[input.Length - k + 1];
        for (int i = 0; i <= input.Length - k; i++)
        {
            var min = input[i];
            for (int j = 1; j < k; j++)
            {
                if (input[i + j] < min) min = input[i + j];
            }
            result[i] = min;
        }
        return result;
    }

    public static int[] MainMax(int[] input, int n)
    {
        return MaxSlidingWindow(input, n);
    }

    public static int[] MainMin(int[] input, int n)
    {
        return MinSlidingWindow(input, n);
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow