设Os是偏序集,给定Os中的任意两个对象O1和O2,如果O1大于O2,F(O1,O2)将返回1;如果O1小于O2,则返回1;如果O1小于O2,则返回2;如果O1等于O2,则返回0。在
我需要找到元素的子集Mn是Os的最小值。对于Mn中的每个A,对于Os中的每个B,F(A,B)永远不等于1。在
这不难做到,但我相信可以用一种更具Python式的方式来完成。在
快速而肮脏的方法是:
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次。我想知道是否有一个动态的方法。 我所说的“动态”并不仅仅是指快速,而是指一旦发现某件事在最小程度上是不可能的,也许它可以被取消。以一种优雅的方式来完成这一切
GetMinOs2
下面,“动态”删除已知的非最小元素。它使用一个列表Ol
,它以Os
的所有元素开头。 “指针”索引l
指向列表Ol
的“结尾”。当找到一个非最小元素时,它的位置与Ol[l]
中的值交换,并且指针l
减少,因此{GetMinOs2
假设{在下面的测试代码中,使用dreamt up
f
,我的time it run显示速度提高了54倍:结果的时间是:
^{pr2}$请注意:我还没有彻底检查GetMinOs2中的算法,但我认为总体思路是正确的。我在脚本的末尾做了一个小测试,测试结果表明它至少对示例数据
set(range(1000))
起作用。在相关问题 更多 >
编程相关推荐