1 介绍

实现了书《Data Structures and Program design in C++》(Robert L. Kruse and Alexander J. Ryba, 2000)中的188页的基于回溯策略的递归算法solve_from,该算法能够计算n Queens问题的解。选择不同的n作为棋盘大小,能够得出不同棋盘大小的Queens问题的解即执行时间。

该书出版时间为2000年,那么使用的计算机大概为1999年左右的。该书给出了执行的结果数据。我在我的电脑上採用相同的代码和算法,选择相同的n也执行得到了对应的数据。

通过二者数据的对照,能够看出计算机执行时间的提示 (我的电脑时2011年12份买的)。

2 主程序及我的电脑环境

2.1 主程序

因为书中的主程序没有给出统计所以解和执行时间的代码,于是我对应更改了主程序源码例如以下:

#include <iostream>
#include <time.h>
#include "queens.h" int sol_num =0;
void solve_from(Queens &configuration); int main(){
int board_size;
clock_t start_time, end_time;
cout<<"what is the size of the board? " << flush;
cin >> board_size;
if(board_size < 0 || board_size > max_board)
cout <<"The number must be between 0 and " << max_board<<endl;
else {
Queens configuration(board_size);
start_time = clock();
solve_from(configuration);
end_time = clock();
}
cout << "The statistics for " << board_size << " Queens problem:"<<endl;
cout << "The number of solutions: " << sol_num << endl;
cout << "The time used:" << static_cast<double>(end_time-start_time)/CLOCKS_PER_SEC << "s"<<endl;
} /*
* To recursively sole the n-Queens problem, to change the first line
* can give the statistics of the n-Queens problem. That is, then number
* of solutions for a specific n-Queens problems.
*/
void solve_from(Queens &configuration){
//if(configuration.is_solved()) configuration.print();
if(configuration.is_solved()) sol_num++;
else{
for(int col=0; col < configuration.board_size; col++)
if(configuration.unguarded(col)){
configuration.insert(col);
solve_from(configuration);// Recursively continue to add queens
configuration.remove(col);
}
}
}

2.2 我的电脑环境

电脑购买与2011年12份,内存2 GB,CUP 为AMD Phenom (tm) II N930 Quad-Core Processor 2 GB,操作系统为Windows 7 Professional。在其上安装Cygwin软件,当中的gcc 4.9.3版本号。

3 执行结果对照

书中的详细计算机的配置和型号不知。我们将其代表为1999年的计算机。而我的计算机则为2011年,尽管我在2015年执行的该程序。

二者产生的数据基于相同的源码。

表1 1999年计算机执行结果

Size Num_sol Time(seconds)
8 92 0.05
9 352 0.21
10 724 1.17
11 2680 6.62
12 14200 39.11
13 73712 243.05

表2 2011年计算机执行结果

Size Num_sol Time(seconds)
8 92 0.016
9 352 0.015
10 724 0.062
11 2680 0.218
12 14200 1.17
13 73712 7.145

上面的数据最好画成图的形式,观看更为方便:



【备注】:画上图採用的R代码例如以下:

 >library(ggplot2)
>yearn <- c('y1999','y1999','y1999','y1999','y1999','y1999','y2011','y2011','y2011','y2011','y2011','y2011')
> size <-c(8,9,10,11,12,13,8,9,10,11,12,13)
> time <-c(0.05,0.21,1.17,6.62,39.11,243.05,0.016,0.015,0.062,0.218,1.17,7.145)
> queenData <- data.frame(year,size,time)
> ggplot(queenData,aes(x=size,y=time,shape=yearn))+geom_line(position=position_dodge(0.2))+geom_point(position=position_dodge(0.2),size=4)

从上图能够看出,当size为8,9,10时二者的执行时间区别不大,但当size为更大的数值时,2011y的执行时间明显少的多,说明当前计算机硬件的发展促进了计算机速度的明显提升。这是一个令人兴奋的结果。

惊叹计算机运行速度的提升---以n Queens 问题为例的更多相关文章

  1. 计算机环境变量的配置,以java为例以及eclipse简要设置

    安装JDK时可以不安装公共jre.因为好多软件和浏览器已经默认自带的jre了,或者自动调用系统的了. 在java 中需要设置三个环境变量(1.5之后不需要再设置CLASSPATH了,但需要的话可以设置 ...

  2. PC-如何提高计算机的启动和关机的速度?

    如何提高计算机的启动和关机的速度? 一.bios的优化设置 在bios设置的首页我们进入"advanced bios features"选项,将光标移到"frist bo ...

  3. Andorid-15k+的面试题。

    andorid开发也做了3年有余了,也面试很多加企业,借此机会分享一下,我们中遇到过的问题以及解决方案吧,希望能够对正在找工作的andoird程序员有一定的帮助. 特别献上整理过的50道面试题目 1. ...

  4. Linux实战教学笔记01:计算机硬件组成与基本原理

    标签(空格分隔): Linux实战教学笔记 第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听,还要动手记,勤思考,多交流甚至尝试着去教会别人. 第2章 服务器 2.1 运维的基本 ...

  5. opengl入门学习

    OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...

  6. Hibernate的缓存技术详解

    转载注明出处:http://www.cnblogs.com/xiaoming0601/p/5882980.html 一.什么是缓存: 并不是指计算机的内存或者CPU的一二级缓存:缓存是指为了降低应用程 ...

  7. 简单几步优化技巧令你的Windows7系统加速

    就算有再高的硬件配置,系统用久了还是会变慢,xp如此,win7同样是如此.其实系统用的如何完全在于个人使用习惯,只要掌握了以下三种方法,就可以让你的win7运行速度大大提升. 1.修改启动项程序 在你 ...

  8. OpenGL入门学习(转)

    OpenGL入门学习 http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#includ ...

  9. OpenGL理解

    说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色 ...

随机推荐

  1. vb常用的内部函数(二):字符串函数

    len(string):计算字符串长度函数.返回字符串string中字符的个数.一个汉字为一个字符,空格也为一个字符,空字符串的长度为0. Ltrim(string).Rtrim(string).Tr ...

  2. tinymce原装插件源码分析(五)-searchreplace

    searchreplace 功能:查找和替换 代码注释见: https://www.xunhanliu.top/static/js/tinymce/plugins/searchreplace/plug ...

  3. 配置oh-my-zsh

    1. 当使用zsh进入庞大的git工程目录下时,会发生cd命令很慢的情况 可以把~/.oh-my-zsh/lib/git.zsh里面的git_prompt_info函数替换为 function git ...

  4. code vs 1216 跳马问题

    1216 跳马问题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description 题目 输入描述 Input Descri ...

  5. cocos2dx2.0 与cocos2dx3.1 创建线程不同方式总结

    尽管内容是抄过来的.可是经过了我的验证.并且放在一起就清楚非常多了,cocos2dx版本号常常变化非常大.总会导致这样那样的问题. cocos2dx2.0 中 1. 头文件 #include < ...

  6. Cannot set web app root system property when WAR file is not expanded

    Cannot set web app root system property when WAR file is not expanded 在tomcat下面可以,在weblogic下面不行的处理方法 ...

  7. Cube Simulation zoj3429 模拟

    Description Here's a cube whose size of its 3 dimensions are all infinite. Meanwhile, there're 6 pro ...

  8. Android组件系列----ContentProvider内容提供者【1】

    [正文] 一.ContentProvider简单介绍: ContentProvider内容提供者(四大组件之中的一个)主要用于在不同的应用程序之间实现数据共享的功能. ContentProvider能 ...

  9. less11 属性合并

    less //+ 合并以后,以逗号分割属性值 .mixin() { box-shadow+: inset 0 0 10px #555 ; } .myclass { .mixin(); box-shad ...

  10. bzoj1026: [SCOI2009]windy数(传说你是数位DP)

    1026: [SCOI2009]windy数 题目:传送门 题解: 其实之前年少无知的时候好像A过...表示当时并不知道什么数位DP 今天回来深造一发... 其实如果对这个算法稍有了解...看到这题的 ...