Einzelnen Beitrag anzeigen

choose

Registriert seit: 2. Nov 2003
Ort: Bei Kiel, SH
729 Beiträge
 
Delphi 2006 Architect
 
#18

Re: Monatskürzel "Jan".."Dec" in 01..12

  Alt 30. Jan 2004, 09:36
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.
gruß, choose
  Mit Zitat antworten Zitat