排列组合怎么算(排列组合算法真厉害)
排列组合怎么算(排列组合算法真厉害)需求
最近工作中碰到一个需求:我们的数据表有多个维度,任意多个维度组合后进行 group by 可能会产生一些"奇妙"的反应,由于不确定怎么组合,就需要将所有的组合都列出来进行尝试。
抽象一下就是从一个集合中取出任意元素,形成唯一的组合。如 [a,b,c] 可组合为 [a]、[b]、[c]、[ab]、[bc]、[ac]、[abc]。
要求如下:
组合内的元素数大于 0 小于等于 数组大小;
组合内不能有重复元素,如 [aab] 是不符合要求的组合;
组合内元素的位置随意,即 [ab] 和 [ba] 视为同一种组合;
看到这里,就应该想到高中所学习的排列组合了,同样是从集合中取出元素形成一个另一个集合,如果集合内元素位置随意,就是组合,从 b 个元素中取 a 个元素的组合有 种。而如果要求元素顺序不同也视为不同集合的话,就是排列,从 m 个元素取 n 个元素的排列有 种。
我遇到的这个需求就是典型的组合,用公式来表示就是从元素个数为 n 的集合中列出 种组合。
文中算法用Java实现。从排列到组合-穷举
对于这种需求,首先想到的当然是穷举。由于排列的要求较少,实现更简单一些,如果我先找出所有排列,再剔除由于位置不同而重复的元素,即可实现需求。假设需要从 [A B C D E] 五个元素中取出所有组合,那么我们先找出所有元素的全排列,然后再将类似 [A B] 和 [B A] 两种集合去重即可。
我们又知道 ,那么我们先考虑一种情况 ,假设是 ,从 5 个元素中选出三个进行全排列。
被选取的三个元素,每一个都可以是 ABCDE 之一,然后再排除掉形成的集合中有重复元素的,就是 5 选 3 的全排列了。
代码是这样:
对于结果组合的排重,我借用了 Java 中 HashSet 的两个特性:
元素唯一性,选取三个元素放到 Set 内,重复的会被过滤掉,那么就可以通过集合的大小来判断是否有重复元素了,
元素无序性,Set[A B] 和 Set[B A] 都会被表示成 Set[A B]。另外又由于元素唯一性,被同时表示为 Set[A B] 的多个集合只会保留一个,这样就可以帮助将全排列转为组合。可以注意得到,上面程序中 count 参数是写死的,如果需要取出 4 个元素的话就需要四层循环嵌套了,如果取的元素个取是可变的话,普通的编码方式就不适合了。
注: 可变层数的循环可以用 递归 来实现。
从排列到组合-分治
穷举毕竟太过暴力,我们来通过分治思想来重新考虑一下这个问题:
分治思想
分治的思想总的来说就是"大事化小,小事化了",它将复杂的问题往简单划分,直到划分为可直接解决的问题,再从这个直接可以解决的问题向上聚合,最后解决问题。
从 M 个元素中取出 N 个元素整个问题很复杂,用分治思想就可以理解为:
首先,如果我们已经从 M 中元素取出了一个元素,那么集合中还剩下 M-1 个,需要取的元素就剩下 N-1 个。还不好解决的话,我们假设又从 M-1 中取出了一个元素,集合中还剩下 M-2 个,需要取的元素只剩下 N-2 个。直到我们可能取了有 M-N+1 次,需要取的元素只剩下一个了,再从剩余集合中取,就是一个简单问题了,很简单,取法有 M-N+1 种。如果我们解决了这个问题,已经取完最后一次了产生了 M-N+1 种临时集合,再考虑从 M-N+2 个元素中取一个元素呢,又有 M-N+2 种可能。将这些可能聚合到一块,直到取到了 N 个元素,这个问题也就解决了。
还是从 5 个元素中取 3 个元素的示例:
从 5 个元素中取 3 个元素是一个复杂问题,为了简化它,我们认为已经取出了一个元素,还要再从剩余的 4 个元素中取出 2 个,求解公式为:。从 4 个元素中取出 2 个依旧不易解决,那我们再假设又取出了一个元素,接下来的问题是如何从 3 个元素中取一个,公式为 。从 3 个元素中取 1 个已经是个简单问题了,有三种可能,再向上追溯,与四取一、五取一的可能性做乘,从而解决这个问题。代码实现
用代码实现如下:
其实就是 递归。
直击本质-位运算
从元素的全排列找全组合,比穷举略好,但还不是最好的方法,毕竟它"绕了一次道"。
很多算法都能通过位运算巧秒地解决,其优势主要有两点:一者位运算在计算机中执行效率超高,再者由于位运算语义简单,算法大多直指本质。
组合算法也能通过位运算实现。
思想
再次考虑全组合的需求,从 M 个元素中取任意个元素形成组合,组合内元素不能重复、元素位置无关。
之前的方法都是从结果组合是否满足要求来考虑问题,考虑组合是否有重复元素、是否已有同样的组合等条件。如果换种思路,从待选元素上来考虑呢?
对于每个元素来说,它的状态就简单得多了,要么被放进组合,要么不放进组合。每个元素都有这么两种状态。如果从 5 个元素中任意取 N 个元素形成组合的话,用二进制位来表示每个元素是否被放到组合里,就是:
看到这里,应该就非常清楚了吧,每种组合都可以拆解为 N 个二进制位的表达形式,而每个二进制组合同时代表着一个十进制数字,所以每个十进制数字都就能代表着一种组合。
十进制数字的数目我们很简单就能算出来,从00000... 到 11111... 一共有 种,排除掉全都不被放进组合这种可能,结果有种。
前鼻韵母有哪些(前鼻音韵母aneninunn)前鼻韵母有哪些(前鼻音韵母aneninunn)部编版语文一年级上册,拼音学习的第12课有五个前鼻音韵母。怎么学习学生记得牢?看资深教师手写笔记,帮助学生学习语文,帮助家长辅导学生!
嫁个100分男人插曲(海岛女民,从小说到银幕)嫁个100分男人插曲(海岛女民,从小说到银幕)日前,艺人梁咏琪及罗仲谦便到盲人学校出席了电影小Q的探访活动,而这次活动更安排两位视障同学一同上台合力演奏,并且以纯净的歌声献唱方皓玟
中考满分多少分(今年中考总分多少各科都是多少分)中考满分多少分(今年中考总分多少各科都是多少分)2021年各地区中考总分是多少?本文整理了相关内容,欢迎阅读。12021聊城中考总分语文120分数学120分英语120分(含听力30
体育课说课稿(小学体育就该这么讲)体育课说课稿(小学体育就该这么讲)说课稿范例小学体育说课稿弯道跑说课稿各位评委老师大家好!我是小学体育组的01号考生,今天我说课的题目是弯道跑,下面开始我的说课。一说设计理念本节课
适合集体玩的小游戏(团体小游戏大全)适合集体玩的小游戏(团体小游戏大全)团体小游戏大全简单有意义的小游戏共20个一群人好不容易聚在一起想好好玩一下的时候,去k歌都自己唱自己的,纯聊天又太过于无聊,想团体一起玩些好玩的
技术助力爱奇艺内容创新和用户体验的升级爱奇艺公司在中国的创新市场领先的在线娱乐服务,很高兴地宣布,该公司的首席技术官(CTO)刘文峰于8月28日参加了第24届香港国际电影电视市场(FILMART)。在名为ldquo关注
洗牙的价格(洗牙有没有必要?)洗牙的价格(洗牙有没有必要?)许多人对洗牙有着一定的误解认为洗牙和洗澡一个道理嘛其实还是有区别的那么什么是洗牙?洗牙有什么利弊?1什么是洗牙?洗牙是维持牙周组织健康预防牙周病发生或
熊猫的特点(大熊猫为什么会成为国宝)熊猫的特点(大熊猫为什么会成为国宝)在山海经中,曾经记载了逐鹿之战,这是中国上记录最早的战争。黄帝和蚩尤率领着各自的部落在涿鹿的田野上战斗,最终蚩尤大败,被黄帝活捉。在这场战争中,
情侣之间送什么礼物(情侣之间送什么礼物好)情侣之间送什么礼物(情侣之间送什么礼物好)关于情侣之间送什么礼物好,相信每个人都有不一样的看法,有的认为实用关键,有的认为需要一定的创意,也有的觉得浪漫就好。其实情侣之间适合送什么
情侣浪漫(情侣之间的20个浪漫方法)情侣浪漫(情侣之间的20个浪漫方法)对于大部分情侣来说,约会最常做的事就是逛街吃饭和看电影,时间长了,多多少少都会有些乏味。今天就给大家介绍20件情侣之间可以做的浪漫小事,做过的打
恋爱阶段(恋爱的三个阶段)恋爱阶段(恋爱的三个阶段)阿秋说茫茫人海中,遇见便是缘,相守既是情,点击上方关注我,一起为更好的自己加油!俗话说女怕嫁错郎,男怕娶错妻,这句俗话对应的另一句俗话便是女嫁错郎毁一生,
麦冬茶(食疗养生嗓子发干,饮上一杯麦冬茶)麦冬茶(食疗养生嗓子发干,饮上一杯麦冬茶)一旦感到咽干口燥,光喝水解不了渴,就需要小药茶来帮帮忙了,这里为大家介绍一例麦冬茶。麦冬具有养阴生津解渴润肺清心除烦的作用,是养阴类中药里
怎样玩魔方(简单的魔方教程)怎样玩魔方(简单的魔方教程)爱她就带她一起学习,和小女儿一起学会魔方这个过程,让我深刻感受到陪伴就是爱,特整理了一下我们学习魔方的教程,以供大家参考。几乎每个家庭都有魔方,可是能顺
大学宣传部工作总结(工作总结)大学宣传部工作总结(工作总结)时间如白驹过隙,2020即将过去,新一年的大幕即将徐徐拉开。回顾一年来,在中心领导的关心帮助下,在各位同事的大力支持下,自己坚持立足本职,工作中扎扎实
厦门巾帼园(厦门巾帼园培训中心)厦门巾帼园(厦门巾帼园培训中心)厦门市巾帼园是厦门市妇女联合会下属的全民事业单位,成立于1999年8月31日,并于2000年7月8日正式对外开放。巾帼园大厦位于厦门市松柏新市区中心
珠海旅游景点(六个最佳旅游景点)珠海旅游景点(六个最佳旅游景点)历来被评为最佳宜居城市的珠海,不仅气候宜人,自然风光与人文景观更是美不胜收。而在诸多旅游景点当中,最受欢迎的就是以下六个景点1。野狸岛野狸岛也叫作名
日常知识kpi是什么意思在我们的生活当中有很多的常识性的知识大多数人都是不知道的,就好比最近就有很多小伙伴咨询小编问小编关于kpi是什么意思的这些知识点,这就说明了现在人们也开开渐渐关注起了kpi是什么意
推销商品(推销商品)推销商品(推销商品)销售员怎么推销产品如何去推销产品有位顾客来到一家家具店想购买一把办公椅子,于是推销员带着这位顾客看了一遍店内的商品。顾客那两把椅子怎么卖?推销员那个较大的是28
推销商品(推销商品教程)推销商品(推销商品教程)在销售行业中,因为我们每天接触大量的顾客,因此对付不同类型的顾客所采用的口才技巧也是不一样的。那么今天我们一起来了解一下,遇到哪些顾客该用哪些口才技巧,相信
支付系统号是什么(单位支付业务经办人写谁的名字)在上一篇支付系统之银行卡支付中,挖了个坑,就是关于绑卡的坑。在用户使用银行卡做支付之前,首先需要完成绑卡的操作。怎么实现绑卡,怎么验证用户绑的是自己的而不是隔壁老王的卡,这就是本期
母亲节给妈妈画一张画(母亲节给妈妈画)亲节,一组简笔画送给母亲妈,您辛苦了!从我们呱呱坠地,到成长阶段母亲的身影总是在我们的身边艺术家用简笔画的形式表达对母亲的爱当您老了,我会向您时候背着我一样,带你去看遍千山万水母亲
手机root什么意思(手机root什)手机root什么意思(手机root什)手机root是什么意思?root权限是什么意思?智能机的普及,用户不单单是作为通讯工具来使用它,会去发掘它的配置,它的黑科技以及更深层次的东西