本帖最后由 dangerace 于 2020-11-5 23:10 编辑
目前论坛上能找到的解决m选n组合问题,基本都采用的递归算法。众所周知递归算法存在一定的局限性,性能也并不出色,所以就有了一些其他算法的出现。 我这个算法是仿照《编程珠玑》中第二章中,编程解决组合问题里的一个思路,就是01交换法来求组合数。 使用0或1表示集合中的元素是否出现在选出的集合中,因此一个0/1列表即可表示选出哪些元素。例如:[1 2 3 4 5],选出的元素是[1 2 3]那么列表就是[1 1 1 0 0]。 使用01交换法的思路是,首先用一个数组用于记录集合中某元素是否被选中。因为需要在m个元素中选择n个,所以这个数组中总共有n个为1的元素,其他均为0。因此在初始化过程中,将该数组前n个元素赋值为1,其余m-n个元素赋值为0。然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。当第一个“1”移动到数组的m-n+1的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。
代码写的比较烂,里面变量命名也不规范,运行效率一般,我感觉还有提升空间,但是意思到了,也尽量写了很详细的注释,希望各位大佬批评指正。 这个算法相比递归算法的最大好处是,对大数据的运算能力比较强。用递归算法,当数据量很大,递归层数太多时,就容易出现堆栈溢出的情况,而这个算法面对大量数据,虽然可能会慢,但稳定性好,只要等,就会一直算。
|