【发布时间】:2011-12-18 01:03:19
【问题描述】:
在对我的原始问题here 进行了多次讨论后,我想出了以下贪婪套装封面的实现。根据我收到的帮助,我将问题编码为“Greedy Set Cover”,在收到更多帮助here 后,我提出了以下实现。我感谢大家帮助我解决这个问题。以下实现工作正常,但我想让它可扩展/更快。
通过可扩展/更快,我的意思是说:
- 我的数据集在 S 中包含大约 50K-100K 集
- 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 的优化都会非常好。
【问题讨论】:
标签: python performance algorithm optimization scalability