请帮助我提高以下算法的时间复杂度。
哈斯图(如果您已经知道什么是哈斯图,请跳过此部分,请直接进入下一部分):
考虑一个偏序集(poset,简称)(A,⊆),其中A是一个集合,⊆是一个偏序。图的每个节点都是poset的一个元素,如果两个元素 x 和 y 用一条线连接,则 x ⊆ y 或 y ⊆ x 。元素的位置和连接的绘制遵循以下规则:
如果在poset中x⊆y,那么对应于x的点出现在对应于y的点之下。
偏序的传递性在图形上被省略了,也就是说,如果 x ⊆ y 和 y ⊆ z,那么,通过偏序 ⊆ 的传递性,x ⊆ z。在这种情况下,连接 xz 被省略。
类似地,自反性在图形上被省略了。
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:这不是作业问题!!