2

请帮助我提高以下算法的时间复杂度。

哈斯图(如果您已经知道什么是哈斯图,请跳过此部分,请直接进入下一部分):

考虑一个偏序集(poset,简称)(A,⊆),其中A是一个集合,⊆是一个偏序。图的每个节点都是poset的一个元素,如果两个元素 x 和 y 用一条线连接,则 x ⊆ y 或 y ⊆ x 。元素的位置和连接的绘制遵循以下规则:

  1. 如果在poset中x⊆y,那么对应于x的点出现在对应于y的点之下。

  2. 偏序的传递性在图形上被省略了,也就是说,如果 x ⊆ y 和 y ⊆ z,那么,通过偏序 ⊆ 的传递性,x ⊆ z。在这种情况下,连接 xz 被省略。

  3. 类似地,自反性在图形上被省略了。

Poset(S={{1,2,3,5}, {2,3}, {5}, {3}, {1,3}, {1,5}}, ⊆) 的哈斯图表示是如下(只报告边缘)

{1,2,3,5}->{2,3}

{1,2,3,5}->{1,3}

{1,2,3,5}->{1,5}

{2,3}->{3}

{1,3}->{3}

{1,5}->{5}

我最初的想法

我能想到的唯一算法是 O(N^2) 如下:

读取第一个元素是 S 并将其作为第一个元素插入到哈斯图中。当我们阅读下一个元素时,将它们插入已经构建的图表中的正确位置(假设到目前为止构建的图表有 K 个元素,那么在正确的位置插入一个新元素需要 O(K) 时间)。这样 O(N ^ 2) 是显而易见的。

但我在想对poset S的元素进行排序是否有帮助,但无法构建S中完整元素的排序顺序,因为⊆可能不适用于所有元素对(例如,考虑{2,3}和{1,3 })。

欢迎任何改善最坏情况复杂性的想法!

谢谢。

PS:这不是作业问题!!

4

2 回答 2

0

如果集合是 {1,2,3,5},则子集将是 ({Æ},{1},{2},{3},{5},{1,2},{1,3] ,{1,5},{2,3}{2,5},{3,5},{1,2,3}{1,3,5},{1,2,5},{2, 3,5},{1,2,3,5})。去掉传递关系后,我们将有 ({{Æ}},{1},{2},[3},{4},{5},{1,2},{2,3}{1,5 },{2,5},{3,5},{1,2,3},{1,3,5},{1,2,5},{1,2,3,5})。现在从空集开始,画线到 1,2,3,5.. 然后从点 1 和 2 画线到 1,2。从 2 和 3 画线加入 2,3。然后画线到 5 1,2,3... 然后从那里从 [1,2},{2,3} 画线到 {1,2,3}。然后从 {3,5} 和 {1,5} 画线到 {1,3,5} 。然后再次画一条线到下一组,最后从所有先前的 sbset 画线到最后一个子集...

于 2013-01-27T14:44:34.750 回答
0

这个问题通常被称为传递归约。我相信你的算法是不正确的;虽然我没有足够的细节来确切地告诉你是如何做到的,但是从传递闭包到传递归约有一个有效的减少,并且对于前者的最着名的算法在时间 O(n ω ) 上运行某些指数 ω > 2。

于 2012-07-10T12:10:27.610 回答