OK - eine (binäre) Relation R ist eine Menge von Tupeln (a,b) mit a € S und b € T. Die Relation heißt transitiv, gdw.
(a,b) € R ^ (b,c) € R -> (a,c) € R.
Was so viel heißen soll wie: “ob ein Paar transitiv ist” kann man nicht sagen, weil nicht die Paare transitiv sind, sondern bestenfalls die Relation, die sie beschreiben.
Aber ich gehe jetzt davon aus, dass die gegbenen Paare genau die Relation SIND. In Anlehnung an die oben genannte Bedingung wäre ein Algorithmus im Pseudocode
Für jedes Element (a,b) der Relation
Für jedes Element (c,d) der Relation
Wenn b==c ist
Wenn (a,d) nicht in der Relation enthalten ist, gib "false" zurück
Gib "true" zurück
Oder im richtigen Code…
import java.util.*;
public class TransitivityTest
{
public static void main(String args[])
{
Object r0[][] = new Object[][]
{
{ "bla1", "bla2" },
{ "bla3", "bla2" },
{ "bla1", "bla3" }
};
System.out.println(isTransitive(r0));
Object r1[][] = new Object[][]
{
{ "bla1", "bla2" },
{ "bla3", "bla2" },
{ "bla1", "bla3" },
{ "bla2", "bla1" }
};
System.out.println(isTransitive(r1));
}
private static boolean isTransitive(Object array[][])
{
Object a[] = new Object[2];
for (int i=0; i<array.length; i++)
{
for (int j=i+1; j<array.length; j++)
{
Object a0[] = array**;
Object a1[] = array[j];
if (a0[1].equals(a1[0]))
{
a[0] = a0[0];
a[1] = a1[1];
if (!contains(array, a))
{
return false;
}
}
}
}
return true;
}
private static boolean contains(Object array[][], Object a[])
{
for (int i=0; i<array.length; i++)
{
if (array**[0].equals(a[0]) &&
array**[1].equals(a[1]))
{
return true;
}
}
return false;
}
}
Ggf. könnte man das natürlich noch effizienter machen, aber … naja, Arrays sind eben erstmal unhandlich.