Mysql
 sql >> Database >  >> RDS >> Mysql

Matrice di ricerca per tutti i rettangoli di dimensioni date (selezionare blocchi di sedi)

Questo problema è risolto molto meglio al di fuori di MySQL, in un'altra lingua. In altre parole, hai una matrice di posti, alcuni dei quali sono occupati (quelli grigi):

e vuoi trovare tutti i rettangoli di determinate dimensioni , diciamo 3x5. Puoi farlo in modo molto efficiente con due passaggi linear O(n) tempo algoritmo (n è il numero di posti):

1) in un primo passaggio , vai per colonne, dal basso verso l'alto, e per ogni posto, indica il numero di posti consecutivi disponibili fino a questo:

ripetere, fino a:

2) in un secondo passaggio , vai per righe e cerca almeno 5 numeri consecutivi maggiori o uguali a 3:

quindi, finalmente, ottieni:

che fornisce la soluzione:queste sequenze numeriche (aree verdi) sono i bordi superiori dei 2 possibili rettangoli 3x5 di posti liberi.

L'algoritmo potrebbe essere facilmente migliorato ad es. ottieni tutti i rettangoli con area massima. Oppure, potrebbe essere utilizzato per trovare qualsiasi regione continua (non solo a forma di rettangolo) di N sedi - solo, durante il secondo passaggio, cercare una sequenza continua di numeri che riassuma almeno N.