Calculer la somme des éléments dans une matrice efficacement
Dans une interview, j'ai demandé si on m'a donné un n*m la matrice de la façon de calculer la somme des valeurs dans un sous-matrice (défini par haut-gauche, bas-droite de coordonnées).
M'a dit que je pouvais pré-processus de la matrice.
M'a dit que la matrice pourrait être énorme, et pourrait donc le sous-matrice de l'algo a dû être efficace. Je suis tombé un peu et n'a pas dit la meilleure réponse.
N'importe qui ont une bonne réponse?
- est la matrice connue pour être fragmentées?
- un quadtree, où chaque nœud contient la somme de ses enfants serait un soutien relativement facile de mettre à jour, mais pas aussi facile résumant comme la réponse la plus simple d'Alan.
- La question commence par "Dans une interview, on m'a demandé". Alors non, pas de devoirs, à moins qu'il existe des situations où les devoirs d'une certaine manière est constitué d'entretiens...
- Oups! 🙂
- La matrice peut être dispersé ou dense, il a mentionné qu'il a besoin de travailler pour n'importe quel cas.
Vous devez vous connecter pour publier un commentaire.
C'est ce qu'a Résumé la Zone Tables sont pour. http://en.wikipedia.org/wiki/Summed_area_table
Votre "prétraitement" étape consiste à construire une nouvelle matrice de même taille, où chaque entrée est la somme de la sous-matrice de la partie supérieure gauche de l'entrée. N'importe quel sous-matrice de la somme peut être calculée par la recherche du mixage et de seulement 4 entrées dans la SAT.
EDIT: Voici un exemple.
Pour la matrice initiale
La SAT est
La SAT est obtenu à l'aide de S(x,y) = (x,y) + S(x-1,y) + S(x,y-1) - S(x-1,y-1),
où S est la SAT et de matrice de a est la matrice initiale .
Si vous souhaitez calculer la somme de l'angle inférieur droit 2x2 sous-matrice, la réponse serait 22 + 0 - 3 - 5 = 14. Ce qui est évidemment le même que 3 + 2 + 2 + 7. Quelle que soit la taille de la matrice, la somme d'une sous-matrice peut être trouvé dans 4 des recherches et 3 de l'arithmétique de la fpo. La construction de la SAT est O(n), de la même façon, nécessitant seulement 4 recherches et 3 mathématiques ops par cellule.
Vous pouvez le faire par programmation Dynamique. Créer la matrice dp avec la taille n*m.
Et pour chaque i, j où
Et pour chaque requête, nous avons lx, rx, ly, ry où lx et rx sont en haut à gauche de coordonnées, ly et ry en bas à droite des coordonnées de la sous-matrice.
Regarder la photo pour comprendre comment l'algorithme fonctionne.
Créer une nouvelle matrice où l'entrée
(i,j)
est la somme des éléments de la matrice d'origine qui ont inférieures ou égalesi
etj
. Alors, pour trouver la somme des éléments de la submatrix, vous pouvez simplement utiliser un nombre constant d'opérations de base sur les coins de la submatrix de votre somme de la matrice.En particulier, trouvez les coins top_left, bottom_left, top_right et bottom_right de votre somme de la matrice, où les trois premiers sont juste à l'extérieur de la submatrix et bottom_right est juste à l'intérieur. Ensuite, votre somme sera
Ci-dessous est un exemple d'implémentation en C en utilisant un Résumé de la Zone Tables concept comme l'explique l'une des réponses ci-dessus.
Python de mise en œuvre pour la même chose peut être trouvé au lien ci-dessous -
http://www.ardendertat.com/2011/09/20/programming-interview-questions-2-matrix-region-sum/
Cela devrait fonctionner. Vous avez toujours à aller à travers chaque élément de la submatrix à faire de plus et ce est la façon la plus simple.
*notez que le code suivant ne peut pas compiler, mais c'est en pseudocode
Edit: Une solution de rechange pré-traitement de la méthode est de créer une autre matrice à partir de l'original contenant la ligne ou la colonne sommes. Voici un exemple:
Original:
Ligne De La Matrice:
Colonne De La Matrice:
Maintenant, il suffit de prendre le point de terminaison de valeurs de x et de soustraire le point de départ des valeurs, de la sorte (pour les lignes de base):
Maintenant, c'est soit O( n ) ou O( m )