Fondamentalmente come scopri quale potrebbe essere il tuo caso peggiore o migliore e qualsiasi altro caso "limite" che potresti avere PRIMA di averli e quindi, come prepari il tuo codice per loro?
Fondamentalmente come scopri quale potrebbe essere il tuo caso peggiore o migliore e qualsiasi altro caso "limite" che potresti avere PRIMA di averli e quindi, come prepari il tuo codice per loro?
Risposte:
In base al contenuto dell'algoritmo è possibile identificare quali strutture / tipi / costrutti di dati vengono utilizzati. Quindi, provi a capire i (possibili) punti deboli di quelli e provi a elaborare un piano di esecuzione che lo farà funzionare in quei casi.
Ad esempio, l'algoritmo accetta una stringa e un numero intero come input e esegue un ordinamento dei caratteri della stringa.
Qui abbiamo:
Stringa con alcuni casi speciali noti:
Numero intero con casi speciali noti:
Algoritmo di ordinamento che potrebbe non riuscire nei seguenti casi limite:
Quindi, prendi tutti questi casi e crea un lungo elenco cercando di capire come si sovrappongono. Ex:
Ora crea dei casi di test per loro :)
Breve riepilogo : suddividere l'algoritmo in blocchi di base per i quali si conoscono i casi limite e quindi riassemblarli, creando casi limite globali
Non penso che ci sia alcun algoritmo per determinare le condizioni limite ... solo esperienza.
Esempio: per un parametro byte si desidera testare numeri come 0, 127, 128, 255, 256, -1, tutto ciò che può causare problemi.
Un "bordo" ha due significati ed entrambi sono rilevanti quando si tratta di casi limite. Un bordo è un'area in cui una piccola modifica nell'input porta a una grande modifica nell'output o alla fine di un intervallo.
Quindi, per identificare i casi limite di un algoritmo, per prima cosa guardo al dominio di input. I suoi valori limite potrebbero portare a casi limite dell'algoritmo.
In secondo luogo, guardo il dominio di output e guardo indietro ai valori di input che potrebbero crearli. Questo è meno comunemente un problema con gli algoritmi, ma aiuta a trovare problemi negli algoritmi progettati per generare output che si estendono su un determinato dominio di output. Ad esempio, un generatore di numeri casuali dovrebbe essere in grado di generare tutti i valori di output previsti.
Infine, controllo l'algoritmo per vedere se ci sono casi di input simili, ma che portano a risultati diversi. Trovare questi casi limite è il più difficile, perché coinvolge sia domini che una coppia di input.
Questa è una domanda molto generica, quindi tutto quello che posso fare è buttare via alcune idee vaghe e generali :)
-Esaminare i casi limite. Ex. se stai analizzando una stringa cosa succede se la stringa è vuota o nulla? Se stai contando da x a y cosa succede in xey?
-Codice che potrebbe essere semplificato o DRY-ed out. Qualsiasi complessità non necessaria potrebbe aggiungere cose che potrebbero andare storte.
Parte dell'abilità nell'uso degli algoritmi è conoscere i loro punti deboli e i loro casi patologici. La risposta di Victor fornisce alcuni buoni consigli, ma in generale consiglierei che è necessario studiare l'argomento in modo più approfondito per avere un'idea di ciò, non penso che tu possa seguire le regole empiriche per rispondere pienamente a questa domanda. Ad esempio, vedi Cormen o Skiena (Skiena in particolare ha un'ottima sezione su dove utilizzare gli algoritmi e su ciò che funziona bene in alcuni casi, Cormen approfondisce la teoria secondo me).