Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Algorithmus zur Fehlererkennung?


lord.paddington - So 23.10.05 21:25
Titel: Algorithmus zur Fehlererkennung?
kennt jemand einen funktionierenden Algorithmus zur Fehlererkennung?

Wenn Fehler neu, dann setze Zähler auf 1
wenn Fehler alt, dann inc Fehlerzähler für diesen Fehler


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
begin
  if dummy = fehler[f] then//gibt es einen Fehler, der gleich dem dummy ist?
  begin
    inc(fehlerx[f]);//inc Fehlerz�ler fr diesen Fehler
  end else begin//wenn nicht gleich...
             fehler[f]:= dummy;//...dann lege einen neuen Fehler an
             fehlerx[f] := 1;//setze Z�ler auf 1
             inc(q);//inc den Gesamtfehlerz�ler
             exit;
            end;
end;


Moderiert von user profile iconGausi: Quote- durch Delphi-Tags ersetzt
Moderiert von user profile iconGausi: Topic aus VCL (Visual Component Library) verschoben am So 23.10.2005 um 21:46


Gausi - So 23.10.05 21:50

Was für Fehler willst du denn automatisch erkennen? Was ist denn deiner Meinung nach überhaupt ein "Fehler"?


lord.paddington - So 23.10.05 21:58

ok, ist ein bisschen irritierend...

streiche Fehler, nimm Büchersammlung

Habe eine Büchersammlung bspw. 1000 Bücher.
Nehme mir jetzt Buch für Buch vor und prüfe...

Lese Titel von Buch eins und prüfe, ob ich das Buch schon habe...
wenn ja, dann setze Zähler für diesen Buchtitel auf 2

Lese Titel von Buch 2 und prüfe, ob ich das Buch schon habe...
wenn nein, dann setze Zähler auf 1 und lege Buchtitel an

u.s.w.


alzaimar - So 23.10.05 22:24

Langsam, aber sofort umzusetzen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
Var
  BookList : TStringlist;

Begin
  Booklist := TStringlist.Create;
  Booklist.Sorted := True;
  ForEach Book in MyBooks do begin
     i := Booklist.indexOf (Book.Title);
     If i=-1 Then
       Booklist.AddObject (Book.Title, Pointer (1))
     else 
       Booklist.Objects[i] := Pointer (Integer (Booklist.Objects[i]) + 1);
     End;
End;

Ich verwende die Objects-Eigenschaft der TStringList, die eigentlich dazu dient, pro String ein Object mit zu speichern, einfach als Zähler.

Schneller wäre das mit einer entsprechend schnellen Datenstruktur, z.B. meinen String-Hashtabellen (such mal nach TStringDictionary hier, oder in der DP). In IniFiles schlummert eine Klasse, die bis ca. 30.000 Strings auch ganz schön schnell ist, die THashedStringList, damit geht o.g. Code viel schneller. Leider degeneriert die Performance bei sehr vielen Strings und dann ist die THashedStringList langsamer als eine normale TStringList..


GTA-Place - Mo 24.10.05 17:20

Record währe hier eventuell angemessen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
type
  TBook = record
    Name: String;
    Anzahl: Integer;
  end;

var
  Book: Array of TBook;


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
var
  FindBook: Integer;
  Found:    Boolean;
begin
  for ...   // Je nachdem wie du deine Bücher holst...
  begin
    Found := False;

    for FindBook := 0 to Length(Book) do
      if Book[FindBook].Name = 'Herr der Ringe' then
      begin
        Found := True;
        Book[FindBook].Anzahl := Book[FindBook].Anzahl + 1;
      end;

    if not (Found) then
    begin
      SetLength(Book, Length(Book) + 1);
      Book[Length(Book) - 1].Name   := 'Herr der Ringe';
      Book[Length(Book) - 1].Anzahl := 1;
    end;
  end;
end;

(ungetestet)