設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