Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

472
Vistas
Número de formas de pasar de la esquina superior izquierda a la esquina inferior derecha en la cuadrícula MxN mientras se mueve solo hacia abajo o hacia la derecha. ¿Qué es la complejidad del tiempo y el espacio?

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 :

  • Complejidad espacial - O(n+m)? La pila de llamadas más larga posible parece escalar "linealmente", por lo que, suponiendo una aproximación, sería O (n + m), pero realmente no puedo probarlo o refutarlo.
  • La complejidad del tiempo es exponencial porque cada posición puede crear 2 nuevas posiciones: O (2 ^ n) u O (2 ^ n + m), no estoy seguro de cuál es más adecuado.
 m:n m-1:nm:n-1 m-2:n m-1:n-1 m-1:n-1 m:n-2

Pero 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:

  • Espacio - O(n*m)? La pila de llamadas todavía parece ser lineal, pero ahora tenemos este objeto en crecimiento que se ve en las 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?
  • Tiempo - O(n*m)? - esto es lo más difícil para mí entenderlo. Ya no debería ser exponencial porque se omiten muchos subárboles gracias a las respuestas guardadas, pero no tengo idea de cómo derivar la complejidad del tiempo de una manera "adecuada".
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

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) .

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda