AGB  ·  Datenschutz  ·  Impressum  







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

Kleinster Wert in einem Set

Ein Thema von Amateurprofi · begonnen am 9. Mai 2006 · letzter Beitrag vom 10. Mai 2006
Antwort Antwort
Seite 2 von 2     12   
marabu

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

Re: Kleinster Wert in einem Set

  Alt 9. Mai 2006, 13:53
@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
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#12

Re: Kleinster Wert in einem Set

  Alt 9. Mai 2006, 14:30
irgendwie vermisse ich hier die (mMn) einfachste lösung. naja dann poste ich sie halt mal
Delphi-Quellcode:
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;
hab ich zwar grade so aus dem Kopf geschrieben, aber das sollte so gehen.

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)
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#13

Re: Kleinster Wert in einem Set

  Alt 9. Mai 2006, 18:05
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.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.077 Beiträge
 
Delphi XE2 Professional
 
#14

Re: Kleinster Wert in einem Set

  Alt 10. Mai 2006, 07:37
@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:
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;
Ist für mich aber auch nicht wirklich überzeugend.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#15

Re: Kleinster Wert in einem Set

  Alt 10. Mai 2006, 08:47
Die einzig saubere Lösung (wirklich sauber), ist die Implementierung von Blackjack (eventuell mit einer kleinen kosmetischen Korrektur):
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 := i;
      Exit;
    end;
end;
Wie gesagt, kosmetisch. Und schneller ist es auch, denn es wird nach dem ersten Element gleich zurück gesprungen.

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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von BlackJack
BlackJack

Registriert seit: 2. Jul 2005
Ort: Coesfeld
246 Beiträge
 
Delphi 2005 Personal
 
#16

Re: Kleinster Wert in einem Set

  Alt 10. Mai 2006, 14:15
sicher dass das so geht? einmal weist du Result einen Integer zu (-1), und einmal einen TAufzaehlungsTyp (i).

@AmateurProfi: Sorry, aber wenn hier eine Lösung nicht allgemeingültig ist, dann deine
See my shadow changing, stretching up and over me.
Soften this old armor. Hoping I can clear the way
By stepping through my shadow, coming out the other side.
Step into the shadow. Forty six and two are just ahead of me.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#17

Re: Kleinster Wert in einem Set

  Alt 10. Mai 2006, 14:24
Zitat von BlackJack:
sicher dass das so geht? einmal weist du Result einen Integer zu (-1), und einmal einen TAufzaehlungsTyp (i).
Blöde Frage ... Natürlich geht das nicht. Ich äh... wollte äh... nur Deine Aufmerksamkeit testen.
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;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 08:48 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