Massimo locale 2D
input: matrice bidimensionale An×nA
output: un massimo locale - una coppia tale che A [ i , j ] non abbia una cella vicina nell'array che contiene un valore strettamente maggiore. (i,j)A[i,j]
(Le celle vicine sono quelle tra che sono presenti nell'array.) Quindi, per esempio, se A lo èA [ i , j + 1 ] , A [ i , j - 1 ] , A [ i - 1 , j ] , A [ i + 1 , j ]UN
0324125033014113
quindi ogni cella in grassetto è un massimo locale. Ogni array non vuoto ha almeno un massimo locale.
Algoritmo. Esiste un algoritmo -time: basta controllare ogni cella. Ecco un'idea per un algoritmo più veloce e ricorsivo.O ( n2)
Dato , definisci la croce X in modo che sia composta dalle celle nella colonna centrale e dalle celle nella riga centrale. Prima controlla ogni cella X per vedere se la cella è un massimo locale in A . In tal caso, restituire una cella del genere. Altrimenti, sia ( i , j ) una cella in X con il valore massimo. Da ( i , jUNXXUN( i , j )X non è un massimo locale, deve avere una cella vicina ( i ′ , j ′ ) con un valore maggiore.( i , j )( io', j')
Partizione (l'array A , meno le celle in X ) in quattro quadranti - i quadranti in alto a sinistra, in alto a destra, in basso a sinistra e in basso a destra - in modo naturale. La cella vicina (A ∖ XUNX con valore maggiore deve trovarsi in uno di quei quadranti. Chiama quel quadrante A ′ . ( io', j')UN'
Lemma. Quadrant contiene un massimo locale di A .UN'UN
Prova. Considera di iniziare dalla cella . Se non è un massimo locale, passare a un vicino con un valore maggiore. Questo può essere ripetuto fino ad arrivare a una cella che è un massimo locale. Quella cella finale deve essere in A ′ , perché A ′ è delimitata su tutti i lati da celle i cui valori sono inferiori al valore di cella ( i ′ , j ′ ) . Questo dimostra il lemma. ⋄( io', j')UN'UN'( io', j')⋄
L'algoritmo si chiama ricorsivamente sul sotto-arrayn2× n2 per trovare un massimo locale ( i , j ) lì, quindi restituisce quella cella.UN'( i , j )
Il tempo di esecuzione per una matrice n × n soddisfa T ( n ) = T ( n / 2 ) + O ( n ) , quindiT( n )n × nT( n ) = T( n / 2 ) + O ( n ) . T( n ) = O ( n )
Pertanto, abbiamo dimostrato il seguente teorema:
Teorema. Esiste un algoritmo -time per trovare un massimo locale in un array n × n .O ( n )n × n
O abbiamo?