![]() |
Re: Kleinster Wert in einem Set
@generic: das nenne ich einen brute force Ansatz - gesucht wurde ursprünglich Eleganz und mittlerweile einfach eine "generische" Lösung. Da Object Pascal einen "ungeordneten" Mengentyp implementiert, gibt es keine Operatoren für Min() und Max(), also muss man sie selbst schreiben - oder man nimmt deine Lösung und verzichtet auf Universalität.
Freundliche Grüße marabu |
Re: Kleinster Wert in einem Set
irgendwie vermisse ich hier die (mMn) einfachste lösung. naja dann poste ich sie halt mal :D
Delphi-Quellcode:
hab ich zwar grade so aus dem Kopf geschrieben, aber das sollte so gehen.
type TAufzaehlungsTyp = (a, b, c, d); //oder was auch immer
TAufzaehlungsMenge = set of TAufzaehlungsTyp; function ElementCount(ASet: TAufzaehlungsMenge): Integer; var i: TAufzaehlungsTyp; begin Result := 0; for i := Low(TAufzaehlungsTyp) to High(TAufzaehlungsTyp) do if i in ASet then Inc(Result); end; function MinElement(ASet: TAufzaehlungsMenge): TAufzaehlungsTyp; var i: TAufzaehlungsTyp; begin Result := High(TAufzaehlungsTyp); for i := High(TAufzaehlungsTyp) downto Low(TAufzaehlungsTyp) do if i in ASet then Result := i; end; edit: Man sollte sich nur gedanken machen, was MinElement zurückgeben soll, wenn eine leer Menge übergeben wird. (im Moment wird der höchste darstellbare Wert zurückgegeben) |
Re: Kleinster Wert in einem Set
marabu ich finde es allerding unpraktisch auf kompiler interne sachen zuzugreifen bzw. irgendwelche bit's zu shiften. schliesslich haben wir es hier mit einer hochsprache zu tun und keinem assembler.
ziel der hochsprachen ist es etwas leicht verständlich zu programmieren. hochsprache und objektorientiert heisst aber auch oft nicht der performateste zu haben. ich glaube auch das zwischen den implementierungen kein unterschied ist. um eine schleife kommt man nicht rum denke ich. |
Re: Kleinster Wert in einem Set
@All
vielen Dank für Eure Vorschläge. Meine Hoffnung war, daß es so etwas wir Low()/High() auch für Mengenvariablen gibt, was aber nicht der Fall zu sein scheint - da fehlt wohl was in Delphi. Als allgemeingültige Lösung könnte ich mir dann das vorstellen:
Delphi-Quellcode:
Ist für mich aber auch nicht wirklich überzeugend.
FUNCTION MinMember(const ASet; ASize:integer):Integer;
asm shl edx,3 xor ecx,ecx @Loop: bt [eax],ecx jc @End add ecx,1 sub edx,1 jne @Loop mov ecx,-1 @End: mov eax,ecx end; |
Re: Kleinster Wert in einem Set
Die einzig saubere Lösung (wirklich sauber), ist die Implementierung von Blackjack (eventuell mit einer kleinen kosmetischen Korrektur):
Delphi-Quellcode:
Wie gesagt, kosmetisch. Und schneller ist es auch, denn es wird nach dem ersten Element gleich zurück gesprungen.
function OrdMinElement(ASet: TAufzaehlungsMenge): Integer; // Liefert die Ordnungszahl
var i: TAufzaehlungsTyp; begin Result := -1; // Falls die Menge leer ist for i := Low(TAufzaehlungsTyp) to High(TAufzaehlungsTyp) do if i in ASet then Begin Result := i; Exit; end; end; Konsequent müsste man, um diese Funktion optimal abzubilden, eine eigene SET-Klasse schreiben, hier kann man mit Bitmustern, Arrays oder sonstwas arbeiten und diese Sonderfunktionen implementieren. |
Re: Kleinster Wert in einem Set
sicher dass das so geht? einmal weist du Result einen Integer zu (-1), und einmal einen TAufzaehlungsTyp (i). :gruebel:
@AmateurProfi: Sorry, aber wenn hier eine Lösung nicht allgemeingültig ist, dann deine ;) |
Re: Kleinster Wert in einem Set
Zitat:
Delphi-Quellcode:
function OrdMinElement(ASet: TAufzaehlungsMenge): Integer; // Liefert die Ordnungszahl
var i: TAufzaehlungsTyp; begin Result := -1; // Falls die Menge leer ist for i := Low(TAufzaehlungsTyp) to High(TAufzaehlungsTyp) do if i in ASet then Begin Result := Ord (i); // <--- Hier wars Exit; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 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