Algorithm 求偏序集极大元的有效算法

Algorithm 求偏序集极大元的有效算法,algorithm,poset,Algorithm,Poset,我有一个偏序集,比如说a=[x1,x2,…],这意味着对于集合中的每个xi和xj,xi==xj,xi,或者xi和xj是不可比的 我想找到最大元素(即那些元素xi,其中没有元素xj的元素xi

我有一个偏序集,比如说
a=[x1,x2,…]
,这意味着对于集合中的每个
xi
xj
xi==xj
xi
,或者
xi
xj
是不可比的

我想找到最大元素(即那些元素
xi
,其中没有元素
xj
的元素
xi
)。实现这一点的有效算法是什么(尽量减少比较次数)?我尝试构建一个DAG并进行拓扑排序,但仅仅构建图形就需要O(n^2)比较,这太多了


我是用Python来做这件事的,但是如果你不知道,我可以阅读其他语言或伪代码。

看起来最糟糕的情况是O(n^2),不管你做什么。例如,如果没有可比较的元素,则需要将每个元素与每个其他元素进行比较,以确定它们都是最大的


如果你允许O(n^2),因为排序是可传递的,你可以只通过集合一次,保留一个到目前为止最大元素的列表;每个新元素都会剔除在最坏的情况下,你不能比O(n^2)快。事实上,要检查偏序集的所有元素都是最大的,其中没有可比较的元素,您需要比较每对元素。所以在最坏的情况下,它肯定是二次的如果你不比较席和XJ,你不能肯定地说它们是否都是最大的,或者只有一个是。 因此,必须检查所有可能的(n选择2)(O(n2))比较



注意:这假设您的偏序集是用一个黑框指定的,该黑框将进行比较。如果偏序集以图形的形式给出,则随后可以在sub-O(n2)时间内找到最大元素集。

正如其他答案所指出的,最坏情况的复杂性是O(n^2)

然而,有一些启发式方法在实践中可以帮助很多。例如,如果集合A是Z^2(整数对)的子集,那么我们可以通过以下方法预先消除许多点:

  • 沿x轴排序(对于给定的x值,例如1,找到该点 使用“最大y值”,对所有x值重复该操作),以获得一组候选值 极大值,称之为y极大值
  • 类似地,得到集合x-极大值
  • 相交以获得最终候选集xy最大值
  • 这是成本O(n)。很容易看出,任何极大点都会出现在xy极大值中。但是,它可以包含非最大点。例如,考虑集合{(1,0),(0,1),(2,2)}。

    根据您的情况,这可能是一个足够好的启发。您可以在较小的xy最大值集上使用穷举算法进行后续操作

    更一般地说,这个问题被称为“帕累托边界”计算问题。以下是一些很好的参考资料:


    特别是第一个引用的最佳算法是非常有用的。< /p>是不应该禁止席奚XJ的吗?“这个想法是,如果任何两个元素是可比较的,那么它们都是有序的。”Vallentin阅读了这个问题。我试着建立一个图表并进行拓扑排序。@RussellZahniser我不确定我是否理解你的评论,但当然

    x
    是允许的。否则你就没有顺序,只有一组不可比较的元素。我知道你的偏序集是作为元素列表和返回-1,0,1或无的比较函数给出的。是吗?我怀疑,但还不能正式证明,O(n^2)有一个信息论的下界,因为我认为总共有大约2^(n^2)个可能的偏序,每次比较只能让你消除大约50%的偏序。这与排序下限证明有关:由于元素有大约2^(n logn)的可能排序,因此需要n logn比较来排序。也许该算法实际上很好,我只是对DAG进行了过度思考。我希望最大元素很少(99%的时候,应该只有一个)。事实上,如果最大元素集变得太大,我必须开始考虑新的排序,我可以将其放在集合上,使其再次变小。算法的效率比最坏情况下的复杂度要高得多。例如,比较排序完全有序集的算法,bubblesort和quicksort都有O(n^2)最坏情况复杂性。然而,快速排序的平均复杂度要高得多。在此基础上,您确信您的算法是有效的吗?