【问题标题】:Looking for good bonus quiz to test efficiency (specifically efficiency related to time) [closed]寻找好的奖金测验来测试效率(特别是与时间相关的效率)[关闭]
【发布时间】:2011-06-13 21:37:32
【问题描述】:

我每周做一次计算机科学入门实验室。我希望在下一个实验室结束时能有一场快速的比赛。我想给他们这样的代码块:

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、字符串、加法、数组等。

以下是我对问题可能的想法:

  • 找出 1 到 1,000,000 之间的所有完美数。 (完美数是所有数的因数相加的数。即:6 = 3 + 2 + 1)
  • 找出 1 到 1,000,000 之间的所有素数

我认为,为了使方法之间的性能存在可衡量的差异,您必须多次执行某项操作。

【问题讨论】:

  • 这个问题可能更适合programmers.stackexchange.com吗?
  • 我读对了吗?您正在教授这门课程,并且您在问“我认为,为了使方法之间的性能存在可衡量的差异,您必须多次执行某项操作。”?
  • 您需要小心地指定严格的指导方针和参数,以确定什么是可接受的。我只是硬编码一个完美/质数列表,并让它打印出来。没有代码能打败它。可以说,我不应该获得奖励积分(如果我在课堂上,我的观点会有所不同,但无论哪种方式,这是你需要在有人尝试之前解决的问题。。)
  • 抱歉,我认为这不是问初学者的好问题。在他们进入数据结构和算法之前,我不确定他们能做多少严肃的事情,这可能需要很多时间。当然,也许你可以让他们做一些像寻找素数这样的事情,但谁会这样做呢?我的建议 - 保持真实。

标签: performance perfect-numbers


【解决方案1】:

同意“多次”进行短期操作,但对于较长时间的操作,一次可能就足够了。

我建议查看Project Euler,这是一个很好的编程问题集合。最好的部分是设计问题时考虑了“一分钟规则”,即大多数问题应该花费一台中等计算机不到一分钟的时间来执行高效算法来找到答案。所以一个很好的起点。 :)

【讨论】:

    【解决方案2】:

    两件事。

    首先,效率不仅仅是执行时间。它还与内存使用、内存访问、文件系统/资源访问等有关。有很多事情会影响效率。因此,请明确说明您正在寻找运行时间最短的例程。否则,您将发送混合消息...

    第二,大约15年前就听说过这个问题,至今难忘:

    生成一个总和为121212 的所有 5 位数字对的列表。但是,这两个数字都不能重复十进制数字。所以1 只能在任一数字中出现一次。所以一个示例结果对是98167 + 23045。数量相当多,构建蛮力解决方案很容易,但有效的解决方案需要一些思考。有 192 对独特的对...

    【讨论】:

    • 关于效率不仅仅是时间的好处。我知道这一点,但当我提出问题时,我会小心地明确说明这一点。
    【解决方案3】:

    因为这是一门入门课程,而且您的学生还没有学习排序,所以我认为很难想出一些足够简单、足够有趣以有几种不同的方法来做这件事,而且很复杂足以在现代计算机上的不同实现之间存在明显的速度差异。但是,您真正的问题是,任何对他们来说足够简单的尝试都已经有了规范的实现,只需很短的 Google 搜索即可。

    我的建议是扭转挑战。让您的学生竞相提出他们能想到的最粗糙、最慢、最占用内存的解决方案。我相信思考所有错误的做事方式和思考正确的方式一样具有教育价值,而且做最坏的事情和做最好的事情一样难。主观上也更容易看到结果,因为糟糕的代码会真的很慢。也没有谷歌搜索答案。最后,在我(无关的)看来,这还有一个额外的好处,就是让挑战变得更有趣。

    在另一个字符串中找到一个字符串这样的事情变得不好比好容易。也许让他们从 2kb 的随机字母数字字符串中提取所有素数。有很多方法可以解决这个问题。

    【讨论】:

    • 有趣的问题。选择作为接受的答案。
    【解决方案4】:

    这些都是好主意。有一个排序问题怎么办?

    【讨论】:

    • 排序是个好主意,但他们还没有涵盖排序,所以我不想打开太大的问题。
    【解决方案5】:

    对一组数字进行排序也可能是一个好主意,因为它有一大堆算法(插入、选择、快速、堆等),它们都有不同的性能特征。这也让学生有机会学习大 O 符号等。

    【讨论】:

    • 对于排序,你会禁止使用 Collections.sort() 太简单了吗?
    • @Scott W- 是的,你可能不得不这样做。那只是作弊。 :-)
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多