关于用 java 实现算法编程的困惑

问题描述

嗯,没错,我们都知道c,c++等机器执行效率很高,java在这方面没法比,但是我只喜欢java,最近在poj上做题,由于我是菜鸟,就挑简单点的做,这不,今天碰到的个非常水的题,如下:http://poj.org/problem?id=1953,这个题,想了会,找了会规律发现,根本不用去遍历,这个题就是个典型的数学题,小学生都会,如下:n=1answer=2n=2answer=3n=3answer=5n=4answer=8n=5answer=13呵呵,看到规律了吧,我还是不放心,我用遍历判断的方法又测试了几个大点数,没错,就是这个规律,说了这么多貌似跑题了,我的困惑在哪呢?我用publicstaticintgetRes(intn){inta=2;intb=3;intres=0;if(n==1){returna;}elseif(n==2){returnb;}for(inti=0;i<n-2;i++){res=a+b;a=b;b=res;}returnres;}

来实现求解,最后结果非常满意,172ms,嗯比其他大部分水友的效率都高,但是我发现有水友用java0s就可以实现的。我就在思考,怎么做到的,想了想估计是我的getRes方法还是消耗了很多时间,于是我在看到题目的n最多不大于45,所以我决定后台生成所有的结果,直接在程序中初始化一个数组,把上面的结果全部放入,然后输入n直接去数组取,这样的话应该不消耗时间了吧?哈哈,我暗自得意,以为问题就这么简单。我submit后不出所料AC了,但是,尼玛变219ms了。我就不明白了,为什么我直接从数组中取数,比用算法计算得出结果的时间还要长??想了半天,无解,苦恼中,困惑中。。祈求大牛指点迷津!跪求!

解决方案

解决方案二:
尼玛,需要帮助的时候就没人来了,没事找着资料发发稿子谁都会,遇到问题就尼玛没人帮啊!
解决方案三:
publicstaticintgetRes(intn){inta=2;intb=3;if(n==1){returna;}elseif(n==2){returnb;}returngetRes2(n-1)+getRes2(n-2);}

要是我可能这么写,但是这个数据量多的时候也慢,不知道楼主那个时间怎么计算的,查询数据也是需要时间的
解决方案四:
publicstaticintgetRes(intn){inta=2;intb=3;if(n==1){returna;}elseif(n==2){returnb;}returngetRes(n-1)+getRes(n-2);}

上面贴错了,递归,数据量小比如n<10,这个方法应该比for循环快点
解决方案五:
publicstaticintgetRes(intn){return(int)((Math.pow((1+Math.sqrt(5))/2,n+2)-Math.pow((1-Math.sqrt(5))/2,n+2))/Math.sqrt(5));}

这个能通过么?
解决方案六:
试试直接用switch语句
解决方案七:
速度最快的肯定是直接用公式求解:http://baike.baidu.com/view/816.htm楼主给出来的是迭代算法,也就是老老实实慢慢加了。3楼给出来的是递归,比迭代算法更慢。楼主的疑问没啥好奇怪的吧,你所谓的后台算法,CPU时间都会被记录的,偷鸡是不行的。你如果真想试试能不能偷鸡,把45以内的值写死在程序代码所定义的数据里面,然后直接从数组里面获取结果吧。
解决方案八:
引用6楼ldh911的回复:

速度最快的肯定是直接用公式求解:http://baike.baidu.com/view/816.htm楼主给出来的是迭代算法,也就是老老实实慢慢加了。3楼给出来的是递归,比迭代算法更慢。楼主的疑问没啥好奇怪的吧,你所谓的后台算法,CPU时间都会被记录的,偷鸡是不行的。你如果真想试试能不能偷鸡,把45以内的值写死在程序代码所定义的数据里面,然后直接从数组里面获取结果吧。

递归那个,我测试n大概在小于10的时候,的确是比for循环快的,不过越往后,就不如for循环快了
解决方案九:
全部结果预先放入内存?查表法也有应用场景的,它有2个使用条件1.运算量大,也就是说计算非常消耗时间。2.有限空间,也就是说结果表空间不大。举个例子,如果题目是素数判断。20以内素数查表法时间复杂度是最差的,超过百万空间复杂度也很高。一万以内的素数判断,查表法的效率就很高了。
解决方案十:
引用4楼u012872817的回复:

publicstaticintgetRes(intn){return(int)((Math.pow((1+Math.sqrt(5))/2,n+2)-Math.pow((1-Math.sqrt(5))/2,n+2))/Math.sqrt(5));}

这个能通过么?

这个可以通过,只是时间会很慢,应为pow是很多乘运算,很慢的,
解决方案十一:
引用7楼shixitong的回复:

Quote: 引用6楼ldh911的回复:
速度最快的肯定是直接用公式求解:http://baike.baidu.com/view/816.htm楼主给出来的是迭代算法,也就是老老实实慢慢加了。3楼给出来的是递归,比迭代算法更慢。楼主的疑问没啥好奇怪的吧,你所谓的后台算法,CPU时间都会被记录的,偷鸡是不行的。你如果真想试试能不能偷鸡,把45以内的值写死在程序代码所定义的数据里面,然后直接从数组里面获取结果吧。

朋友你说直接用公式最快怎么得到的???为什么自己没有去做就乱说呢,直接用公式没有for循环快的,递归的话,数大直接回TLE的,哎

时间: 2024-12-05 23:59:37

关于用 java 实现算法编程的困惑的相关文章

编译-一个java新手在编程路上遇到的问题

问题描述 一个java新手在编程路上遇到的问题 路过的大牛瞄一眼,谢谢...大一学生一枚,java学到网络编译了,最近在实现ftp服务器,目前还没写出来,心情十分郁闷,我觉得自己要成为编程员的随机应变能力还不够,编程路上的困惑,曾经也遇过类似状况求个回复. 解决方案 没什么,大一的时候让我自己去实现一个ftp服务器,我也觉得挺困难的.所以你要上大学啊. 解决方案二: 困惑:坚持.不会:学习.前排 解决方案三: 任何知识都有一个主干,首先要了解基本的原理,然后再学习细节.如果你是自学,一定要注意这

《Java 7并发编程实战手册》第六章并发集合

由人民邮电出版社出版的<Java 7并发编程实战手册>终于出版了,译者是俞黎敏和申绍勇,该书将于近期上架.之前并发编程网组织翻译过此书,由于邮电出版社在并发网联系他们之前就找到了译者,所以没有采用并发网的译稿,但邮电出版社将于并发网展开合作,发布该书的样章(样章由并发网挑选,你也可以回帖告诉我们你想看哪一章的样章),并组织赠书活动回馈给活跃读者.活动详情请时刻关注并发网的微博和微信(微信号:ifeves),最后祝各位用餐愉快!:) 本章将介绍下列内容: 使用非阻塞式线程安全列表 使用阻塞式线程

由于本人函授本科,期末JAVA两题编程不会写,楼主只会C。望高手们帮忙一下,明早一大早就要考试了,坐等

问题描述 某商场10年店庆活动,规定消费金额500元以上的部分可以给予95折,消费1000元以上的部分可以给予9折,消费2000元以上的部分可以给予85折.现要求设计一个程序,要求根据用户从键盘输入的商品总价计算出折后价.要求输出格式为:=======================原价:600.00元折后价:595.00元=======================设有一个四位数,它的四位数字分别是ABCD,而其又满足一下条件:ABCD*9=DCBA,试编写一段小程序计算这个四位数究竟是多少

Java排序算法总结之冒泡排序_java

本文实例讲述了Java排序算法总结之冒泡排序.分享给大家供大家参考.具体分析如下: 前言:冒泡排序(BubbleSort)就是依次比较相邻的两个数,将小数放在前面,大数放在后面. 下面让我们一起    来看冒泡排序在Java中的算法实现. 冒泡排序是计算机的一种排序方法,它的时间复杂度为O(n^2),虽然不及堆排序.快速排序的O(nlogn,底数为2),但是有两个优点: 1."编程复杂度"很低,很容易写出代码: 2.具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后

算法 日期-JAVA日期算法问题????

问题描述 JAVA日期算法问题???? 参数:开始时间.结束时间,时间格式:yyyy-MM-dd,可以考虑用UnixTime转换计算 前置条件: 1.每个月15日是定死的中间比对日期,即结算时间 2.开始时间必须是小于结束时间 需要解决的问题: 按输入的开始时间.结束时间,动态计算从开始时间到结束时间之间每个月与结算时间的相差天数,并且记录最后的结算日期 比如: 开始时间3月1日,结束时间5月10日, 3月1日至3月15日算一次天数,并且记录下3月15日, 然后开始时间变为3月15日,至4月15

Java网络服务器编程(NIO版)

编程|服务器|网络 从Java 1.4开始提供的NIO API常用于开发高性能网络服务器,本文演示了如何用这个API开发一个TCP Echo Server.   Java网络服务器编程 一文演示了如何使用Java的Socket API编写一个简单的TCP Echo Server.其阻塞式IO的处理方式虽然简单,但每个客户端都需要一个单独的Thread来处理,当服务器需要同时处理大量客户端时,这种做法不再可行.使用NIO API可以让一个或有限的几个Thread同时处理连接到服务器上的所有客户端.

让你不苦恼:Java的中文编程配置心得

编程|心得|中文 Java的中文编程与配置心得 Java的中文问题历史悠久,连绵不绝,至今也没有完全解决,但是上有政策下有对策,我们总是有办法搞定它的.跟Java相关的中文问题主要有两类,一类是编程的问题,涉及到I/O,内码转换等.第二类是Java运行环境的配置,涉及字体,属性配置等.我刚刚用了一天的时间解决这些问题,觉得很有必要给自己写个备忘录之类的. 我看还是从问题入手吧,这样不致于让大家打瞌睡.我想写个程序,这个程序有个基本功能就是显示文件内容,我用JTextArea来做显示的事情,程序简

java排序算法

Java 1.0和1.1库都缺少的一样东西是算术运算,甚至没有最简单的排序运算方法.因此,我们最好创建一个Vector,利用经典的Quicksort(快速排序)方法对其自身进行排序. 编写通用的排序代码时,面临的一个问题是必须根据对象的实际类型来执行比较运算,从而实现正确的排序.当然,一个办法是为每种不同的类型都写一个不同的排序方法.然而,应认识到假若这样做,以后增加新类型时便不易实现代码的重复利用. 程序设计一个主要的目标就是"将发生变化的东西同保持不变的东西分隔开".在这里,保持不

请问java图形界面编程中怎样改变消息提示框中确定按钮的文本内容啊?

问题描述 请问java图形界面编程中怎样改变消息提示框中确定按钮的文本内容啊? 问题补充:恩恩,swing的!请问怎么改啊?xiaolv 写道 解决方案 JOptionPane.setDefaultLocale(Locale.CHINA);JOptionPane.showMessageDialog(null, "11", "22",JOptionPane.INFORMATION_MESSAGE);这个按钮自动集成多语言.只能通来Locale来改.想要OK就用Loca