我每周都会做一次计算机科学实验室的入门课程。我希望在下一个实验结束时能够快速参加比赛。我想给他们一个像这样的代码块:
public class EfficientCode{
public static void main(){
long startTime, endTime, executionTime;
startTime = System.currentTimeMillis();
yourEfficientMethod():
endTime = System.currentTimeMillis();
executionTime = endTime – startTime;
}
public static void doSomething(){
// you do this part.
}
}
他们将实施doSomething方法,拥有最快代码的人将获得一些奖励分数。
问题是这个问题需要有点简单。学生可以很好地掌握:循环,if / else,字符串,添加,数组等。
以下是我对问题的看法:
我认为,为了在方法之间存在可衡量的性能差异,您必须多次执行某些操作。
答案 0 :(得分:7)
同意'很多次'用于短期操作,但对于较长时间的操作,一次可能就足够了。
我建议查看Project Euler,这是一个很好的编程问题集合。最好的部分是问题的设计考虑了“一分钟规则”,大多数问题应该花费不到一分钟的中等计算机来执行高效的算法来找到答案。这是一个很好的起点。 :)
答案 1 :(得分:4)
两件事。
首先,效率大约是执行时间。它还涉及内存使用,内存访问,文件系统/资源访问等。有很多东西可以用于提高效率。因此,请明确表示您正在寻找运行时间最短的例程。否则你发送的是混合信息......
其次,大约15年前我听到了这个问题,我不能忘记它:
生成所有5位数字对的列表,总和为121212
。但是,这两个数字都不能重复十进制数字。因此1
只能在任一数字中出现一次。因此,示例结果对是98167 + 23045
。有一个公平的数字,很容易建立一个强力解决方案,但一个有效的解决方案需要一些思考。有192个独特的对......
答案 2 :(得分:1)
因为这是一个入门课程而且你的学生还没有涵盖排序,但我认为很难想出一些足够简单的东西,有趣的是有几种不同的方法可以做到这一点,而且很复杂足以使现代计算机上的不同实现之间存在明显的速度差异。但是,你真正的问题是,任何足以让他们尝试的东西都只能通过简短的谷歌搜索进行规范实施。
我的建议是颠覆挑战。让你的学生竞争,想出他们能想到的最节奏,最慢,最节省内存的解决方案。我认为考虑所有错误的做事方式同样考虑到正确的做法在教育上是有价值的,并且最难以成为最好的做法。由于错误的代码真的慢,因此更容易主观地看到结果。没有谷歌搜索答案。最后,在我的(不相关的)意见中,这有使得挑战更有趣的额外好处。
比在另一个字符串中查找字符串更容易变得更糟糕。也许让他们从一个2kb的随机字母数字字符串中提取所有素数。有很多方法让猪听到这个问题。
答案 3 :(得分:0)
这些都是好主意。怎么样有一个排序问题?
答案 4 :(得分:0)
对数字数组进行排序也许是一个好主意,因为它有很多算法(插入,选择,快速,堆等)都具有不同的性能特征。这也可以让学生有机会学习big-O符号等。