使用python

时间:2019-01-03 15:43:29

标签: python algorithm list recursion

我正在尝试解决一个问题,我需要找到将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]]

0 个答案:

没有答案