Рассмотрим этот способ решения проблемы суммы подмножества:
def subset_summing_to_zero (activities):
subsets = {0: []}
for (activity, cost) in activities.iteritems():
old_subsets = subsets
subsets = {}
for (prev_sum, subset) in old_subsets.iteritems():
subsets[prev_sum] = subset
new_sum = prev_sum + cost
new_subset = subset + [activity]
if 0 == new_sum:
new_subset.sort()
return new_subset
else:
subsets[new_sum] = new_subset
return []
У меня есть это отсюда:
http://news.ycombinator.com/item?id=2267392
Существует также комментарий, в котором говорится, что можно сделать его "более эффективным".
Как?
Кроме того, существуют ли другие способы решения проблемы, которые по меньшей мере такие же быстрые, как выше?
Edit
Меня интересует любая идея, которая приведет к ускорению. Я нашел:
https://en.wikipedia.org/wiki/Subset_sum_problem#cite_note-Pisinger09-2
который упоминает линейный алгоритм времени. Но у меня нет бумаги, может быть, вы, дорогие люди, знаете, как это работает? Возможно, реализация? Возможно, возможен совсем другой подход?
Изменить 2
В настоящее время наблюдается следующее:
Быстрое решение для алгоритма суммирования подмножества Pisinger