设Os是一个部分有序集合,并且给定Os中的任意两个对象O1和O2,如果O1大于F1,O2()将返回1 O2,-1如果O1小于O2,如果它们不可比,则为2,如果O1等于O2,则为0。以动态pythonic方式查找部分有序集合中的最小元素
我需要找到元素Mn的子集是最小的Os。这是对于Mn中的每个A,并且对于Os中的每个B,F(A,B)永远不等于1.
这并不难,但我确信它可以在更加pythonic办法。
快速和肮脏的方法是:
def GetMinOs(Os):
Mn=set([])
NotMn=set([])
for O1 in Os:
for O2 in Os:
rel=f(O1,O2)
if rel==1: NotMn|=set([O1])
elif rel==-1: NotMn|=set([O2])
Mn=Os-NotMn
return Mn
尤其是我不开心的事实,我主要是通过所有的元素N^2次去。我想知道是否会有一种动态的方式。通过“动态”我并不仅仅意味着快速,而且也是这样的,一旦发现某种事物在最低限度内不可能发生,也许它可能被剥夺。并且在pythonic中做所有这些,优雅的方式
这个算法问题比实现问题更多 – hop 2010-11-07 13:41:10
搜索标题为“用于计算子集偏序的简单子二次算法”的论文。我认为它为您的问题提供了一个简单的解决方案。顺便说一句,你的套件有多大? – hop 2010-11-07 13:53:45
Os是可以有数千个元素的集合的子集。通常它的元素少得多,但我需要多次调用这个元素,至少两次,每次添加一个元素。所以它是最优的。我刚刚下载了纸,顺便说一句。你是作者吗? – 2010-11-07 14:02:29