递归与分治策略——集合划分问题,众数问题

集合划分问题

n个元素的集合{1,2,.,n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2,3,4}可以划分为15个不同的非空子集如下:
{1}
{2}{3}{4}} {{12}{3}{4}}

{{1
3}{2}{4}} {{14}{2}{3}}

{{2
3}{1}{4}} {{24}{1}{3}}

{{3
4}{1}{2}} {{12}{34}}

{{1
3}{24}} {{14}{23}}

{{1
23}{4}} {{124}{3}}

{{1
34}{2}} {{234}{1}}

{{1
234}}

编程任务:
给定正整数n m,计算出n 个元素的集合{1,2,., n }可以划分为多少个不同的由m

非空子集组成的集合。

 

算法思路:

n个元素的集合可以划分为F(n,m)个不同的由m个非空子集组成的集合。
考虑3个元素的集合,可划分为

① 1
个子集的集合:{{12
3}}
② 2
个子集的集合:{{12}{3}}{{13}{2}}{{23}
{1}}
③ 3
个子集的集合:{{1}{2}
{3}}
F(3,1)=1;F(3,2)=3;F(3,3)=1;
如果要求F(4,2)该怎么办呢?

A.
里添一个元素{4},得到{{123}
{4}}
B.
里的任意一个子集添一个4,得到

{{1
24}{3}}{{12}{34}}

{{1
34}{2}}{{13}{24}}

{{2
34}{1}}{{23}{1
4}}

F(4,2)=F(3,1)+2*F(3,2)1+2*3
7

推广,得F(n,m)=F(n-1,m-1)+m*F(n-1,m)

众数问题

给定含有n个元素的多重集合S,每个元素在S中出现的次数称为该元素的重数。多重集S中重数最大的元素称为众数。例如,S={122235}。多重集S的众数是2,其重数为3

数据输入

输入包括多组数据,请处理到EOF结束。每组数据,以一个n(1<=n<=100,000)开始,接下n行,每行有一个数字(-231~231)

数据输出

对于每组输入数据,输出一行一个数字,表示众数。如果存在多个解,只需输出值最小的众数即可。

 

算法思路:首先用快速排序算法排序数组,找到当前数组的中位数及其位置,然后把在数组中与中位数相同的数字向它靠拢,就可以统计中位数的个数。现在数组已经被中间这些相等的数字分开了。那么递归条件就有了。如果中位数的个数比它左边这段短,那么说明左边有可能找到更多的,所以递归继续。反之,如果左边这段数的长度比较短,那么就没必要继续递归。对右边那段数据使用同样的策略。

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值