1.0版本性能分析
这一部分出现了一些小问题,主要是忘记进行性能检测了。因为在生成数独题目的时候,就索性进行了数独读入方面的优化,然后那部分的优化代码写完之后就直接把求解数独部分的读入一块更新了。所以只能直接把优化好的代码和性能分析结果贴出来了。
代码优化
前面也介绍过,这一部分的代码优化主要是读入数独和输出求解后的数独部分的代码优化。
首先是题目读入部分,方法从原来的一个个数的读入改成一行一行的数据读入,然后将读入的数据放入一个二位的int型数组进行后续的求解操作。然后是输出部分,因为求解好的数独存放在一个二维数组中,所以我的做法是效仿生成数独终局中的输出方法,将整个数独的结果放进一个一维数组中,这部分代码也和生成数独终局部分的一样。具体代码如下:
while (ProblemOfSudoku.getline(str, LINE_LENGTH)) //读数独终局
{
int ll = strlen(str); //读入的每一行的长度
for (int i = 0; i < ll; i++)
{
if (i % 2 == 0)
{
solve_sudoku[linecount][i / 2] = str[i] - '0';
}
}
linecount++;
if (linecount % 9 == 0) //读完一整个数独后进行相应的操作
{
linecount = 0;
/*
求解数独部分,项目中此处是调用了一个DFS()
*/
for (int i = 0; i < 9; i++) //调整输出格式
{
for (int j = 0; j < 9; j++)
{
re_sudoku[i * 18 + j * 2] = solve_sudoku[i][j]+'0';
if (j != 8)
{
re_sudoku[i * 18 + j * 2 + 1] = ' ';
}
else
re_sudoku[i * 18 + j * 2 + 1] = '\n';
}
}
re_sudoku[162] = '\0';
out << re_sudoku;
sign = false;
memset(solve_sudoku, 0, sizeof(solve_sudoku));
}
}
2.0版本性能分析
在进行性能分析的时候,因为有过分析生成数独终局代码的经验,所以这次在正式分析之前先是尝试了一下求解1000个数独题目需要消耗多长时间。最后发现生成1000个数独问题的解仅需要2s不到,于是直接尝试求解完生成的1e6个题目,最终的性能分析结果见下图:
从最后的性能分析结果来看,整个求解的速度还是比较快的,1e6个数独题目的求解基本上稳定在51s左右。
小结
因为整个性能分析过程由于本人的疏忽导致最开始代码优化之前的性能分析没有做,只做了优化之后的性能分析,所以没办法看出在性能上的代码优化带来的执行速度上的改变。但是从最终的优化结果来看,使用DFS求解数独的速度还是非常快的,且足以满足项目的需求,这也意味着更换其他求解算法的意义不会很大。但是就我目前能够了解到的最快的求解数独算法,应该是DLX()了,不过这种算法,也只有在今后有空的时候进行尝试了,此次项目中就不再利用DLX()进行性能上的优化了。
来源:CSDN
作者:kindoms214
链接:https://blog.csdn.net/kindoms214/article/details/104036705