Áttekintés a keresési algoritmusok a maximális submatrices, Intel® szoftver

A probléma a maximális részmátrix (Maximum Subarray probléma):

Úgy véljük, a kétdimenziós tömb a [1. m, 1 n] bemenetként. A feladat megtalálni a maximális részmátrixot (a továbbiakban: MSP) a maximalizálása a tömb egy [K. I, L. j], azaz, és így a megfelelő indexek (K, L) és (I, J). Azt feltételezzük, hogy a bal felső sarokban a koordinátái (1, 1).

MSP oldatot először által javasolt Bentley. Aztán javult Tamaki és Tokuyama. Bentley született köbös idő az algoritmus. Tamaki és Tokuyama kapott további al-köbös idő majdnem egy négyzetes mátrix. Ez az algoritmus rekurzív és nagyon összetett. Tadao Takaoka további egyszerűsített algoritmus Tamaki és Tokuyama egy szakadék-és-uralkodj módszer al-kocka elérve idő bármilyen derékszögű mátrix.

Tegyük fel, hogy m ≤ n, az általánosság elvesztése nélkül. Bentley MSP algoritmus megoldja az idő O (m ^ 2 * n). ő használ Kadane algoritmus egydimenziós esetre, azaz a lineáris időben.

Algoritmus Kadane / * maximális subarray egy [k..l] tömb egy [1..n] * /

(K, L): = (0, 0); s: = -∞; t: = 0; j: = 1;
i: = 1-től n-do kezdeni
t: = t + a [i];
ha t> s ezután kezdődik (k, l): = (j, i); s: = t végén;
ha t <0 then begin t := 0; j := i + 1 end
vég

Sajnos, az ötlet Kadane nem működik kétdimenziós esetben.

Tamaki és Tokuyama algoritmus megoldja ezt a problémát egy al-köbös időt, ahol ez a négyzetes mátrix prakchticheski: m = O (n).

Osszuk a mátrix négy központi, függőleges és vízszintes vonalak. Mi lesz megnevezni a bal felső sarokban, jobb felső, bal alsó, majd a jobb alsó részén a NW (északnyugat), ÉK, délnyugati és délkeleti részein, ill. Mi határozza meg a három hagyományos megoldás. Először is, a legnagyobb al-mátrix, amely keresztezi a központtól, fogják hívni, mint egy A_center. Ez a probléma ismert, mint a központi feladat. Másodszor, a legnagyobb al-mátrix, amely metszi a vízszintes vonal, - A_row. Ez a probléma az úgynevezett sorban-központú. A harmadik al-mátrixot, amely keresztezi a függőleges vonal jelzi A_column. Ez a probléma az úgynevezett oszlop-központú. Az algoritmus vázlatosan az rekurzív formában alábbi:

  • Ha a mátrix válik egydimenziós, vízszintes vagy függőleges, - a probléma megoldásának Kadane algoritmus lineáris időben. egyébként:
  • hagyja A_NW lesz megoldás a NW-rész,
  • A_NE - megoldás NE-része,
  • A_SW - megoldás SW-része,
  • A_SE - SE-alkatrészek.
  • A_row - megoldás sor-központú célok.
  • A_column - megoldás oszlop-központú probléma.

A döntés az egész probléma lenne a legtöbbet hozza ki a hat.

Az algoritmus megoldására a sor-központú feladatok:

  • Osztjuk a mátrix két részre függőleges vonal.
  • Let A_left - megoldás a bal oldali sorban központú célokat.
  • A_right - megoldás jobb oldali sorban-központú célok.
  • A_center - megoldás a központi probléma.
A megoldás a legfeljebb három.


Az algoritmus az oszlop-központú probléma

  • Osztjuk a mátrix két részre egy vízszintes vonal.
  • Legyen A_upper lesz megoldás a felső oszlop-központú probléma.
  • A_lower - megoldás az alsó oszlop-központú probléma.
  • A_center - a döntést a központi feladatokat.
A megoldás általában maximum három.

Most, a központi problémát meg lehet oldani a következő módon. Tegyük fel, hogy a részleges összegeket mátrix elemek a Northwest, északkeleti, délnyugati, délkeleti a központ - S_NW [i, j], S_NE [i, j], S_SW [i, j] és S_SE [i, j ], ill. Például, S_NW [i, j] - része az elemek egy [i..m / 2, j..n / 2]. Ezek a részleges összegeket lehet kiszámítani egy időben O (mn). Ezután A_center lehet számítani, mint


Ha fix i, k, a keresés a legnagyobb lehet csökkenteni, ha az oldathoz DMM feladatok (távolság mátrix szorzás) az első két tag és az utolsó kettő. Megjegyezzük továbbá, hogy meg kell, hogy ültessék át és S_SW S_SE, amelynek eredményeként a megoldás a DMM. Így a problémát meg lehet oldani O (M (m, n)), ahol M (m, n) - működési ideje a "szorzás" mátrix mérete távolság (m, n) és (n, m). A végén, ez az algoritmus megoldódott az időben:


T (m, n) = O (m ^ 2 * n (log (log (m)) / log (m)) ^ 0,5 * log (n / m)).

Algoritmus Tadao Takaoka
Először azt kell számítani az összessége prefix s [i, j] az mátrixok, mint például a [1..i, 1..j], minden i és j restrikciós s [i, 0] = s [0, j] = 0. Nyilvánvaló, hogy ez történik az időben O (mn). Megmutatjuk, hogy az oszlop-központú probléma nélkül megoldható rekurziót. Diagram az alábbiakban ismertetjük. Megjegyezzük továbbá, hogy nem kell, hogy megoldja a egydimenziós probléma van, és az előtag összegeket igényelnek számolás csak egyszer.


Az alap algoritmus
  • Ha a mátrix egyetlen elem - visszaadja az értéket.
különben
  • ha m> n, a mátrix elfordul 90 fokkal.
Így m ≤ n.
  • Let A_left - megoldás a bal felét.
  • A_right - megoldás a jobb felét.
  • A_column - megoldás oszlop-központú probléma.
Az általános megoldás - maximum három.


Most oszlop-központú probléma megoldható a következő módon.


Mi fix i, k, és maximalizálja a fennmaradó távú változás l és j. Akkor ez egyenértékű a következő kifejezést:
i = 1 m és k = 1 i - 1.


Legyen s * [i, j] = -s [j, i]. Aztán ez a kifejezés lehet csökkenteni:

Az első részben - DMM minimális, a második - DMM a legnagyobb. Legyen az S1 és S2 mátrix, amelynek elemei (i, j) a s [i, j - 1] s [i, j + n / 2], ill. Bármely T mátrix, legyen T * - kapott mátrix T átültetésével és elutasítást. Ezután, a felső kifejezések lehet számítani „szorozni” S1 és S1 * egy minimális és így egy alacsonyabb háromszögmátrix, „megszorozva” S2 és S2 * a maximális és egyre alacsonyabb háromszögmátrix, és végül kivonjuk az utolsó előző mátrix. Kiszámításával maximumot - kap a választ.

DMM (Távolság mátrixszorzással)
A cél az, hogy kiszámítja a távolságot DMM termék (távolság termék) C = AB a két n-dimenziós matritsA = a [i, j] és B = B [i, j], amelynek elemei - valós számok.


A lényege c [i, j] - legrövidebb távolság a vertex i az első réteg tetejére j a harmadik réteg a aciklusos orientrirovannom oszlopot három rétegből álló csúcsok. Ezek a csúcsok számozott 1. n minden egyes rétegben, és a távolság a i-től j első réteget a második réteg - [i, j] i és a második réteg a harmadik réteg j - b [i, j]. Nyilvánvaló, hogy ez a kifejezés könnyen vezethet számítani a maximális helyett minimális - ez a probléma megtalálni a legnagyobb traktusban.

A megoldás erre a problémára ebben a cikkben fogjuk hagyni, annak következtében, az a tény, hogy ez nem egy algoritmus kiszámításához a maximális submatrices. Ugyanakkor megjegyezzük, hogy a döntés Tadao takaokai ez időt vesz igénybe az O (n ^ 2 * log n).

Ami algoritmus Tadao takaokai az MSP - nyilván a leggyorsabb algoritmus az összes ismert ebben az időben. Dolgozik során O (n ^ 3 * log (log (n)) / log (n)).

További információ a lehetőségek fordító optimalizáció, tekintse meg optimalizálási közlemény.