Zitat von
negaH:
Alleine der Overhead um den Boyer-More zu initialisieren dauert länger
Für das Problem der kurzen konstanten Elemente gleicher Länge und geringer Anzahl hat Du mit Sicherheit Recht. Vielleicht doch ein Hashing, in dem konkreten Fall kann der gesamte String sogar auf ein DWord gemappt werden, so dass das Hashing eineindeutig und trivial zu errechnen ist, ohne dass die Übersichtlichkeit verloren geht (die Klammerung soll denjenigen Helfen, die sich bei der Priorität der Operatoren nicht sicher fühlen):
Delphi-Quellcode:
function IndexOfMonth(const AName: String): Integer;
const
Hash_Jan = (Ord('J') shl 16) or (Ord('A') shl 8) or Ord('N');
Hash_Feb = (Ord('F') shl 16) or (Ord('E') shl 8) or Ord('B');
Hash_Mar = (Ord('M') shl 16) or (Ord('A') shl 8) or Ord('R');
Hash_Apr = (Ord('A') shl 16) or (Ord('P') shl 8) or Ord('R');
Hash_May = (Ord('M') shl 16) or (Ord('A') shl 8) or Ord('Y');
Hash_Jun = (Ord('J') shl 16) or (Ord('U') shl 8) or Ord('N');
Hash_Jul = (Ord('J') shl 16) or (Ord('U') shl 8) or Ord('L');
Hash_Aug = (Ord('A') shl 16) or (Ord('U') shl 8) or Ord('G');
Hash_Sep = (Ord('S') shl 16) or (Ord('E') shl 8) or Ord('P');
Hash_Oct = (Ord('O') shl 16) or (Ord('C') shl 8) or Ord('T');
Hash_Nov = (Ord('N') shl 16) or (Ord('O') shl 8) or Ord('V');
Hash_Dec = (Ord('D') shl 16) or (Ord('E') shl 8) or Ord('C');
begin
if Length(AName)<>3 then
Result:= 0
else
case (Ord(UpCase(AName[1])) shl 16) or
(Ord(UpCase(AName[2])) shl 8 ) or
Ord(UpCase(AName[3])) of
Hash_Jan: Result:= 1;
Hash_Feb: Result:= 2;
Hash_Mar: Result:= 3;
Hash_Apr: Result:= 4;
Hash_May: Result:= 5;
Hash_Jun: Result:= 6;
Hash_Jul: Result:= 7;
Hash_Aug: Result:= 8;
Hash_Sep: Result:= 9;
Hash_Oct: Result:= 10;
Hash_Nov: Result:= 11;
Hash_Dec: Result:= 12;
else
Result:= 0;
end;
end;
Zitat von
negaH:
Wieso [die anzahl der Iterationen ist doch bekannt]? Es sind exakt 12 Iteration maximal.
Die Formulierungen "exakt
p" und "genau
p" sind nach meinem (mathematischen) Empfinden synonym zu "
p und nur
p" zu verwenden und sind nicht äquivalent zu "
p oder maximal
p". Um genau zu sein, entspricht die Aussage "
p oder maximal
p" der Aussage "maximal
p"
Formal:
Code:
x=p v x<=p <=> x<=p != x=p
und damit ist die Anzahl der Iterationen nicht bekannt.
Zitat von
negaH:
ich kann dir nicht zustimmen [..] das bedingte Schleifen [..] einfachere Schleifen sind als [..] Zählschleifen.
Das habe ich auch nicht behauptet. In Deinem Fall allerdings verwendest Du zu eine Schleife mit einer nach Definition genauen Anzahl von Iterationen mit einer zusätzlichen Fallunterscheidung und einem Konstrukt, dass noch nicht einmal in jeder Programmiersprache vorgesehen ist, dazu, etwas zu tun, wofür eine andere Schleifenform definiert worden ist, nämlich dem Iterieren bis eine bei jeder Iteration zu berechnenen Abbruchbedingung erfüllt ist.