El problema : encuentre varias formas posibles desde la esquina superior izquierda hasta la esquina inferior derecha en la cuadrícula MxN mientras solo puede moverse hacia abajo o hacia la derecha.
Aquí hay dos algoritmos que he escrito. Los resultados se ven bien, pero no puedo descifrar la complejidad del tiempo y el espacio, tengo algunas conjeturas sobre cuáles podrían ser las complejidades, pero no puedo probarlas de una manera "adecuada".
Algoritmo ingenuo:
function gridTravel(m, n) { if(m<1 || n<1) return 0; if (m === 1 || n === 1) return 1; return gridTravel(m-1, n) + gridTravel(m, n-1); }; console.log(gridTravel(10,10));Mis conjeturas :
m:n m-1:nm:n-1 m-2:n m-1:n-1 m-1:n-1 m:n-2Pero nuevamente, no me siento seguro con esta explicación porque no es un árbol simétrico, simplemente lo parece al principio.
Algo ingenuo + memorización:
seenGrids = {}; const gridTravel = (m, n) => { if(m<1 || n<1) return 0; if (m === 1 || n === 1) return 1; if (`${m}:${n}` in seenGrids || `${n}:${m}` in seenGrids) { return seenGrids[`${m}:${n}`] || seenGrids[`${n}:${m}`]; } seenGrids[`${m}:${n}`] = gridTravel(m-1, n) + gridTravel(m, n-1); return seenGrids[`${m}:${n}`]; };Mis conjeturas:
seenGrids que, según mi intuición, ¿debería escalar de forma cuadrática? No tengo idea de cómo probarlo o refutarlo, cuando ejecuté console.log(Object.keys(seenGrids).length) para una cuadrícula de 200x200 , obtuve 19900 , que no es ni m*n ni m+n , por lo que es lineal. o cuadrático?Primer algoritmo:
Para la complejidad del tiempo, ¡la prueba más fácil es tu método! Me refiero al árbol de cálculo de la función recursiva. Como puede ver, hay un árbol binario para la expansión y la longitud máxima del árbol es min(n,m) . Por lo tanto, la complejidad del tiempo está en O(2^(min(m,n))) .
Para la complejidad del espacio, como ha notado, el cálculo de la pila se realizará en profundidad. Por lo tanto, como la rama máxima de cada nodo es 2 y la longitud máxima del árbol es min(m,n) (como se discutió en el párrafo anterior), la complejidad del espacio será 2 min(m,n) .
Segundo algoritmo :
Como la máxima combinación diferente de entradas es m * n ([1, 2, ..., m] y [1, 2, ..., n] para la primera y la segunda entrada de la función, respectivamente), y el peor caso de la llamada de pila está en O(min(m, n)) , la complejidad del espacio está en O(m * n) , que es el tamaño de la matriz de memoria.
Para la complejidad del tiempo, podemos asegurar que cada elemento de la matriz se calculará una vez (como se memoriza). Por lo tanto, independientemente de la complejidad de las devoluciones de llamada recursivas, y debido a la computación de la recursividad primero en profundidad (de abajo hacia arriba), la complejidad de tiempo del segundo algoritmo está en O(m * n) .