从m个不定长数组中 各取一个元素的组合生成算法

有M个盒子 每个盒子中有不同数量的球

从每个盒子中各取一个球的组合数量很容易算出: M个盒子中球数量的连乘积


例如 有4个盒子 盒子中球的数目分别是 3个 2个 2个 4个

组合的数量为 3*2*2*4 = 48种 

如果需要遍历这么多的组合 这个算法应该是怎样的呢?


将4个盒子视为(4,x)的不定长二维数组

最简单的方法是用一个4重的循环 每个循环代表每个一维数组的下标 由外到内 分别是 (0,3] (0,2] (0,2] (0,4] 的循环 

像这样:

#!C:\Python33\python.exe
# Filename: traversal.py 

data = ((0,1,2),\
	(0,1),\
	(0,1),\
	(0,1,2,3),\
	) #数据

for i in data[0]:
	for j in data[1]:
		for k in data[2]:
			for l in data[3]:
				print(i,j,k,l);


但是如果盒子的数目是个变量 那岂不是循环的重数也就不定了?

该怎么办?


把每个盒子看成一个"位" 而盒子的下标看成此位上的数值 

例如 第一个盒子取的球号码是2 第二个盒子的球号码是0 ... 1 ...3 以此类推

可以表示为:数字2013

这样就可以将一个组合理解成一种奇怪的复合进制 

最低位是4进制 第2位2进制 第3位2进制 最高位3进制 

这样我们就可以用一个自增的变量来确定每个组合 而不用考虑实际意义

而在实际确定每个盒子取得是几的时候 只需要像类似于十进制取各个位上的值一样 求余处理即可 


Python示例如下:

#!C:\Python33\python.exe
# Filename: traversal.py 

data = ((0,1,2),\
	(0,1),\
	(0,1),\
	(0,1,2,3),\
	) #数据

# indexes = [] # 指针数组 存储被选中元素的ID
lengths = [] # 数据各个子数组的长度

totalLength = 1;
for row in data:
	length = len(row)
	# indexes.append(-1)
	lengths.append(length)
	totalLength *= length;
	pass
for i in range(totalLength):
	j = 0
	for len in lengths:
		print(data[j][i % len],end=' ')
		# indexes[j] = i % len
		i = int(i / len)
		j += 1
		pass
	print();
	# print(indexes);
	pass


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值