经过对我的原始问题here进行了大量讨论后,我想出了贪婪集封面的以下实现。从我收到的帮助中,我将问题编码为“贪婪集封面”,在收到更多帮助后,我想出了以下实现。我很感谢大家帮助我解决这个问题。下面的实现工作正常,但我想使其可扩展/更快。如何更快地实现贪婪设置封面?
通过可扩展/速度更快,我的意思是说:
- 我的数据集包含约50K-100K集S中
- 以U本身元素的数量是非常小的100-顺序500
- 每套S的大小可以从0到40
而且这里的任何地方去我尝试:
U = set([1,2,3,4])
R = U
S = [set([1,2]),
set([1]),
set([1,2,3]),
set([1]),
set([3,4]),
set([4]),
set([1,2]),
set([3,4]),
set([1,2,3,4])]
w = [1, 1, 2, 2, 2, 3, 3, 4, 4]
C = []
costs = []
def findMin(S, R):
minCost = 99999.0
minElement = -1
for i, s in enumerate(S):
try:
cost = w[i]/(len(s.intersection(R)))
if cost < minCost:
minCost = cost
minElement = i
except:
# Division by zero, ignore
pass
return S[minElement], w[minElement]
while len(R) != 0:
S_i, cost = findMin(S, R)
C.append(S_i)
R = R.difference(S_i)
costs.append(cost)
print "Cover: ", C
print "Total Cost: ", sum(costs), costs
我不是Python的专家,但是对这段代码的任何Python特定的优化都会非常好。
+1谢谢。你是对的。我正在寻找不必要的优化。就我而言,它在大约15秒内运行对我来说很好。再一次感谢你。 – Legend