Come si identificano i casi "limite" sugli algoritmi?


25

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?


2
Alternativa: quando possibile, sono un grande fan dei test fuzzy. È incredibile come la mera massa di input generati casualmente possa individuare i bug all'interno di una funzione che non è stata rivelata alcuna quantità di test di controllo / bordo. I due lavorano davvero bene insieme ... e sono ovviamente integrati da errori di registrazione accurati quando vengono eseguiti su input "veri" :)
Matthieu M.

Risposte:


28

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:

  • Stringa vuota
  • Stringa lunga
  • Stringa Unicode (caratteri speciali)
  • Se limitato a uno specifico set di caratteri, cosa succede quando alcuni non sono compresi nell'intervallo
  • Stringa di lunghezza pari / dispari
  • Null (come argomento)
  • Terminato non nullo

Numero intero con casi speciali noti:

  • 0
  • Min / MaxInt
  • Negativo positivo

Algoritmo di ordinamento che potrebbe non riuscire nei seguenti casi limite:

  • Input vuoto
  • 1 elemento di input
  • Input molto lungo (forse di lunghezza massima (tipo di dati utilizzato per l'indice))
  • Immondizia all'interno della raccolta che verrà ordinata
  • Input nullo
  • Elementi duplicati
  • Collezione con tutti gli elementi uguali
  • Input dispari / pari

Quindi, prendi tutti questi casi e crea un lungo elenco cercando di capire come si sovrappongono. Ex:

  • La custodia di stringa vuota copre la custodia di raccolta vuota
  • Null string == null collection
  • eccetera.

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


5
Un'altra cosa da aggiungere. . . analizzare il codice e cercare casi speciali nel codice. Se lo sviluppatore gestisce da 0 a 13 in modo diverso da 14 e superiore - forse lo sviluppatore utilizza algoritmi diversi per valori piccoli e grandi per motivi di prestazioni - hai casi limite a 13 e 14. +1 per un elenco eccezionale.
Ethel Evans,

2

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.


2

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.


0

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.


0

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).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.