论坛首页 Java企业应用论坛

对于这个题目,看看大家有什么效率更高的算法

浏览 16811 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-10-17  
anderkey 写道
LZ去参加迅雷在广州的笔试了吧,结果如何?

呵呵,是啊,有些内容(比如:多线程)平时不太注意,这次考了很多。所以答题的时候答得不是很好,再加上可能因为我的这个编程题的算法的效率不好,所以笔试就被BS了。
0 请登录后投票
   发表时间:2010-10-17  
rocketball 写道
母函数来解这来问题

正解,+1
0 请登录后投票
   发表时间:2010-10-17  
JE帐号 写道
shkailiao 写道
bastengao 写道
递归就不一定吃内存,不递归就不一定省内存。  这个问题,我以前也想过,我最早的想法跟楼主是一样的。 但说这句话的人,很可能针对的不是 java 语言。我曾经做过某个东西,最早也用的是递归的方法,我本以为效率会很差,我就换成非递归的,结果是效率更差。 其实,如果要是做的多了的话,楼主应该能够感觉到,在用非递归做是时候,其实是在模仿递归的方式,变量也是。也就是说,非递归的方式在内存使用上,很可能是与递归是一样的。   但话又说回来,java 语言是跟其他语言不一样,因为 java 的内存释放是由虚似机来完成的,不像 其他语言,严格按照 什么 堆啊,栈啊。

谢谢你的回复,C、C++写的程序,当一个变量需要释放内存的时候,可以调用相应的方法,而对于java来说,内存的管理很大部分都是由GC来管理的,程序员很难去控制,总算调用JVM的gc()方法,也不一定可以实现释放内存。所以只要一个对象的引用数不为0,一般都还存在内存中,假如递归的时候,所有的对象的引用都不为0,并且所有对象使用的内存和超过内存时,就会发生溢出。对于将递归转变为while等的循环,可以将一些变量的时间效用会大大减短。所以,我觉得对于java来说,递归比while等之类的循环要吃内存。


和引用没多大关系.
递归是一个栈嵌套的问题.由于嵌套所以无法回收栈调用链上的内存,所以就要求尽量减少单个栈循环所使用的内存.

而且,你的代码不能承受所谓22这个限制,不是因为递归这个过程,而是你要把所有的结果都保存.你把调用addKindOfResultToList方法的代码注释掉试一试.
因为Integer内部封装了是int,而int这些基本数据类型是存在栈中的,而默认情况下,jvm的栈并不是很大,所以很容易OutOfMemoryError: Java heap space

Integer将int打包后是对象,对象怎么会在栈中呢,加上程序的异常是Java heap(是堆,而不是stack栈) space
0 请登录后投票
   发表时间:2010-10-17   最后修改:2010-10-17
kimmking 写道
ray_linn 写道
线性方程组而已,学点数学就成了


3阶斐波拉契数列

正解。
f(n) = f(n-1) + f(n-2) + f(n-3)
f(1) = 1
f(2) = 2
f(3) = 4
ruby代码:
自底向上递推动态规划算法:

def f(n)
f = [1,2,4,7]
return f[n] if n < 4
4.upto(n) do
    f[3] = f[0] + f[1] + f[2]
    f[0], f[1], f[2] = f[1], f[2], f[3]
end
return f[3]
end
2 请登录后投票
   发表时间:2010-10-17   最后修改:2010-10-17
fuliang 写道
kimmking 写道
ray_linn 写道
线性方程组而已,学点数学就成了


3阶斐波拉契数列

正解。
f(n) = f(n-1) + f(n-2) + f(n-3)
f(1) = 1
f(2) = 2
f(3) = 4
ruby代码:
自底向上递推动态规划算法:

def f(n)
f = [1,2,4,7]
return f[n] if n < 4
4.upto(n) do
    f[3] = f[0] + f[1] + f[2]
    f[0], f[1], f[2] = f[1], f[2], f[3]
end
return f[3]
end

+1
数学没学好.但是画了画,还是找到这个规律了..
0 请登录后投票
   发表时间:2010-10-17  
fuliang 写道
kimmking 写道
ray_linn 写道
线性方程组而已,学点数学就成了


3阶斐波拉契数列

正解。
f(n) = f(n-1) + f(n-2) + f(n-3)
f(1) = 1
f(2) = 2
f(3) = 4
ruby代码:
自底向上递推动态规划算法:

def f(n)
f = [1,2,4,7]
return f[n] if n < 4
4.upto(n) do
    f[3] = f[0] + f[1] + f[2]
    f[0], f[1], f[2] = f[1], f[2], f[3]
end
return f[3]
end

对于求出有多少种算法,这种方法应该是一个不错的方法,但对以只是求有多少种走法,用线性规划可能更好。但本题的关键就是要得到走法的种数,并将每一种走法记录下来,然会返回给调用者。
0 请登录后投票
   发表时间:2010-10-17  
即该题的重点是怎么更好的将每一种走法记录下来,让调用者通过调用方法可以得到全部走法的详细的情况。
0 请登录后投票
   发表时间:2010-10-17  
shkailiao 写道
即该题的重点是怎么更好的将每一种走法记录下来,让调用者通过调用方法可以得到全部走法的详细的情况。

建立历史数据。

还是用递归式。

对于任意的数N,其F(N)为分别用第1部走1加上F(N-1)所有走法序列,加上2,加上3。

这样,可以把序列都写入文件,每次内存中几乎不需要保持数据。
当然,如果序列集不大,可以存入内存。

这些,可以计算理论上,不超过硬盘容量的数据了。
0 请登录后投票
   发表时间:2010-10-18  
喜羊羊与灰太狼 写道
rocketball 写道
母函数来解这来问题

正解,+1


正解, +2
0 请登录后投票
   发表时间:2010-10-18   最后修改:2010-10-18
这样够简单吧,两层循环,但是效率嘛,O(n^2)了。因为你是求所有解法,而不是求解法数量
#include <stdlib.h>
#include <stdio.h>

int main(int argc,char** argv)
{
	int n=1000,a=1,b=2,c=3;
	int num1,num2,num3,sum1,i,j;
	num1=(int)(n/c);
	for(i=0;i<=num1;i++)
	{
		sum1=n-i*c;
		num2=(int)(sum1/b);
		for(j=0;j<=num2;j++)
		{
			num3=sum1-j*b;
			if((num3 % a)==0)
			{
				printf("%d*%d + %d*%d + %d*%d = %d\n",i,c,j,b,num3/a,a,n);
			}
		}
	}
	return 0;
}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics