找回密码
 欢迎注册
楼主: northwolves

[提问] 数列通项公式

[复制链接]
 楼主| 发表于 2010-1-11 19:16:51 | 显示全部楼层
这样似乎比直接递归操作效率高多了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-11 19:35:41 | 显示全部楼层
很强大. 似乎对所有的n都可以这样计算. 这样计算F(n)分两步就可以了: n移位, 累加a 或 b northwolves 发表于 2010-1-11 19:02
n为偶数的时候才是这样做。 当k>0的时候,10^k都是偶数,所以不用考虑n为奇数的情况。 当n为奇数的时候,好像要用 F(2n+1)=F(n) 这个式子来算。 例如计算F(99)的步骤如下: F(99)=F(49)=F(24) 24是偶数了,这时才可以用7#的方法。 当然,直接用7#的方法也可以。 99的二进制为1100011,操作结果如下: b,b, a,a,a, b, b 1,2,3,5,7,9,16 只要注意无论n是奇数还是偶数,一律以a的结果作为最终结果既可。 所以上述操作结果以a=7为准,忽略b=16。 所以F(99)=7。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-11 20:11:59 | 显示全部楼层
这种奇偶互变的递归有点像3X+1问题的过程。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-12 08:31:13 | 显示全部楼层
我觉得可能还是可解出来的,不过需要对位操作比较精通才可以。 可以参考一下Knuth的taocp卷四 位操作技巧一册。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-12 09:27:41 | 显示全部楼层
通项公式意义不大,我觉得计算复杂度更加重要. 这个递推式如何: 记$g(n)=F(n-1)$,那么 $g(2^k*n+t)=g(2^k-t)*g(n)+g(t)*g(n+1), "where "1<=t<2^k$

评分

参与人数 1金币 +1 鲜花 +1 收起 理由
KeyTo9_Fans + 1 + 1 这个递推式太棒了!

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-12 10:18:10 | 显示全部楼层
本帖最后由 KeyTo9_Fans 于 2010-1-12 11:09 编辑 mathe太强大了,你是怎么想到这个递推式的? 考虑到要对长度为n的二进制序列进行操作,当n很大的时候,a和b要用高精度来表示。 如果一步一步操作的话,那么每进行一次加法,需要O(n)的时间,所以n次加法需要O(n^2)的时间。 mathe每次把二进制序列折半,然后变成两次大整数乘法运算了。 我们假设大整数乘法运算需要O(n*log(n))的复杂度。 于是根据mathe的递推式,有 T(n) = 2T(n/2)+2n*log(n) 解得 T(n) ~ O(n*(log(n))^2) 比O(n^2)快多了。 (没实现过,可能分析得不正确,大家帮忙检查一下吧)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-12 11:26:58 | 显示全部楼层
我倒是觉得还没有这么好.实际上上面右边有4个一半长度的序列需要计算,只是它们之间关联比较密切 实际上上面的公式中通常计算g(n)和g(n+1)都要伴随出现,为此,我们总可以同时计算两个相邻的数,于是可以 ${:(g(2^kn+t)=g(2^k-t)g(n)+g(t)g(n+1)),(g(2^kn+t+1)=g(2^k-t-1)g(n)+g(t+1)g(n+1)):}$ 也就是计算一组2k比特的数$(g(2^kn+t),g(2^kn+t+1))$可以化为3组k比特数的计算 $(g(n),g(n+1)),(g(2^k-t),g(2^k-t-1)),(g(t),g(t+1))$ 所以$T(2k)=3T(k)+O(klog(k))$,得到$T(k)~=O(k^{3//2}log(k))$

评分

参与人数 1金币 +1 鲜花 +1 收起 理由
KeyTo9_Fans + 1 + 1 能简化成3组已经不容易了。

查看全部评分

毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-12 17:21:28 | 显示全部楼层
本帖最后由 KeyTo9_Fans 于 2010-1-12 17:34 编辑 谢谢mathe。我确实分析错了。 (n/2)规模的数量弄错了。 如果以4个来算,T(n)就是n^2的了。 考虑到那4个序列联系紧密,我猜想可以简化成2个,所以就没有去改了。 实际上简化成3个已经很不容易了。 连这一步我都没有做出来,还是多亏了mathe好不容易想出来的。 所以 $T(n)=3T(n/2)+O(n*log(n))$ 解得 $T(n)=O(n^{log_2 3})$ 其中 $log_2 3=1.585$ 所以 $T(n)=O(n^{1.585})$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-12 19:10:11 | 显示全部楼层
呵呵,我那个$n^{3/2}$也是粗心大意了. 发现函数g(n)在$2^k
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2010-1-13 08:48:18 | 显示全部楼层
为什么需要O(n^2)呢? F(2n+1)=F(n),所以一个奇数n可被归结到一个小于n/2的偶数 F(2n)=F(n)+F(n-1),所以一个偶数n可被归结到一个小于n/2的奇数和小于等于n/2的偶数,亦即一个小于n/4的偶数和小于n/2的偶数 于是 T(n)<(T(n/2)+1)+(T(n/4)+2)+3 其中 T(n/4)+2 表示将n变为n/4需要两次除2操作 T(n/2)+1 表示将n变 n/2需要1次操作 最后的加3为由F(n/4)和F(n/2)求F(n)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-11-22 11:24 , Processed in 0.028396 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表