![]() |
[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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz