Resuelvo muchos problemas, principalmente de Top Coder. Recibiré respuestas para muchos, pero la mayoría de las veces termino con una solución ineficiente.
En implementaciones del mundo real, ¿realmente importa que una solución al problema sea eficiente? Si es así, ¿cómo puedo mejorarlo?
problem-solving
Hormiga
fuente
fuente
Respuestas:
La mejor solución es la que es (en orden de importancia creciente) eficiente, mantenible y realizada .
^^^ Eso es lo único que realmente necesita tomar de esta respuesta. ^^^
La eficiencia es importante . Tal vez un poco menos de lo que solía ser debido a nuestra abundancia de hardware, pero el rendimiento es una característica . En un concurso, la eficiencia es obviamente importante. Debe saber cómo escribir código eficiente. Más importante aún, debe conocer las mejores prácticas que producirán un código eficiente y de buen rendimiento sin sacrificar la puntualidad o facilidad de mantenimiento de una aplicación. Aquí es realmente donde la profundidad de la experiencia con una plataforma y un lenguaje arroja muchos rendimientos.
Sin embargo, lo más importante (en el 95% de los casos) es tener una solución completa y mantenible. Sin un producto terminado , no importa cuán eficiente o sostenible sea la solución. Si le lleva una cantidad extraordinaria de tiempo rastrear y corregir un error o agregar una nueva función, no importa cuán eficiente sea la solución. Pero, la eficiencia y el rendimiento son sin duda importantes, sin importar lo que alguien pueda decir.
fuente
Estoy de acuerdo con Mike Cellini, lo único que agregaría es.
¿Es algo "suficientemente eficiente"? Por ejemplo, desde el punto de vista del usuario, no hay mucha diferencia entre una función que se completa en 0.00001 segundos o una que se completa en 0.1 segundos a pesar de que una es mucho más eficiente que la otra. Una función que se completa en 10 minutos no es muy diferente (para el usuario) a una función que se completa en 12 minutos. En ambos casos, el usuario tomaría una taza de café o continuaría con otra tarea.
He llegado a ver la eficiencia como "un usuario eficiente", no como un algoritmo eficiente.
fuente
En general, la solución más importante para un problema será la que realmente exista y sea válida para los casos tal como existen para su problema. En otras palabras, evite la optimización prematura hasta que sepa que tiene un código ineficiente o un código eficiente que debe ser más rápido.
Además, no olvide que la mejor solución para su aplicación puede no ser la solución de caso general. Caso y punto, hace un par de años, un profesor le dio a nuestra clase un problema en el que íbamos a imprimir los primeros 10 números de un tipo dado (lo siento, mi memoria me falla en cuanto al tipo, pero fue uno de los números más inusuales clases) y nos hicieron una prueba para verificar que el número fuera del tipo dado. Este fue el alcance del problema que se nos dio y se nos dijo que debía entregarse al día siguiente y que la solución más eficiente recibiría el crédito completo. En la siguiente conferencia, el profesor resumió los resultados:
La solución final fue considerada la más eficiente por el profesor. Resulta que el problema era en realidad un ejercicio para comprender completamente el problema y no solo para salir y encontrar la solución más eficiente.
El punto de lo anterior es que cuando se trata de encontrar una solución eficiente a un problema, generalmente es mejor pasar el tiempo para asegurarse de que realmente comprende cuál es el problema antes de comenzar a escribir código o intentar optimizar el código. Si puede almacenar un conjunto de valores de referencia en una matriz constante, es mejor hacerlo desde el punto de vista del rendimiento que intentar escribir un algoritmo sofisticado.
Del mismo modo, no olvide que para la mayoría de las aplicaciones, las únicas personas que tienden a ver código ineficiente (¡cuando no es innecesariamente ineficiente!) Son los propios desarrolladores. Si escribe un código limpio que solo hace exactamente lo que debe hacer, lo más probable es que la mayoría de las veces los usuarios no noten problemas de rendimiento al trabajar con su programa y cuando simplemente optimizan las partes que mencionan tú.
fuente
Eso depende de la estructura del concurso, pero en general, sí: el rendimiento es una consideración la mayor parte del tiempo, según su documentación . A veces, como en el enlace posterior, debes cazar, pero para citar:
La mejor manera de mejorar en esto es escribir código que sea eficiente, lo que ya está haciendo. Incluso si completa el trabajo, dedique tiempo a mejorar su eficiencia, incluso después de la competencia, y eso dará sus frutos.
Probablemente también desee invertir en teoría, como libros sobre algoritmos , que pueden brindarle dos cosas: herramientas más eficientes para resolver un problema específico y mecanismos más eficientes para identificar cuál es el problema que debe resolver.
Finalmente, los cursos de informática están cada vez más disponibles en línea y cubrirán los antecedentes que necesita para mejorar.
fuente
La eficacia de una solución debe depender de varios factores. Lo más importante es saber lo que quiere tu usuario. Aquí hay algunos ejemplos.
Cómo hacer que su código sea más eficiente:
Hay un campo completo para la optimización, pero los dos consejos anteriores deberían al menos ayudarlo a comenzar.
fuente
Para una competencia, debe comprender quiénes son los jueces y de qué se trata: si están buscando grandes programadores y nada más, obtendrán felicitaciones por un código más eficiente.
Como regla, en el mundo real, no importa. Una de las ideas clave del desarrollo de software es "No optimice lo que no sabe necesita optimización", luego "Optimice solo cuando se haya demostrado que es necesario"
Muchos practicantes argumentarán que esto conduce a un código hinchado e ineficiente que no se puede arreglar fácilmente, y en algunos casos extremos (de lo que se jactan como si eso fuera lo que la mayoría de los programadores hacen todo el día todos los días) son correctos. Sin embargo, no muchos proyectos de desarrollo de software tienen resultados medidos "Rendimiento: más rápido de lo necesario, costo: a quién le importa, tiempo de entrega: en algún momento de esta década", en el mundo real, generalmente es "lo quiero barato, lo quiero ayer, quiero a trabajar ".
fuente