Se la matrice ha una dimensione di n x m, allora ci sono circa n ^ 2 m ^ 2/4 sottoarray. Se ci sono k valori diversi, possiamo rappresentare ciascuno come un array di bit con k bit. Ciò prende ad esempio k ': = ceil (k / 64) parole a 64 bit.
È abbastanza facile calcolare ciascuno dei set di valori per n ^ 2 m ^ 2/4 sottoarray in un totale di n ^ 2 m ^ 2 k '/ 4 passi. Il numero di bit può essere contato in passi log2 (k), quindi abbiamo un totale di n ^ 2 m ^ 2 k 'log2 (k) / 4 operazioni. In questo caso, 10.000 * 10.000 * 1 * 6/4 = 150 milioni di passaggi. Quindi non un grosso problema. Diventa più interessante se i valori sono più grandi.
Tuttavia, questa ricerca di forza bruta sarebbe abbastanza inefficiente in questo caso (dove ogni cella contiene un numero casuale). Possiamo ragionevolmente calcolare la probabilità che un rettangolo di n numeri contenga k o meno numeri diversi, e che la probabilità scenda rapidamente se n diventa più grande di k. Quindi vorremmo evitare di controllare rettangoli davvero grandi. Ecco come suggerirei di procedere, per un array di n righe e m colonne, cercando il rettangolo più grande con al massimo k diversi numeri:
Gestiamo casi banali: k ≤ 0 significa nessuna soluzione, k ≥ numero di numeri diversi significa (1: n, 1: m) è la soluzione. Quindi trova la soluzione più semplice, che è solo il rettangolo più grande con un'area ≤ k. (Ad esempio, se l'array è 5x5 e k = 7, possiamo trovare banalmente un rettangolo di dimensione 6 ma non di dimensione 7). Lascia che la dimensione del rettangolo sia s ≤ k. Sia maxc (r)="il più grande c in cui non abbiamo dimostrato che un rettangolo con r righe e colonne c e meno di k numeri diversi non può esistere".
Dato un record s, abbiamo quindi bisogno di trovare un rettangolo che è più grande o dimostrare che non esiste. Troviamo una coppia (r, c) con il prodotto più piccolo r c tale che c ≤ maxc (r) e r c > S. Se tale coppia non esiste, allora abbiamo la soluzione ottimale. Altrimenti, cerchiamo un rettangolo di dimensioni r x c con k o meno numeri diversi. Se non viene trovato nessuno, allora impostiamo maxc (i) = min (maxc (i), c - 1) per tutto i ≥ r (non può esserci un rettangolo con r righe o più e con colonne c-1 o più) e prova ancora. Se viene trovato un rettangolo, lo registriamo, aumentiamo s, e riproviamo.