O (n^2) jest możliwe. Sądzę, że jest optymalna, ponieważ masz n^2 komórek.
Należy zauważyć, że lewy górny róg i prawy dolny róg dowolnego kwadratu leżą wzdłuż tej samej przekątnej.
Teraz, jeśli moglibyśmy przetworzyć każdą przekątną w czasie O (n), mielibyśmy algorytm czasu O (n^2).
Powiedzmy, że mamy kandydata na lewy górny róg. Możemy obliczyć liczbę ciągłych czarnych komórek poniżej i na prawo od niego i wziąć minimum dwóch i nazwać je T.
Dla kandydata z prawą dolną, możemy obliczyć liczbę ciągłych czarnych komórek po lewej stronie i na górze, i weź co najmniej dwa, nazwij go B.
Gdy mamy dwie liczby T i B, możemy stwierdzić, czy dany lewy i prawy górny kandydat właściwie daje nam kwadrat ze wszystkimi czarnymi granicami.
Teraz te dwie liczby można obliczyć dla każdej komórki, w czasie O (n^2), wykonując cztery przebiegi całej macierzy (Jak?).
Załóżmy, że to się stało.
Teraz rozważ przekątną. Naszym celem jest znalezienie lewej górnej, dolnej i prawej pary wzdłuż tej przekątnej w czasie O (n).
Załóżmy, że mamy T obliczone w tablicy T [1 ... m], gdzie m jest długością przekątnej. Podobnie mamy tablicę B [1 ... m]. T [1] odpowiada lewemu górnemu krańcowi przekątnej i T [m] prawemu dolnemu. Podobnie z B.
Teraz przetwarzamy przekątną w następujący sposób, dla każdego kandydata z górnej lewej strony, staramy się znaleźć kandydata z prawym dolnym kątem, który da największy kwadrat. Zauważ, że j> = i. Zauważ również, że jeśli (i, j) jest kandydatem, to (i ', j) nie jest, gdzie i>>.
Należy zauważyć, że i i j tworzą kwadrat, jeśli T[i] >= j-i+1
i B[j] >= j-i+1
.
tj. T[i] +i - 1 >= j
i B[j] -j - 1 >= -i
.
Tak więc tworzymy nowe tablice takie, że TL[k] = T[k] + k -1
i BR[k] = B[k] -k - 1
.
Więc biorąc pod uwagę TL dwie nowe tablice i BR, oraz ja, musimy odpowiedzieć na następujące pytania:
Co jest największym j takie, że TL [i]> = j i BR [j ]> = -i?
Załóżmy teraz, że udało nam się przetworzyć BR dla maksymalnych zapytań dotyczących zakresu (można to zrobić w czasie O (m)).
Teraz podając TL [i], w zakresie [i, TL [i]] znajdujemy maksymalną wartość BR, np. BR [j1].
Teraz, jeśli BR [j1]> = -i, znajdujemy maksimum BR w zakresie [j1, TL [i]] i kontynuujemy w ten sposób.
Po znalezieniu kandydata (TL [i], BR [j]), możemy zignorować tablicę BR [1 ... j] dla przyszłego i.
To pozwala nam przetwarzać każdą przekątną w czasie O (n), dając całkowity algorytm O (n^2).
Zostawiłem wiele szczegółów i otrzymałem szkic, który był już zbyt długi. Możesz to edytować, dodając wyjaśnienia.
Uff.
Szalony pomysł: Jeśli macierz jest ogromna, być może dyskretna transformata Fouriera z dobrze dobraną podstawą momemtum-space może dać dobry szacunek w * rozmiarze * wynikowa kwadratowa matryca. Nie mam pojęcia, czy to praktyczne. –
Dla każdej komórki do mnie liniowa ilość pracy brzmi jak O (n^3). – simonpie
Czy widzimy twój algorytm 0 (n^2)? :) Widziałem dyskusję http://discuss.techinterview.org/default.asp?interview.11.445656.19, gdzie wszyscy utknęli w punkcie 0 (n^3). –