我想问一下等价类中的传递闭包和排序。
我有一个布尔矩阵,我想要的结果是,从布尔矩阵,我计算传递闭包,找到等价类(es),并对所有这些等价类进行排序。
例如:我有一个图表
0 <-> 1
|
v
2
我有2个等价类{{0; 1}; {2}},排序此类的结果是:{2}在类{0之后; 1}
1)我想更多地了解为什么从传递闭包中我可以找到等价类?你能举个例子吗?我很容易通过例子来理解。
2)这是一个例子。我正在测试我上面描述的算法
let matrix =
[|[| false; true; false; false|];
[| false; false; false; false|];
[| true; true; false; true|];
[| false; false; false; false|];
|]
(* compute a transitive closure of a matrix *)
let transClosure matrix =
let n = Array.length matrix in
for k = 0 to n - 1 do
let mk = matrix.(k) in
for i = 0 to n - 1 do
let mi = matrix.(i) in
for j = 0 to n - 1 do
mi.(j) <- max mi.(j) (min mi.(k) mk.(j))
done;
done;
done;
matrix;;
(* compute transitive closure of boolean matrix *)
let tc_ma = transClosure matrix;;
(* compute equivalence classes on transitive closure*)
let eq = equivalence_classes tc_ma;;
(* sorting all equivalence classes *)
let sort = sort_equivalence_classes tc_ma eq;;
使用来自Asking about return type, list and set data structure in OCaml
的这些函数equivalence_classes
和sort_equivalence_classes
我不明白为什么函数eq
和sort
的输出是相同的,
这是两个函数的输出:[[3; 1; 0]; [1]]
;我不明白为什么它给了我这个结果,2
在哪里?我怎么能得到我期望的结果?
非常感谢
答案 0 :(得分:1)
在您的示例中, transClosure 函数不会更改矩阵。这对于您的示例是正确的,但您应该使用更多输入来测试此函数,以了解它是否有效。
一个错误是equivalence_class函数假设所有关系都是对称的,只检查一个方向。如果它看到 i - &gt; j 它假设 j - &gt;我也是。 您的数据不是这样,因此您得到的结果不正确。您的矩阵示例具有关系0-> 1,2-> 0,2-> 1和2-> 3。没有循环,因此不应生成等价类。一旦你有循环,传递闭包应该将它们转换为自反对称子集。
另一个问题是你的关系不是反身的,但你需要反身性来获得单身等价集。
为了使这个工作,你需要1)使关系自反,2)修复equivalence_class函数来检查两个方向。