Bei einer Liste von Objekten mit mehreren Attributen muss ich die Liste der Mengen finden, die durch eine Vereinigung aller sich überschneidenden Teilmengen entsteht.
Konkret handelt es sich dabei um Person-Objekte, die jeweils viele Attribute haben. Ich muss eine Liste von "Master"-Sets erstellen, die auf einer Handvoll eindeutiger Identifikatoren wie SSN, DLN usw. basieren.
Wenn z. B. Person A und Person B dieselbe SSN haben, bilden sie eine Menge i. Wenn dann Person B und C dieselbe DLN haben, bilden sie eine Menge ii. Person D und E haben dieselbe SSN, aber sie (und alle anderen Identifikatoren) stimmen mit keinem der Identifikatoren der Personen A, B oder C überein. Nach dem Zusammenführen aller sich überschneidenden Teilmengen würde ich eine Menge mit den Personen A, B, C und eine weitere Menge mit den Personen D, E erhalten.
Hier ist der Pseudocode für meine Lösung. Ich bin neugierig, ob jemand bereits einen effizienteren Weg gefunden hat, um alle möglichen sich überschneidenden Sätze zusammenzuführen. Denken Sie daran, dass die Verknüpfungen zwischen den Mengen X Personen lang sein können (d.h. wenn A mit B durch die SSN und B mit C durch die DLN übereinstimmt und C mit D durch die SSN und D mit E durch einen anderen Identifikator übereinstimmt, würden die Personen A-E in einer Menge enthalten sein). Nehmen Sie außerdem an, dass die Sprache, in der dies implementiert werden soll, Mengenoperationen unterstützt.
bigSetList = array of all of the uniq Sets
fullyTested = false
while (bigSetList.size() > 1) or (fullyTested is false)
foreach thisSet in bigSetList order by size desc
if count(sets that intersect with thisSet) > 0
newThisSet = thisSet
intersectingSets = []
bigSetList.delete(thisSet)
foreach testSet in bigSetList
if thisSet.intersects(testSet)
newThisSet.addAll(testSet)
intersectingSets.push(testSetID)
end if
end
bigSetList.delete(intersectingSets)
bigSetList.push(newThisSet)
bigSetList.sort()
break
end if
end foreach
fullyTested = true // have looped through every set in the list and found 0 intersect partners
end
0 Stimmen
TestSet ist nur eine Schleifenvariable für die angegebene Menge in bigSetList. Ich werde den Code bearbeiten, um das zu verdeutlichen.
0 Stimmen
Mit anderen Worten: Jedes Mitglied einer Menge teilt mindestens ein Attribut mit mindestens einem anderen Mitglied dieser Menge? Das klingt nach einem Algorithmus, der bereits entdeckt wurde.
0 Stimmen
Die Mengen, nach denen Sie fragen, scheinen das zu sein, was die Mathematiker als Äquivalenzklassen bezeichnen.