A un algoritmo tipico sarebbe il seguente, con indici di stringa che vanno da 0 a M-1.
Restituisce la posizione della corrispondenza o -1 se non trovata.
foreach hpos in range 0 thru len(haystack)-len(needle):
found = true
foreach npos in range 0 thru len(needle):
if haystack[hpos+npos] != needle[npos]:
found = false
break
if found:
return hpos
return -1
Ha una performance ragionevole dal momento che controlla solo il maggior numero di personaggi in ogni posizione pagliaio come necessario per scoprire non c'è alcuna possibilità di un incontro.
Non è necessariamente l'algoritmo più efficiente, ma se il tuo intervistatore si aspetta che tu conosca tutti gli algoritmi ad alte prestazioni in cima alla tua testa, sono irrealistici (vale a dire, pazzi). Un buon sviluppatore conosce bene le basi e come trovare le cose avanzate se necessario (ad es., Quando c'è un problema di prestazioni, non prima).
La prestazione varia tra O (a) e O (ab) a seconda dei dati effettivi nelle stringhe, dove aeb sono rispettivamente il pagliaio e le lunghezze dell'ago.
Un possibile miglioramento consiste nel memorizzare, all'interno del ciclo npos, la prima posizione superiore a hpos, in cui il carattere corrisponde al primo carattere dell'ago.
In questo modo è possibile saltare gli hpos in avanti nella prossima iterazione poiché si sa che non ci può essere una corrispondenza possibile prima di quel punto. Ma ancora, potrebbe non essere necessario, a seconda dei requisiti di prestazione. Dovresti calcolare da solo l'equilibrio tra la velocità e la manutenibilità.
Ottenuto a metà strada digitando una risposta quando l'ho visto, ho letto l'articolo e ho capito che era la stessa cosa. Non ne ho mai sentito parlare prima, ma nel '94 ho usato qualcosa di simile per una macchina a stati di match pattern binario. Oh bene. –