Pregunta

Por definición, los algoritmos son independientes del medio en el que se ejecutan. P.ej. Utilizo tablas de Excel para jugar con estructuras de datos y hacer algunos experimentos de movimiento / barajado / marcado antes de implementar un algoritmo en un lenguaje de programación.

¿Qué herramientas y técnicas utiliza para diseñar y simular la función de un algoritmo? ¿Cómo se usan los programas de dibujo? ¿Un lenguaje de especificación especial?

¿Fue útil?

Solución

Los algoritmos son independientes del lenguaje, cierto. Pero cualquier medio que use es un idioma, punto. El uso de Excel significa que está utilizando Excel '' idioma '' (filas, columnas, celdas, etc.) para expresar parte de su algoritmo. Quizás no sea el producto completo y terminado, pero lo ha expresado en Excel.

Los diagramas UML son un lenguaje para expresar un algoritmo. Un boceto en papel es un lenguaje para la expresión. Es difícil separar el algoritmo ideal platónico de todas las representaciones concretas. No importa lo que hagas, lo estás expresando en algún idioma.

El truco consiste en separar el algoritmo de las características y limitaciones específicas del lenguaje.

Cualquiera " informal " la notación ayudará a hacer esto. El inglés (u otro idioma natural), las matemáticas, los diagramas, etc., son todos candidatos para expresar un algoritmo en un idioma que esté libre de peculiaridades y problemas de implementación.

Comienzo con una descripción general en inglés. Texto sin formato, ni siquiera MS-Word o algo en el que el formato distraiga.

Para cosas realmente complejas, un poco de matemática complementaria ayuda a establecer afirmaciones formales en torno al estado del programa.

Además, los diagramas UML ayudan. Utilizo Argo UML - barato y efectivo.

Para más información sobre este tema, desea leer acerca de los verificación formal .

Otros consejos

Normalmente lo bosquejo en papel, luego intento una implementación rápida en Common Lisp y lo pruebo en REPL.

No uso una herramienta como tal, pero a menudo utilizo un algoritmo en un lenguaje de scripting de alto nivel como Groovy antes de implementarlo en Java.

Creo que con los idiomas de secuencias de comandos de nivel superior no tienes que preocuparte tanto por el lenguaje y puedes concentrarte más en el algoritmo. Luego, cuando haya probado el algoritmo, puede convertirlo en un lenguaje más restrictivo.

Normalmente uso una pizarra blanca (tengo una en el trabajo y dos en casa) para esbozar el algoritmo aproximado y para probar una instancia muy pequeña de un problema. Si necesito codificarlo, escribo un prototipo en Python.

Normalmente solo uso un programa de dibujo cuando necesito escribir documentos de especificaciones formales. Sin embargo, estos normalmente muestran un diseño de mayor nivel que los algoritmos, como usar Visio para diagramas UML.

Supongo que depende de la complejidad del algoritmo.

Muy a menudo dibujaré un boceto rápido de un diagrama de flujo en un papel. Hay algunas excelentes herramientas de diagramación disponibles, pero todavía no he encontrado una que sea tan rápida como un buen boceto a la antigua en un pedazo de papel.

Aparte de eso, a menudo termino lanzando una maqueta realmente 'rápida y sucia' del algoritmo en una aplicación de consola o formularios de Windows VB.NET. Con algunas de las características más recientes, como LINQ-to-SQL, incluso puede armar prototipos que se basan en el acceso a la base de datos en muy poco tiempo.

  

Por definición, los algoritmos son independientes del medio en el que se ejecutan.

¿Qué definición es esa? ¿Quien lo hizo? ¿Y sabían sobre abstracción con fugas ?

Los buenos algoritmos a menudo deben conocer la plataforma que están utilizando. Si eso no fuera cierto, los programas serían paralelizables automáticamente para la GPU y podrían reescribirse sin esfuerzo para que funcionen en computadoras cuánticas.

Dicho esto, muchos algoritmos fundamentales son de hecho independientes de la plataforma. Curiosamente, en realidad me siento más cómodo usando C ++ para jugar con algoritmos. Sin embargo, cuando hago esto, confío en gran medida en un alto nivel de abstracciones, por lo que no juego con punteros o similares. Por otro lado, el STL en realidad ofrece un juego de herramientas bastante rico para jugar con algoritmos.

Y, al igual que Bill, uso mucho mi pizarra. De hecho, tengo una pizarra de 1m * 2m en mi sala de estar. Horripilante. ;-)

Generalmente pirateo algo en Python que implementa el algoritmo. Ignoraré por completo cualquier directriz de codificación sensata; por ejemplo, no crearé clases para almacenar mis datos, pero crearé tuplas cada vez más grandes para contener toda mi información y representar un 'objeto'. Esto es solo para obtener una versión funcional del algoritmo lo más rápido posible. Una vez que lo entienda, lo implementaré de una manera más sensata en el idioma de destino.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top