您的位置:首页 > 其它

算法,求从小到大排序的1500个丑数

2012-11-07 22:24 253 查看
丑数:只包含因子2,3,5的数称为丑数

解这个题的方法,生成法,滚雪球一样,越滚越大,假设我们已经有n个最小的丑数集合S,且已经从小到大排好序,下面我们要找下一个丑数,这个丑数必定是2,3,5与集合S的乘积中大于Smax且是最小的。所以我们可以首先用2乘以集合S,找到大于Smax的最小的数T2,再重复找到T3,T5。取T2,T3,T5的最小值。注:其实我们可以达到o(n)的时间计算复杂度,这还蛮经典的,我们增加3个变量max2,max3,max5,M是当前递增丑数序列的最大数。如果上一步是3乘以集合S得到的数M,这四者的关系是2*D[max2]<3*D[max3+1],5*D[max5]2*D[max2]<=M<2*D[max2+1],3*D[max3]<=M<3*D[max3+1],5*D[max5]<=M<5*D[max5+1],也即下一步我们只要比较这三个数2*D[max2+1],3*D[max3+1],5*D[max5+1]中的最小者,如果是5*D[max5+1],那么max5++,且把5*D[max5+1]取为我们要的下一个丑数,其余两个数max2,max3还是不变。此时我们仍旧有2*D[max2]<=M<2*D[max2+1],3*D[max3]<=M<3*D[max3+1],5*D[max5]<=M<5*D[max5+1]的关系。下面继续比较。可见时间复杂度,如果我们要n的丑数就是o(n^2)

还有个题,给一个重量a克的物体A,还已知我们有3^n克的砝码各一个,n=0,1,...k,...。A物体必须放在天平上,其他的任选。怎么是天平平衡?

我的办法,从n=0开始,求出所有可能的差的组合,检查a是否在里面,不在的话让n++,继续下一步。

我们这里采用分治法时求子问题不是从a开始往下减,而是从n开始,为什么呢,因为a-1的规模并不一定比a小,但是n-1的规模一定比n小。同时这里还有个技术室把问题转化,放大。我们不能直接求出答案,我们求出所有的差,那么如果a在这个集合里,那么问题就解决了。

观察3^n这个数列的特性,会发现,如果使用了3^k,那么最小是(3^k+1)/2,不使用3^k,那么这个数最大是(3^k-1)/2。而(3^k-1)/2和(3^k+1)/2又是相邻的两个数。这样就可以确定是否含有3^k了。如果一个数x,在[(3^m)/2+1,(3^(m+1))/2
)那么必然包含3^m这个数。怎么求这个呢,可以从1开始,不断乘以3,然后和x比较是否比x大,直到第一个比x大的数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐