AGB  ·  Datenschutz  ·  Impressum  







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

Mehrere Variablen vergleichen

Ein Thema von Delphi-Narr · begonnen am 23. Mai 2010 · letzter Beitrag vom 25. Mai 2010
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Wolfgang Mix
Wolfgang Mix

Registriert seit: 13. Mai 2009
Ort: Lübeck
1.222 Beiträge
 
Delphi 2005 Personal
 
#11

Re: Mehrere Variablen vergleichen

  Alt 23. Mai 2010, 20:12
Wobei mir himitsus Lösung besser gefällt, weil sie
plattformunabhängig ist, aber das ist wohl Geschmacksache.
Wolfgang Mix
if you can't explain it simply you don't understand it well enough - A. Einstein
Mein Baby:http://www.epubli.de/shop/buch/Grund...41818516/52824
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#12

Re: Mehrere Variablen vergleichen

  Alt 23. Mai 2010, 20:15
Zitat von mkinzler:
Lieber eine Liste mit Integern oder Extendedwerten
Ist wie ich finde - auch einfacher zu verstehen. Auch für die Delphi - Anfänger
Lars
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#13

Re: Mehrere Variablen vergleichen

  Alt 23. Mai 2010, 20:25
Zitat von Wolfgang Mix:
Wobei mir himitsus Lösung besser gefällt, weil sie
plattformunabhängig ist, aber das ist wohl Geschmacksache.
Nja, 'ne platformunabhängigkeit seh ich so oder so eh nicht.

PS: noch eine weitere Variable erzeugt gleich nochmal 1,5 weitere solcher Vergleichszeilen.

Wärend die Schleifen gleichlang bleiben.
Außerdem kann man sich bei den vielen Vergleichen schonmal verschreiben.
(nicht jeder läßt sich derartige Codes automatisch generieren )
Delphi-Quellcode:
for i := 0 to High(arr) - 1 do
  for j := i + 1 to High(arr) do
    if arr[i] = arr[j] then
      >>doppelt<<
Delphi-Quellcode:
doppelt := False;
for i := 0 to High(arr) - 1 do
  for j := i + 1 to High(arr) do
    if arr[i] = arr[j] then begin
      doppelt := True;
      Break;
    end;
if doppelt then ...
Einzig und alleine die Geschwindigkeit könnte (unter gewissen Umständen) bei den direkten Vergleichen ein paar millionstel Sekunden schneller sein.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Delphi-Narr
Delphi-Narr

Registriert seit: 29. Aug 2009
Ort: Duisburg
437 Beiträge
 
Delphi 2007 Professional
 
#14

Re: Mehrere Variablen vergleichen

  Alt 24. Mai 2010, 10:42
#13

Ja, so hatte ich das jetzt auch gemacht.
Danke!
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#15

Re: Mehrere Variablen vergleichen

  Alt 24. Mai 2010, 13:32
Zitat von himitsu:
Einzig und alleine die Geschwindigkeit könnte (unter gewissen Umständen) bei den direkten Vergleichen ein paar millionstel Sekunden schneller sein.
Aber nur, wenn Du es vernünftig programmiert hättest! Um Deinen Fehler zu sehen, teste mal Deinen Code mit folgenden Vorgaben:
Delphi-Quellcode:
setlength(arr, 10000000);
for i:=0 to high(arr) do arr[i] := i;
arr[0] := 1;
In der Zwischenzeit hier die Erklärung: Dein angeblich fast optimaler Code verläßt via break verläßt nämlich nur die innere for-Schleife, und die äußere Schleif wird immer wieder durchlaufen, auch wenn schon doppelte Einträge erkannt wurden. Wenn kein Goto oder exit aus einer separaten Funktion verwendet werden sollen, könnte ein verbesserter Vorschlag etwa so aussehen:
Delphi-Quellcode:
  doppelt := false;
  for i:=0 to High(arr)-1 do begin

    if not doppelt then begin
      for j:=i+1 to High(arr) do begin
        if arr[i]=arr[j] then begin
          doppelt := true;
          break;
        end;
      end;
    end;
  end;
  if doppelt then ...;
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#16

Re: Mehrere Variablen vergleichen

  Alt 24. Mai 2010, 13:42
Das kann man noch weiter optimieren. So braucht man nicht immer wieder die erste for Schleife komplett durchlaufen

Delphi-Quellcode:
doppelt := false;
  for i:=0 to High(arr)-1 do
    begin
      for j:=i+1 to High(arr) do
        begin
           if arr[i]=arr[j] then
             begin
                doppelt := true;
                 break;
             end;
        end;
      if doppelt then
       break;
    end;
  end;
Lars
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#17

Re: Mehrere Variablen vergleichen

  Alt 24. Mai 2010, 13:52
Ach menno, das vergeß ich manchmal.

ich wünsche mir eh schon lange ein Break(2); für sowas.
$2B or not $2B
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#18

Re: Mehrere Variablen vergleichen

  Alt 24. Mai 2010, 14:17
Zitat von daywalker9:
Das kann man noch weiter optimieren. So braucht man nicht immer wieder die erste for Schleife komplett durchlaufen
Schon klar. Wie schon gesagt, wäre eine separate Funktion mit einem exit oder ein goto noch schneller.

Allerdings ist wohl selbst dann im schlimmsten Fall immer noch eine quadratische Laufzeit erforderlich. Mit einem n*log(n) Sortierverfahren mit anschließendem linearen Vergleich oder eine Hashliste hätte man eine bessere Worst-case-Laufzeit.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#19

Re: Mehrere Variablen vergleichen

  Alt 24. Mai 2010, 14:30
Diese Schleife (inkl. richtiger Abruchbedingung) sollte im Worst-Case bei n*(n-1)/2 liegen.

PS: Aha, du willst also alles mehrfach durchgehn? @gammatester
- sortieren mit n*log(n)
- und prüfen mit n-1
wird bestimmt länger dauern.
$2B or not $2B
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#20

Re: Mehrere Variablen vergleichen

  Alt 24. Mai 2010, 16:49
Zitat von himitsu:
Diese Schleife (inkl. richtiger Abruchbedingung) sollte im Worst-Case bei n*(n-1)/2 liegen. :gruebel:

PS: Aha, du willst also alles mehrfach durchgehn? @gammatester
- sortieren mit n*log(n)
- und prüfen mit n-1
wird bestimmt länger dauern.
Da wird nix länger dauern (außer für sehr kleine Arrays). Mit der folgenden Initialisierung (beachte umgekehrte Sortierung)
Delphi-Quellcode:
setlength(arr, NMAX);
j := high(arr);
for i:=0 to j-1 do arr[i] := -i;
arr[j] := arr[j-1];
erhalte ich für NMAX:
Code:
20000 mit 'optimierter' Schleife 721 ms
20000 mit Quicksort 0 ms
1000000 mit Quicksort 220 ms
Den Wert für 1000000 mit 'optimierter' Schleife kannst Du ja mal bestimmen. Dabei ist der Ablauf mit Quicksort wie folgt:
Delphi-Quellcode:
Quicksort(...);
for i:=0 to high(arr)-1 do begin
  if arr[i]=arr[i+1] then begin
    doppelt := true;
    break;
  end;
end;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 23:27 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