返回   cpper编程论坛 > 算法
注册账号 论坛帮助 会员列表 日历事件 搜索 今日新帖 标记版面已读

回复
 
LinkBack 主题工具 显示模式
  #1 (permalink)  
旧 2008-05-14
polyrandom 的头像
超级版主
 
注册日期: 2002-09-03
帖子: 3,135
文章: 20
polyrandom 正向着好的方向发展
默认 把整数分解为质数和

给定任意大于等于8的整数I,求指数数列x1, x2, ..., xn,使得x1 + x2 + ... + xn等于I,并且x1, x2, ..., xn两两不同。并且,如果有多个这样的数列满足这一条件,那么,要求出这些数列中n最大的那个。

其实算法不难的,问题是我想出的算法复杂度太高了,有没有低一点的?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #2 (permalink)  
旧 2008-05-16
liuxinyu 的头像
高级会员
 
注册日期: 2006-02-09
帖子: 303
文章: 48
liuxinyu 正向着好的方向发展
默认 回复: 把整数分解为质数和

为什么是n最大,而不是最小呢?
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #3 (permalink)  
旧 2008-05-20
Elminster 的头像
超级版主
 
注册日期: 2002-09-09
帖子: 1,763
Elminster 正向着好的方向发展
默认 回复: 把整数分解为质数和

引用:
作者: polyrandom 查看帖子
给定任意大于等于8的整数I,求指数数列x1, x2, ..., xn,使得x1 + x2 + ... + xn等于I,并且x1, x2, ..., xn两两不同。并且,如果有多个这样的数列满足这一条件,那么,要求出这些数列中n最大的那个。

其实算法不难的,问题是我想出的算法复杂度太高了,有没有低一点的?
复杂度太高是多高?这个问题可以看作整数背包问题的一个变种,有 O(I*k) 的算法,这里 k 是所有小于 I 的整数的素数个数。你要更低的话,怕是难了。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #4 (permalink)  
旧 2008-05-20
polyrandom 的头像
超级版主
 
注册日期: 2002-09-03
帖子: 3,135
文章: 20
polyrandom 正向着好的方向发展
默认 回复: 把整数分解为质数和

我没想出O(I*K)的算法,我想出的就是最简单的brute force,所以连复杂度都懒得去算了。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #5 (permalink)  
旧 2008-05-21
Elminster 的头像
超级版主
 
注册日期: 2002-09-09
帖子: 1,763
Elminster 正向着好的方向发展
默认 回复: 把整数分解为质数和

引用:
作者: polyrandom 查看帖子
我没想出O(I*K)的算法,我想出的就是最简单的brute force,所以连复杂度都懒得去算了。
brute force 也就 O(2^k * k) 的复杂度,考虑到 I 和 k 的关系,其实快的有限。这个算法的基本思路是:

1. 记 是能够所有能够被分解为前 m 个质数中某些数之和且小于 I 的数构成的集合。
2. 则 ,这里 是第 m+1 个质数, 中每个元素加上 后得到的集合。
3. 从 开始算到 ,最后检查一遍就好了。

这个过程中任意一个 ,大小不超过 I ,很容易做到计算每个 的时候复杂度是 O(I) ,一共计算 k 个,所以复杂度是 O(I*k)。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #6 (permalink)  
旧 2008-05-22
bankrock 的头像
高级会员
 
注册日期: 2003-12-11
帖子: 843
文章: 7
bankrock 正向着好的方向发展
默认 回复: 把整数分解为质数和

看标题还以为是歌德巴赫猜想,原来质数已知。
这个n最大是什么意思?x1,x2,..,xn是按大小排列的吗?如果是的话Dynamic Progamming 应该可以搞定。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
  #7 (permalink)  
旧 2008-05-30
polyrandom 的头像
超级版主
 
注册日期: 2002-09-03
帖子: 3,135
文章: 20
polyrandom 正向着好的方向发展
默认 回复: 把整数分解为质数和

找到一个极快的方法,假设X(n) = n的质数分解。
1.计算质数序列P(i)
2.计算和序列S(i) = P(1) + P(2) + ... + P(n)
3.在S(i)里面找到大于等于整数n的最小数,记为S(k)
4.用DP/整数背包/...求S(k) - n的质数分解。
5.如果存在,或者S(k) - n == 0,那么结果就是 { P(1), P(2), ..., P(k) } - X(n)
6.如果不存在,k += 1, go to 4

另外,第4步可以递归地调用这个方法来求出S(k) - n的分解。这个算法不是很完善,不过意思应该到了。

btw:我是在看另一断程序的时候受到的启发,虽然那段程序不完全是这样做的。
Digg this Post!Add Post to del.icio.usBookmark Post in TechnoratiFurl this Post!
回复时引用此帖
回复

书签

主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛启用 表情符号
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用



所有时间均为格林尼治时间 +9。现在的时间是 09:10 AM


Powered by vBulletin® 版本 3.7.0
版权所有 ©2000 - 2008,Jelsoft Enterprises Ltd.
(C) Copy Right All Right Reserved 2001 - 2007

Search Engine Friendly URLs by vBSEO 3.1.0