数独计时不规则

4
我使用暴力递归编写了数独谜题求解器。现在,我想看看解决10个类似类型的谜题需要多长时间。因此,我创建了一个名为“easy”的文件夹,并将10个“easy”谜题放入该文件夹中。当我第一次运行求解器时,可能需要171毫秒,第二次需要37毫秒,第三次运行需要16毫秒。为什么同样的问题解决时间不同?应该是一致的吧?
第二个问题是,它只显示最后一个解决的谜题,尽管我告诉它在加载谜题后重绘屏幕,再在解决后重绘屏幕。如果我只加载一个未解决的谜题,它会显示初始谜题状态。如果我然后调用解决方法,则会在屏幕上绘制最终解决方案。这是我的解决多个谜题的方法。
void LoadFolderAndSolve() throws FileNotFoundException {

    String folderName = JOptionPane.showInputDialog("Enter folder name");
    long startTime = System.currentTimeMillis();

    for (int i = 1; i < 11; i++) {
        String fileName = folderName + "/puzzle" + i + ".txt";
        ReadPuzzle(filename);  // this has a call to repaint to show the initial puzzle
        SolvePuzzle();         // this has a call to repaint to show the solution
        // If I put something to delay here, puzzle 1-9 is still not shown only 10.
    }

    long finishTime = System.currentTimeMillis();
    long difference = finishTime - startTime;

    System.out.println("Time in ms - " + difference);
}
1个回答

3
第一次运行时,JVM需要加载类、创建所使用的对象等操作,这需要更多时间。另外,JVM总是需要时间来"开始运转",因此在进行分析时,通常需要运行几千个循环并将结果除以数以获得更好的估计值。
对于第二个问题,如果没有看到代码,我们无法给予帮助,但是一个很好的猜测是您没有"刷新"数据。

“Flushing”数据是什么意思? - user1429254
你所说的“repaint”是什么意思?(我先问的:P) - Nir Alfasi
我在进一步搜索后找到了绘图的答案。 在Java中,当您获得repaint方法调用时,它会尽快重绘。 如果重新绘制频繁发生,则只需等待最后一次调用即可。 为了解决这个问题,如果我将repaint()更改为paintImmediately(0,0,maxX,maxY); 就可以完成屏幕上的所有绘画工作。 感谢您的帮助。 - user1429254
@user1429254,现在你知道什么是“flushing”了 ;) - Nir Alfasi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接