[Algorithmus] Binäre Suche für Zeichenketten
Hat jemand von euch eine Idee, wie man eine binäre Suche für Zeichenketten realisieren könnte? Das Problem ist ja, dass man Zeichenketten ja nicht auf größer oder kleiner vergleichen kann - oder doch?
|
Re: [Algorithmus] Binäre Suche für Zeichenketten
|
Re: [Algorithmus] Binäre Suche für Zeichenketten
Äh, ja mir ist auch gerade eingefallen dass man die Vregleiochsoperatoren auch auf Strings anwenden kann. Hat sich also erledigt.
Aber irgendwas stimmt noch nicht:
Delphi-Quellcode:
Suche ich nach einer Zeichenkette, die nicht vorkommt, bekomme ich gleich beim ersten Vergleich
function TBSearch.Search(SortedStrArray: TStrArray; s: String): Integer;
var left : Integer; middle : Integer; right : Integer; found : Boolean; index : Integer; begin found := False; index := -1; left := 0; right := Length(SortedStrArray); while (left <= right) and (not Found) do begin middle := left + ((right - left) div 2); if (SortedStrArray[middle] = s) then begin index := middle; Found := True; end; if (SortedStrArray[middle] > s) then right := middle - 1 else left := middle + 1; end; result := index; end;
Delphi-Quellcode:
eine AccessViolation. Irgendwas stimmt da nicht.
if (SortedStrArray[middle] = s) then
|
Re: [Algorithmus] Binäre Suche für Zeichenketten
aender mal die Zeile um
Delphi-Quellcode:
//middle := left + ((right - left) div 2);
middle := (left + right) div 2; |
Re: [Algorithmus] Binäre Suche für Zeichenketten
Ändert nichts an der AV. middle hat auch einen gültigen Wert. Wie kann ein Vergleich eine ASV auslösen?
Zitat:
|
Re: [Algorithmus] Binäre Suche für Zeichenketten
Hallo Michael,
nimm dir ein Beispiel an der Methode TStringList.Find() - deren Implementierung ist best practise, da der Rückgabewert für Index bei Misserfolg die Stelle bezeichnet, an der die Einfügung vorzunehmen wäre. Freundliche Grüße |
Re: [Algorithmus] Binäre Suche für Zeichenketten
Der Vergleich führt nicht zur Zugriffsverletzung, sondern der Versuch, auf das Element 'middle' zuzugreifen, welches dann vermutlich außerhalb des Bereiches ist. Ändere mal diese Zeilen;
Delphi-Quellcode:
in
left := 0;
right := Length(SortedStrArray);
Delphi-Quellcode:
left := Low (SortedStrArray);
right := High(SortedStrArray); |
Re: [Algorithmus] Binäre Suche für Zeichenketten
Zitat:
@marabu: Hm, wäre eine Option, allerdings nutze ich den Rückgabewert schon, für die Position, wo das Element gefunden wurde und -1 entspricht "nicht gefunden". |
Re: [Algorithmus] Binäre Suche für Zeichenketten
..so, nun iss der Code wie bei dem Link von "#2" ;-)
|
Re: [Algorithmus] Binäre Suche für Zeichenketten
Michael,
vielleicht solltest du das noch etwas optimieren.
Delphi-Quellcode:
Warum :
var ...
relationship : integer; begin ... relationship := CompareStr(SortedStrArray[middle], s); if relationship < 0 then begin // SortedStrArray[middle] < s else if relationship=0 then begin // SortedStrArray[middle] = s else begin // SortedStrArray[middle] > s end; ... end; Bei deiner Konstruktion vergleichst du in der While-Schleife die Strings (bis auf den letzten Durchlauf) immer zwei Mal. So, wie oben dargestellt, vergleichst du die Strings immer nur ein Mal und prüfst danach einen Integerwert, was deutlich schneller geht. |
Re: [Algorithmus] Binäre Suche für Zeichenketten
Wäre möglich, aber dann bräuchte ich wieder CompareStr aus der Unit SysUtils.
|
Re: [Algorithmus] Binäre Suche für Zeichenketten
Ja und ?
Warum machst du eine binäre Suche ? Um Speicherplatz zu sparen ? Ich denke du machst sie aus Performancegründen - und dann schreibst du die Routine so, daß sie möglichst viel Zeit benötigt.... No further comments. |
Re: [Algorithmus] Binäre Suche für Zeichenketten
Zitat:
No further comments (WTF :mrgreen: ). |
Re: [Algorithmus] Binäre Suche für Zeichenketten
Zitat:
Nachtrag: Und hier ist eine Java-Animation zu diesem Algo |
Re: [Algorithmus] Binäre Suche für Zeichenketten
Zitat:
Gruß Gammatester |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:15 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz