Lassen Sie uns sagt, dass Sie die Liste haben α
, β
und ɣ
.
Lassen ABC = α ∩ β ∩ ɣ
Lassen AB = α ∩ β \ ABC
Lassen AC = α ∩ ɣ \ ABC
Lassen BC = β ∩ ɣ \ ABC
Lassen A = α \ (β ∪ ɣ)
Lassen B = β \ (α ∪ ɣ)
Lassen C = ɣ \ (α ∪ β)
Let | X | sei die Kardinalität von Menge X.
return true, wenn und nur wenn |A| + |B| + |C| + |AB| + |AC| + |BC| + |ABC| >= 3
Beispielimplementierung:
void Main()
{
var alpha = new List<string> { "apple", "pear", };
var beta = new List<string> { "banana", };
var gamma = new List<string> { "banana", "apple", };
Console.WriteLine(Compute(alpha, beta, gamma));
Console.WriteLine(ComputeWithSets(alpha, beta, gamma));
alpha = new List<string> { "apple", "pear", };
beta = new List<string> { "apple", "pear", };
gamma = new List<string> { "apple", "pear", };
Console.WriteLine(Compute(alpha, beta, gamma));
Console.WriteLine(ComputeWithSets(alpha, beta, gamma));
alpha = new List<string> { "apple", "pear", "banana", };
beta = new List<string> { "apple", "pear", "banana", };
gamma = new List<string> { "apple", "pear", "banana", };
Console.WriteLine(Compute(alpha, beta, gamma));
Console.WriteLine(ComputeWithSets(alpha, beta, gamma));
}
bool Compute(List<string> alpha, List<string> beta, List<string> gamma)
{
if (alpha.Count == 0) return false;
if (beta.Count == 0) return false;
if (gamma.Count == 0) return false;
foreach (var a in alpha)
foreach (var b in beta)
if (a != b)
foreach (var c in gamma)
if (c != a && c != b)
{
Console.Write(string.Format("{0},{1},{2} =>", a, b, c));
return true;
}
return false;
}
bool ComputeWithSets(List<string> alpha, List<string> beta, List<string> gamma)
{
var abc = alpha.Intersect(beta.Intersect(gamma));
var abcCardinality = abc.Count();
var count = abcCardinality;
if (count >= 3) return true;
var ab = alpha.Intersect(beta).Except(abc);
count += ab.Count();
if (count >= 3) return true;
var bc = beta.Intersect(gamma).Except(abc);
count += bc.Count();
if (count >= 3) return true;
var ac = alpha.Intersect(gamma).Except(abc);
count += ac.Count();
if (count >= 3) return true;
var a = alpha.Except(ab).Except(ac).Except(abc);
count += a.Count();
if (count >= 3) return true;
var b = beta.Except(ab).Except(bc).Except(abc);
count += b.Count();
if (count >= 3) return true;
var c = gamma.Except(ac).Except(bc).Except(abc);
count += c.Count();
if (count >= 3) return true;
return false;
}
Eine Möglichkeit, dies zu erreichen, besteht darin, einen Baum zu erstellen, wobei jede Ebene alle Möglichkeiten einer Liste bietet. Danach würde die Verwendung eines Baumsuchalgorithmus funktionieren. – Th0rndike
Danke ... Ich habe Bäume gegooglet, aber ich weiß nicht, wie das für meinen Fall umgesetzt werden würde! –
Ich denke, du solltest das anders formulieren _Kann ich EINEN Gegenstand aus jeder Liste wählen und sicher sein, dass jeder gewählte Gegenstand sich von den anderen gewählten Gegenständen unterscheidet? _ Zu etwas wie, sagen wir: ** Nimm einen Gegenstand in jeder Liste, gibt es eine Möglichkeit dazu Haben Sie keine Duplikate? ** – hoang