Domanda

Per definizione gli algoritmi sono indipendenti dal supporto su cui vengono eseguiti. Per esempio. Uso le tabelle di Excel per giocare con le strutture dati e per fare alcuni esperimenti di spostamento / shuffle / marcatura prima di implementare un algoritmo in un linguaggio di programmazione.

Quali strumenti e tecniche usi per progettare e simulare la funzione di un algoritmo? Come usi i programmi di disegno? Un linguaggio di specifica speciale?

È stato utile?

Soluzione

Gli algoritmi sono indipendenti dalla lingua, vero. Ma qualsiasi mezzo che usi è una lingua, punto. L'uso di Excel significa che stai usando la lingua " (righe, colonne, celle, ecc.) per esprimere alcuni dei tuoi algoritmi. Forse non è il prodotto completo e finito, ma l'hai espresso in Excel.

I diagrammi UML sono un linguaggio per esprimere un algoritmo. Uno schizzo su carta è un linguaggio espressivo. È difficile separare l'algoritmo ideale platonico da tutte le rappresentazioni concrete. Non importa quello che fai, lo stai esprimendo in qualche lingua.

Il trucco è quello di separare l'algoritmo da specifiche funzionalità e limitazioni del linguaggio.

Qualsiasi " informale " la notazione aiuterà a farlo. L'inglese (o altro linguaggio naturale), la matematica, i diagrammi, ecc., Sono tutti candidati per esprimere un algoritmo in una lingua che è priva di stranezze e problemi di implementazione.

Comincio con una panoramica in inglese. Testo semplice, nemmeno MS-Word o qualcosa in cui la formattazione è un distrattore.

Per cose davvero complesse, un po 'di matematica supplementare aiuta a formulare affermazioni formali sullo stato del programma.

Inoltre, i diagrammi UML aiutano. Uso Argo UML - economico ed efficace.

Per ulteriori informazioni su questo argomento, desideri leggere i sistemi verifica formale .

Altri suggerimenti

Di solito lo schizzo su carta, quindi provo una rapida implementazione in Common Lisp e lo collaudo sul REPL.

Non utilizzo uno strumento come tale, ma spesso analizzerò un algoritmo in un linguaggio di scripting di alto livello come Groovy prima di implementarlo in Java.

Trovo che con linguaggi di scripting di livello superiore non devi preoccuparti così tanto della lingua e puoi concentrarti maggiormente sull'algoritmo. Quindi, quando hai provato l'algoritmo, puoi portarlo in un linguaggio più restrittivo.

Normalmente uso una lavagna (ne ho una al lavoro e due a casa) per delineare l'algoritmo approssimativo e per provare un'istanza molto piccola di un problema. Se devo codificarlo, scrivo un prototipo in Python.

Normalmente utilizzo un programma di disegno solo quando devo scrivere documenti di specifiche formali. Questi normalmente mostrano un design di livello superiore rispetto agli algoritmi, come usare Visio per i diagrammi UML.

Suppongo che dipenda dalla complessità dell'algoritmo.

Molto spesso in realtà disegnerò un rapido schizzo di un diagramma di flusso su un foglio. Ci sono alcuni eccellenti strumenti per la creazione di diagrammi disponibili, ma non ne ho ancora trovato uno che sia veloce come uno schizzo vecchio stile su un pezzo di carta.

A parte questo, finisco spesso per mettere insieme un mock up davvero 'rapido e sporco' dell'algoritmo in un modulo Windows VB.NET o in un'applicazione console. Con alcune delle funzionalità più recenti come LINQ-to-SQL, puoi persino mettere insieme prototipi che si basano sull'accesso al database in pochissimo tempo.

  

Per definizione gli algoritmi sono indipendenti dal supporto su cui vengono eseguiti.

Che definizione è quella? Chi lo ha fatto? E sapevano di astrazione che perde ?

Spesso gli algoritmi validi devono conoscere la piattaforma che stanno utilizzando. Se ciò non fosse vero, i programmi sarebbero automaticamente parallelizzabili per la GPU e potrebbero essere riscritti senza sforzo per funzionare su computer quantistici.

Detto questo, molti algoritmi fondamentali sono davvero indipendenti dalla piattaforma. Stranamente, mi sento davvero a mio agio usando C ++ per giocherellare con gli algoritmi. Tuttavia, quando faccio questo, faccio molto affidamento su un alto livello di astrazioni, quindi non gioco con puntatori o cose simili. D'altra parte, l'STL offre in realtà un toolkit abbastanza ricco per giocare con gli algoritmi.

E, come Bill, uso abbastanza la mia lavagna. In realtà ho una lavagna da 1m * 2m nel mio salotto. Raccapricciante. ; -)

In genere ho hackerato qualcosa in Python che implementa l'algoritmo. Ignorerò completamente qualsiasi linea guida di codifica sana, ad esempio, non creerò classi per archiviare i miei dati, ma creerò solo tuple sempre più grandi per contenere tutte le mie informazioni e rappresentare un "oggetto". Questo è solo per ottenere una versione funzionante dell'algoritmo il più velocemente possibile. Una volta capito, lo implementerò in modo più sano nella lingua di destinazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top