![]() |
Suche in ListBox beschleunigen
einen guten morgen meine lieben delphianer ;)
mein ziel: aus vorgegebener wordlist (liste mit ganz vielen wörtern halt ;)) werden einige herausgezogen, und deren buchstaben verdreht. <- das ganze ist vorgegeben... die verdrehten worte sollen nun wieder "zurückverdreht" werden, bis sie einem der wörter in der wordlist gleichen. soweit die aufgabe. ich habe nun eine funktion geschrieben, die die wörter per zufallsprinzip verdreht und möchte diese nun mit der wordlist, die in einer tlistbox eingeladen sind vergleichen bzw. suchen. falls dieses wort nicht gefunden wurde, soll das vorgegebene wort nochmals verdreht werden, so lange, bis dieses wort dem original gleicht. 1. verdrehe das vorgegebene wort 2. vergleiche es mit allen einträgen der listbox (for .. to .. do) 3. falls es einem der originalwörter gleicht, gebe es in einem memo aus 4. falls es diesem nicht gleicht, beginne bei 1
Delphi-Quellcode:
ich hoffe, man kann mich soweit halbwegs nachvollziehen ;)
procedure TForm1.Button1Click(Sender: TObject);
var wort,verdreht:string; equal:byte; listindex,listlaenge:integer; begin equal:=0; listlaenge:=listbox1.count; wort:=memo1.lines[0]; repeat listindex:=0; begin verdreht:=wortverdrehen(wort); repeat begin repeat begin if ListBox1.Items[listindex]=verdreht then equal:=1; listindex:=listindex+1 end; until (equal=1) or (listindex=listlaenge-1); end until (equal=1) or (listindex=listlaenge-1); end until (equal=1) or (listindex=listlaenge-1); beep; memo2.Lines.Add(memo1.lines[0]); end; jetzt kommen folgende probleme hinzu: in der wordlist sind zirka 1300 wörter und ich habe zum "knacken" von 8 worten gerade mal 30 sekunden zeit. leider brauche ich _mit glück_ schon 30 sekunden für ein wort. wie kann ich das ganze beschleunigen? oder gibt es eine bessere oder schnellere möglichkeit? (was schöneres möchte ich nicht, man sieht den quelltext später eh nicht) :wall: viele liebe grüße und nachträglich ein frohes neues jahr ;) [edit=RawSoul]Quelltext upgedatet... Nochmal komplett von vorn angefangen :lol:[/edit] [edit=RawSoul]Oh Gott, entschuldigt meine Sauklaue *wegduck*... Sowohl Quelltext als auch komplette Sätze :oops:[/edit] [edit=RawSoul]Noch ein Quelltextupdate...[/edit] |
Re: Suche in ListBox beschleunigen
Ja, schön. 4 Edits. :lol: Insbesondere, dass der Quelltext von der Prozedur Wortverdrehen nicht gepostet wurde. Denn da liegt wohl der Hund begraben.
|
Re: Suche in ListBox beschleunigen
Hab mich ja dafür entschuldigt... :P
Ich denke, die Prozedur ist ok, aber ich klatsch sie trotzdem mal heir rein ;)
Delphi-Quellcode:
function wortverdrehen(eingabe:string):string;
var laenge,k:integer; wort:string; buchstabe:char; begin result:=''; wort:=eingabe; while length(wort)>0 do begin laenge:=length(wort); k:=random(laenge)+1; buchstabe:=wort[k]; result:=result+buchstabe; delete(wort,k,1); end; end; |
Re: Suche in ListBox beschleunigen
Diese Function ist genau der Zeitfresser. result:=result+buchstabe; und delete(wort,k,1); erstellen dauernd neue Strings.
Delphi-Quellcode:
Die obige Funktion verwuerfelt den String einfach durch haeufiges Vertauschen zweier Buchstaben.
function wortverdrehen(const eingabe: string): string;
var I, Pos1, Pos2: Integer; Temp: Char; begin Result := Eingabe; for I := 1 to Length(Eingabe)*2 do begin Pos1 := Random(Length(Eingabe)) + 1; Pos2 := Random(Length(Eingabe)) + 1; Temp := Result[Pos1]; Result[Pos1] := Result[Pos2]; Result[Pos2] := Temp; end; end; Length(Eingabe)*2 stellt einfach sicher das genuegend oft getauscht wird. Das gelegentlich ein Buchstabe mit sich selbst getauscht wird ist nicht weiter tragisch. (die Funktion ist ungetestet) |
Re: Suche in ListBox beschleunigen
es ist nicht gerade effektiv das wort immer wieder zu verdrehen bis es zufälliger weise richtig gedreht ist. Sinvoller wäre es nach Wörtern zu suchen welche gleich lang sind. Wörter die gleich lang sind sollten dann darauf verglichen werde ob die gleichen Buchstaben in der gleichen Menge vorhanden sind.
|
Re: Suche in ListBox beschleunigen
Hallo Frank,
natürlich kannst du deinen Wortverdreher gewaltig beschleunigen, wenn du einen eleganteren Algorithmus dafür verwendest - den von Robert oder auch ![]() Eine drastische Beschleunigung erreichst du nur, wenn du eine optimale Speicherung der Wörterliste einführst - den ![]() Grüße vom marabu |
Re: Suche in ListBox beschleunigen
Na gleich mit dem DAWG nach dem armen Jungen werfen ist ein bischen sehr hart.
Erst mal wuerde mich interessieren was meine Funktion bringt. Danach den Vorschlag von SirThornberry verwirklichen, der darauf hinauslaeuft nur die erfolgversprechenden Worte ueberhaupt zu testen. |
Re: Suche in ListBox beschleunigen
Hallo Robert,
der arme Junge wird in knapp zwei Wochen volljährig. Eine naive Implementierung eines DAWG sollte kein Problem sein, wenn er eine verkettete Liste implementieren kann. Wir sollten die Jugend von heute nicht unterschätzen. Außerdem ist es für jeden späteren Leser mit Ambitionen sicher interessant zu lesen, dass es da etwas geben könnte, was die eigene Vorstellungskraft sprengt. Aber wer weiß: Vielleicht kann Frank mit deiner Hilfe die Laufzeit schon unter 30 Sekunden drücken und alles andere ist ihm egal. Freundliche Grüße |
Re: Suche in ListBox beschleunigen
Wow, erstmal vielen Dank für die ganzen Tipps, werde ich alle mal ausprobieren :)
Zitat:
Zitat:
Sobald ich Resultate habe, werde ich berichten ;) LG, Frank. |
Re: Suche in ListBox beschleunigen
Mit meinen bald 46 habe ich da eine andere Perspektive :-)
Besonders da ich jetzt einen 21-jaehrigen Kollegen habe. Niht zuletzt waechst mir nach der Chemotherapie wieder der erste Flaum. Da fuehlt man sich vielleicht merkwuerdig. Wie alt bin ich denn jetzt? Wie war das mit den Blumen und den Bienen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 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