2016年2月

项目需求,不同用户需要从各自有权限的一个字符串数组中,随机生成不同的组合。详细如下:
1)如果字符串数组长度超过4个,则最多取4个。
2)首先取没有生成过、且不管顺序的组合,如果用完,则从已经生成的组合中,取不同顺序的组合。例如:数组[a,b,c,d],先取组合[b,c,a,d]。下一次再取,由于没有不同的组合了,只能取不同顺序排列的组合,即:[c,a,b,d],[c,b,a,d]等等。
3)如果没有可用组合,则从已生成的组合中,随机抽取一个。
4)取可用组合之前,需要检查是否还有可用的组合。如没有,提示用户。

这里有几个问题:
1)需要记录已生成(用过)的组合。
2)如何随机取(生成)不同的组合?
3)检查是否有可用组合时,是否有快速或高效的方法?

逐个问题去解决吧。

1)记录已经使用的组合。肯定要把已经使用的组合记录到数据库,但是要考虑第一次取是无序的组合,即[a,b,c]与[b,a,c]是一样的。于是数据库需要生成一个编码,用于标记该记录。这里采用把所选字符串按顺序排列后,组成一个编码。例如[a,b,c]与[b,a,c]编码都是abc。如果生成的编码过长,可以考虑采用MD5加密,达到压缩的目的。但是每次查询前都要生成MD5,如果数据量不大的话,没必要耗费这些资源。

2)生成随机组合。最简单的就是,先把字符串数组随机排列,然后按数组顺序去生成不同的组合就可以了。具体的生成算法,可以参考:
排列组合生成问题的讨论(二)
http://shmilyaw-hotmail-com.iteye.com/blog/2108293

3)检查是否有可用组合,确实没有什么捷径,只能生成所有组合后才能确定。经过测试,所需时间勉强可以接受。

自从毕业以后,很少有机会写算法相关的程序了。所以,遇到这种工作,还是比较有冲劲去完成。