No excederme en la memoria ni el tiempo

Hola, estaba viendo ejercicios de olimpiadas y quiero conocer la manera en la que puedo ahorrar memoria y tiempo. Ya que los ejercicios que había hecho aparentemente se excedian.

Saludos.

1 me gusta

Hola Euge, si bien hay unas líneas generales, creo que depende del problema que estés intentando, y de qué idea/algoritmo estés usando para resolverlo. ¿Cuales problemas se exedieron de tiempo?

1 me gusta

Aprovecho la oportunidad para recordar que en la wiki hay muchos temas explicados. Quizá alguno de ellos te permita resolver de manera más eficiente los problemas que estás encarando :face_with_monocle:.

Obviamente, si nos decís en concreto qué problema estás queriendo resolver, te podemos dar una respuesta más precisa :wink:.

1 me gusta

Gracias por responder, quiero específicamente las lineas generales, para aprender a evitarlo, por decirlo asi.
El programa que quiero hacer es buscar el máximo y el mínimo de un array.

1 me gusta

La línea general es conocer los algoritmos de manual y cuánto tarda cada uno, en qué momento es mejor usarlos, pros y contras en cuanto a tiempo/memoria, y con este conocimiento evaluás (según el problema) cuál es mejor, y qué adaptaciones hacerle, si fuera necesario. Por ejemplo, si tenés un árbol con pesos y querés encontrar la mínima distancia entre dos nodos, no hace falta correr un Dijkstra, ya que sobre árboles con un DFS alcanza (esto funciona porque hay un único camino entre cada par de nodos). Luego hay algún tip, por ejemplo, evitar hacer muchos push_back en vector (podés reemplazarlo por arrays de C o bien usar el reserve de vector, o bien darle tamaño de antemano y accederlo/asignarle como si fuera un array de C). En funciones recursivas de “fuerza bruta” podés poner como parámetro (o bien global) un variable booleana que te ayude a frenar la búsqueda en ciertos casos, o parar cuando encontras la respuesta, etc. En el caso de buscar mínimo y máximo lo podés hacer con una sola recorrida de for, estilo:

Spoiler
int minimo = v[0], maximo = v[0];
for(int i=1; i<n; i++)
{
    minimo = min(minimo, v[i]);
    maximo = max(maximo , v[i]);
}
1 me gusta

Por las dudas aclaro: Cuando preguntamos cuál es el problema original que se quiere resolver, es porque a veces uno pregunta solo por un subproblema (porque cree que con eso le alcanza), pero en realidad resolver el problema original que interesa involucra más cosas, y solo sabiendo cómo resolver el subproblema no alcanza.

De hecho, es un patrón de (des)comunicación tan común que tiene nombre: Problema X Y.

¡¡Éxitos resolviendo problemas!!

2 Me gusta

Hola, es muy posible que el programa tenga algún error y se esté colgando para siempre. En esos casos, va a salir como “tiempo límite excedido” (porque es imposible dinstinguir si “se colgó para siempre” o si solo va a tardar mucho). Particularmente en los problemas que mencionás creo que es bastante más probable que el problema sea ese (que se cuelgue el programa) a que realmente haya límite de tiempo excedido (pues el límite de tiempo permitido es muy holgado en los problemas iniciales del juez, como el de calcular máximo / mínimo de arreglo).

En el foro siempre estamos dispuestos a ayudar a revisar si compartís el código y el problema en concreto, y así podemos determinar con certeza cuál es de verdad la cuestión :slight_smile:

2 Me gusta