AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Suche in ListBox beschleunigen

Ein Thema von rawsoul · begonnen am 6. Jan 2007 · letzter Beitrag vom 7. Jan 2007
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#1

Suche in ListBox beschleunigen

  Alt 6. Jan 2007, 04:42
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:
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;
ich hoffe, man kann mich soweit halbwegs nachvollziehen

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)

viele liebe grüße und nachträglich ein frohes neues jahr

[edit=RawSoul]Quelltext upgedatet... Nochmal komplett von vorn angefangen [/edit]
[edit=RawSoul]Oh Gott, entschuldigt meine Sauklaue *wegduck*... Sowohl Quelltext als auch komplette Sätze [/edit]
[edit=RawSoul]Noch ein Quelltextupdate...[/edit]
Frank Dumont
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

Re: Suche in ListBox beschleunigen

  Alt 6. Jan 2007, 05:03
Ja, schön. 4 Edits. Insbesondere, dass der Quelltext von der Prozedur Wortverdrehen nicht gepostet wurde. Denn da liegt wohl der Hund begraben.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#3

Re: Suche in ListBox beschleunigen

  Alt 6. Jan 2007, 06:13
Hab mich ja dafür entschuldigt...

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;
Frank Dumont
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: Suche in ListBox beschleunigen

  Alt 6. Jan 2007, 07:51
Diese Function ist genau der Zeitfresser. result:=result+buchstabe; und delete(wort,k,1); erstellen dauernd neue Strings.

Delphi-Quellcode:
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;
Die obige Funktion verwuerfelt den String einfach durch haeufiges Vertauschen zweier Buchstaben.
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)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Suche in ListBox beschleunigen

  Alt 6. Jan 2007, 09:39
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#6

Re: Suche in ListBox beschleunigen

  Alt 6. Jan 2007, 10:17
Hallo Frank,

natürlich kannst du deinen Wortverdreher gewaltig beschleunigen, wenn du einen eleganteren Algorithmus dafür verwendest - den von Robert oder auch diesen. Der Ansatz ist dann aber immer noch brute force.

Eine drastische Beschleunigung erreichst du nur, wenn du eine optimale Speicherung der Wörterliste einführst - den Directed Acyclic Word Graph (DAWG). Die Suche geschieht dann genau anders herum und hoch effektiv.

Grüße vom marabu
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#7

Re: Suche in ListBox beschleunigen

  Alt 6. Jan 2007, 11:42
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.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Suche in ListBox beschleunigen

  Alt 6. Jan 2007, 12:20
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
  Mit Zitat antworten Zitat
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#9

Re: Suche in ListBox beschleunigen

  Alt 6. Jan 2007, 18:15
Wow, erstmal vielen Dank für die ganzen Tipps, werde ich alle mal ausprobieren

Zitat von marabu:
Aber wer weiß: Vielleicht kann Frank mit deiner Hilfe die Laufzeit schon unter 30 Sekunden drücken und alles andere ist ihm egal.
Nein! Das ganz sicherlich nicht! Ich lerne Pascal zwar in meinem Infokurs der Schule, jedoch arbeite ich auch in meiner Freizeit gerne und oft damit. Es ist reines Interesse aus welchem dieser Thread folgte, also bitte keine Vorurteile...

Zitat von marabu:
der arme Junge wird in knapp zwei Wochen volljährig.
*Freu*

Sobald ich Resultate habe, werde ich berichten

LG,
Frank.
Frank Dumont
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#10

Re: Suche in ListBox beschleunigen

  Alt 7. Jan 2007, 05:17
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:46 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