AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Feststellen ob eine Menge in einer anderen vorkommt
Thema durchsuchen
Ansicht
Themen-Optionen

Feststellen ob eine Menge in einer anderen vorkommt

Offene Frage von "Benutzername"
Ein Thema von Benutzername · begonnen am 3. Okt 2008 · letzter Beitrag vom 3. Okt 2008
Antwort Antwort
Benutzername

Registriert seit: 18. Apr 2004
7 Beiträge
 
#1

Feststellen ob eine Menge in einer anderen vorkommt

  Alt 3. Okt 2008, 12:54
Hallo Delphi-Praxis

Ich muss feststellen ob eine Menge in einer anderen Menge vorkommt. Also ob sich die Mengen in irgendeinerweise überlappen. Ich muss nur feststellen ob das der Fall ist, nicht unbedingt welcher Teil mit dem anderen überlappt.

Ich habe also z.B. eine Liste mit 100 Namen. In der ersten Menge habe ich die Namen von 20-50 ausgewählt (30 Namen), in der zweiten Menge habe ich die Namen 30-45 ausgewählt (15 Namen). Die zweite Menge kommt also vollständig in der ersten vor.

Genauso könnte ich aber in der zweiten Menge die Namen 25-35 auswählen (10 Namen). Dann würde es nur eine Überlappung von 5 Namen geben (die Namen 30-35).

Wie finde ich nun herraus ob es eine Überlappung gibt oder nicht? Ich könnte sämtliche Möglichkeiten durchgehen und überprüfen, ich hoffe jedoch es kennt jemand eine einfache Mathematische Lösung.

Danke schonmal!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#2

Re: Feststellen ob eine Menge in einer anderen vorkommt

  Alt 3. Okt 2008, 13:02
Multipliziere beide Mengen. Wenn eine leere Menge dabei herauskommt, gibt es keine Überlappung.

[edit] Beispiel:
Delphi-Quellcode:
var s1, s2: set of Byte;
begin
  s1 := [1..5];
  s2 := [6..10];
  if (s1 * s2) <> [] then
    ShowMessage('Überlappung')
  else
    ShowMessage('Keine Überlappung');
  Include(s1,6);
  if (s1 * s2) <> [] then
    ShowMessage('Überlappung')
  else
    ShowMessage('Keine Überlappung');
  Exclude(s2,6);
  if (s1 * s2) <> [] then
    ShowMessage('Überlappung')
  else
    ShowMessage('Keine Überlappung');
end;
[/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#3

Re: Feststellen ob eine Menge in einer anderen vorkommt

  Alt 3. Okt 2008, 13:08
mal eine vielleicht dumme fragen, aber geht das bei set of nicht auch mit in, also wie folgt:
Delphi-Quellcode:
var
  menge1 : set of Integer;
  menge2 : set of Integer;
begin
  menge1 := [1, 2];
  menge2 := [1, 2, 3, 4];
if (menge1 in menge2) then
{ ... }
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#4

Re: Feststellen ob eine Menge in einer anderen vorkommt

  Alt 3. Okt 2008, 13:14
in geht nur mit einzelnen Elementen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Feststellen ob eine Menge in einer anderen vorkommt

  Alt 3. Okt 2008, 13:18
Es handelt sich bei der Problemstellung des Fragestellers doch nicht notwendigerweise um Mengen im Sinne des Datentyps 'Set' von Delphi, sondern eher um Listen. Also müsste man eine Routine schreiben, die prüft, ob zwei Listen irgendwelche gemeinsamen Elemente beinhalten.

Selbst wenn man die Frage nach den Namen über Delphi-Mengen ('Set') abbildet, stößt man bei mehr als 255 Namen an die Grenze, insofern ist die Lösung nicht allgemeingültig.

Ich würde hier zunächst vorschlagen, die Namen in Stringlisten zu halten und die Prüfung über die 'IndexOf'-Methode zu bewerkstelligen:

Delphi-Quellcode:
Function ContainsElements (slA, slB : TStringList) : Boolean;
Var
  i : Integer;

Begin
  For i:=0 to slA.Count-1 Do
    if slB.indexOf (slA[i]) Then Begin
      Result := True;
      Exit;
    End;
  Result := False;
End;
Keine Frage: Eine kompakte aber nicht sonderlich effiziente Implementierung. Optimierungspotential: Listen sortieren und durch die kürzere der beiden Listen iterieren.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: Feststellen ob eine Menge in einer anderen vorkommt

  Alt 3. Okt 2008, 13:24
@DeddH, s.h.a.r.k: Aber das wichtigste von allem ist, dass diese Lösungen total irrelevant sind, da er keine Mengen im Sinne eines Sets hat, sondern
Zitat von Benutzername:
z.B. eine Liste mit 100 Namen.
Name = String und String geht nicht mit set of.

Du mussta also manuell überprüfen, ob es überschneidungen gibt.

Sofern deine beiden Listen unsortiert sind, musst du jedes Element der einen Menge gegen jedes der anderen prüfen (Kannst natürlich abbrechen, wenn due eine Übereinstimmung geunden hast.)
Aufwand: n mal m (n=Länge von A, m=Länge von B)

Wenn deine Listen sortiert sind, kannst du mit weniger Aufwand und entsprechend schneller prüfen. (Du kannst dann jedes Element aus (der kleineren) Liste A in Liste B suchen, und finden /nicht finden mit Binärer Suche)
Aufwand: n * log(m)
  Mit Zitat antworten Zitat
Benutzername

Registriert seit: 18. Apr 2004
7 Beiträge
 
#7

Re: Feststellen ob eine Menge in einer anderen vorkommt

  Alt 3. Okt 2008, 15:00
Danke für eure Antworten.

Menge1 und Menge2 kann in folgenden Konstellationen auftreten ("-" sind die einzelnen Einträge und "+" sind die ausgewählten Elemente).

Code:
Liste ----------

A    ---+++---- M1
      -+++++++-- M2

B    ---+++---- M1
      -++++----- M2

C    ---+++---- M1
      ----++++-- M2

D    ---+++---- M1
      ---+++---- M2

E    ---+++---- M1
      ++-------- M2

F    ---+++---- M1
      -------++- M2

G    ---+++---- M1
      ----+----- M2
Demnnach kann ich mit folgenden Überprüfungen feststellen, ob Überlappungen vorliegen (ist nur bsp Code).

Delphi-Quellcode:
  Result:= false;
  if M1.Index = M2.Index then
  begin
    // D
    Result:= true;
  end else begin
    if M2.Index < M1.Index then
    begin
      // A, B, E
      if (M2.Index + M2.Size) - 1 >= M1.Index then
      begin
        // A, B
        Result:= true;
      end;
      // E
    end else begin
      if M2.Index > M1.Index then
      begin
        // C, F
        if M2.Index <= (M1.Index + M1.Size) - 1 then
        begin
          // C
          Result:= true;
        end;
        // F
      end else begin
        // G
        Result:= true;
      end;
    end;
  end;
Gibt es noch eine einfachere Möglichkeit das zu überprüfen?
Decken meine Überprüfungen alle Kombinationen ab?
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#8

Re: Feststellen ob eine Menge in einer anderen vorkommt

  Alt 3. Okt 2008, 15:17
Wenn ich das richtig verstehe, dann sind deine "Mengen" eigentlich nur Subranges. Dann ist eine überprüfung der jeweiligen Bereichsgrenzen wohl der geschickteste Ansatz.

Seien A und B die beiden Mengen, MinA, MinB die jeweils kleinsten Elemente der Mengen und analog MaxA, MaxB die größten. Dann überlappen sich die Mengen nicht, wenn ((MaxA < MinB) or (MaxB < MinA)) ist.
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#9

Re: Feststellen ob eine Menge in einer anderen vorkommt

  Alt 3. Okt 2008, 15:18
Da gibt es doch was in der Code-Library: http://www.delphipraxis.net/internal...ct.php?t=23230
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Feststellen ob eine Menge in einer anderen vorkommt

  Alt 3. Okt 2008, 15:56
Zitat von jfheins:
Name = String und String geht nicht mit set of.
Als Index (siehe Eingangspost) schon.

Zitat von Uwe Raabe:
Wenn ich das richtig verstehe, dann sind deine "Mengen" eigentlich nur Subranges.
Das wäre zu speziell.

Zitat von sx2008:
Da gibt es doch was in der Code-Library: http://www.delphipraxis.net/internal...ct.php?t=23230
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:19 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