我正在尝试解决一个问题,我需要找到将n个元素分为k组的所有可能的解决方案,其中k可以从1到n变化。我用第二种斯特林数来解决这个问题 S(n,k)= S(n – 1,k – 1)+ kS(n – 1,k)。
所以S(4,2)的输出将是这样的:
[[0,1,2],[3]]
[[0,1,3],[2]]
[[0,2,3],[1]]
[[0,3],[1,2]]
[[0,1],[2,3]]
[[0,2],[1,3]]
[[0],[1、2、3]]
我在python中使用递归实现了这一点,如下所示:
from __future__ import print_function
import sys
import copy
def recursion_sterling_set(n,k):
if k ==1:
return [[[x for x in range(n)]]]
elif n == k :
return [[[x] for x in range(n)]]
else:
temp_n = n
temp_k = k
s_n_1_k_1 = recursion_sterling_set(temp_n-1,temp_k-1)
for i in range(len(s_n_1_k_1)):
s_n_1_k_1[i].append([temp_n-1])
k_s_n_1_k= []
temp = recursion_sterling_set(temp_n-1,temp_k)
for i in range (k):
temp_ = copy.deepcopy(temp)
k_s_n_1_k += temp_
for i in range(len(temp)*k):
k_s_n_1_k[i][int(i/len(temp))] += [temp_n-1]
return (s_n_1_k_1+k_s_n_1_k)
solution = recursion_sterling_set(int(sys.argv[1]),int(sys.argv[2]))
for i in solution:
print (i)
print ("len= ",len(solution),"size= ",sys.getsizeof(solution))
这对于小n完美工作,尝试了n = 10。但是对于大n(大于20),这可能是由于内存和递归而挂起的。
我最近开始使用python,想了解是否存在一些更有效的方法来实现这一点。我当时正在考虑使用generators / yield来减少内存占用。希望能获得一些帮助
这不同于以所有可能的方式分割数组(Split an array in all possible combinations (not regular splitting))。有点不同,例如以2为一组的方式排列3个元素的方式数量会产生3个解决方案,如下所示:
[[1,2 ,, [3]],[[1,3],[2]],[[2,3],[1]]
在拆分数组解决方案时将仅生成以下2:
[[1,2 ,, [3]],[[1],[2,3]]