Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dubletten-Funktion: Dubletten in einem Array (https://www.delphipraxis.net/25739-dubletten-funktion-dubletten-einem-array.html)

wolfram 11. Jul 2004 17:38


Dubletten-Funktion: Dubletten in einem Array
 
Hallo,
Ich moechte eine Dublettensuchfunktion für einen string-Array programmieren.
Die dublettenfunktion soll eine Art "matching factor" (t) zurueckgeben, so dass
die Übereinstimmung gemessen werden kann. ist t = 0 stimmen die strings 100% ueberein,
bei t=1 unterscheiden sie sich an einer stelle...

Haette jemand einen anderen Vorschlag nach dubletten in einem String zu suchen?
Oder eine function in Assembler, die das ganze beschleunigen wuerde?

Danke!

----------------

Bis jetzt habe ich mir folgenden Ablauf überlegt:

for x := 1 to "Groesse des Array" do

...
for y := 1 to "Groesse des Array" do
...
if (x<>y) then
t := doublette(array[x],array[y]);
if (t=Festgelegtes t, welches nicht ueberschritten werden darf) then
dublette := true //oder aehnlich
end;
end;

end;

//uses math;

function dublette(a,z):integer;
var x,t,Zmin:integer;
begin
Zmin := Min(length(a), length(z));

for x := 1 to zMin do
begin
if (a[x]=z[x]) then inc(t);
...

result := zMin-t;
end

Ultimator 11. Jul 2004 18:01

Re: Dubletten-Funktion: Dubletten in einem Array
 
1.) Das müsste eigentlich so in Ordnung sein, denke ich.
2.) Nimm doch bitte die [ delphi ]-Tags ;-)

rantanplan99 11. Jul 2004 18:06

Re: Dubletten-Funktion: Dubletten in einem Array
 
Naja, nen richtigen Vorschlag hab ich nicht, aber optimier mal deine for Schleifen

Delphi-Quellcode:
for x := 1 to "Groesse des Array" do
  ...
  for y := i+1 to "Groesse des Array" do
    ...
    t := doublette(array[x],array[y]);
    if (t=Festgelegtes t, welches nicht ueberschritten werden darf) then dublette := true //oder aehnlich
  end;
end;

end;
verkürzt die 2te for-Schleife, weil wenn array[1] und array[2] verglichen hast, musst du ja nicht später nochmal array[2] mit array[1] vergleichen.

wenn die 2te for-Schleife mit i+1 anfängt sparst du dir das if x<>y

NACHTRAG:
Achja, die erste for-Schleife dann natürlich nur bis "Groesse des Array -1"

Robert Marquardt 11. Jul 2004 18:37

Re: Dubletten-Funktion: Dubletten in einem Array
 
Der zugehoerige Algorithmus nennt sich Levensthein-Distanz.

wolfram 12. Jul 2004 11:52

Re: Dubletten-Funktion: Dubletten in einem Array
 
danke für die schnellen antworten!

aber die funktion in assembler zu programmieren wuerde keinen geschwindigkeitszuwachs bringen? ich muss immerhin 100 000 datensaetze in den array einlesen und dann vergleichen!

Robert Marquardt 12. Jul 2004 13:35

Re: Dubletten-Funktion: Dubletten in einem Array
 
Die for-Schleifen sind jetzt ja optimiert. Assembler bringt bei denen garnichts.
Die Levenshtein-Distanz sollte erst mal funktionieren, dann kann man ueber Assembler vielleicht nachdenken.
Ich bezweifle aber das Assembler hilft. Levenshtein ist einfache lineare Optimierung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:13 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