算法,求从小到大排序的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大的数
解这个题的方法,生成法,滚雪球一样,越滚越大,假设我们已经有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大的数
相关文章推荐
- 对顺序表中元素从小到大排序的算法
- 随机生成10个100以内的整数,把数据从小到大排序,而且算法复杂度只能是1(利用数组的索引也可...
- 算法入门--堆排序(最大堆,从小到大排序)
- [算法]_[对数组内的数字进行从小到大排序]
- 【算法】快速排序算法(递归实现 从小到大排列) 排序范围(0~n-1) n为数组元素个数
- [算法]_[对数组内的数字进行从小到大排序]
- 数学算法:poweroj1026-丑数(根据固定倍数得到从小到大的序列)
- 【算法】插入排序(从小到大) 排序范围(0~n-1)n为数组元素个数
- 【算法】冒泡排序(从小到大) 排序范围(0~n-1)n为数组元素个数
- 算法:Map排序-KEY排序、VALUE排序()([0-9][A-Z][a-z])从小到大排序
- 有一组数据3,5,9,7,4,13,15,0,2,20.已知最大数是20,把数据从小到大排序,而且算法复杂度只能是1
- 【算法】选择排序(从小到大) 排序范围(0~n-1) n为数组元素个数
- 设定二维整数数组B[0..m-1,0..n-1]的数据在行,列方向上都按从小到大的顺序排序,且整形变量x中的数据在B中存在。设计一个算法,找出一对满足B[i][j]=x的I,j值,要求比较次数不超过m
- 【经典算法】第八回:桶排序
- 麻省理工算法导论学习笔记(5)----线性时间排序
- C++——算法基础之排序——选择排序
- 定义一个方法,实现对一维数组的从小到大排序
- 字符串排序等算法
- 内部排序算法之三【选择排序】
- 算法研究之快速排序java版