项目地址
[github]链接: https://github.com/kindoms214/Sudoku.
项目专栏地址: https://blog.csdn.net/kindoms214/category_9638585.html.
1、个人项目报告之可行性分析、需求分析、概要设计: https://blog.csdn.net/kindoms214/article/details/103909657.
2、个人项目报告之生成数独终局: https://blog.csdn.net/kindoms214/article/details/103964265.
3、个人项目报告之生成终局代码优化: https://blog.csdn.net/kindoms214/article/details/104001320.
4、个人项目报告之求解数独: https://blog.csdn.net/kindoms214/article/details/103997960.
5、个人项目报告之求解代码优化: https://blog.csdn.net/kindoms214/article/details/104036705.
6、个人项目报告之生成数独题目: https://blog.csdn.net/kindoms214/article/details/104017290.
7、个人项目报告之单元测试及分支覆盖率: https://blog.csdn.net/kindoms214/article/details/104041445.
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()进行性能上的优化了。
本文介绍了作者在个人项目中对数独求解代码的优化过程,包括1.0版本的性能分析缺失,以及在2.0版本中通过改进题目读入和结果输出方式提升性能。经过优化,1e6个数独题目的求解时间稳定在51秒,证明优化效果显著。尽管无法对比优化前后的速度差异,但目前的DFS算法已能满足项目需求,未来可能考虑尝试更快的DLX算法。
351

被折叠的 条评论
为什么被折叠?



