惊叹计算机运行速度的提升---以n Queens 问题为例
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 问题为例的更多相关文章
- 计算机环境变量的配置,以java为例以及eclipse简要设置
安装JDK时可以不安装公共jre.因为好多软件和浏览器已经默认自带的jre了,或者自动调用系统的了. 在java 中需要设置三个环境变量(1.5之后不需要再设置CLASSPATH了,但需要的话可以设置 ...
- PC-如何提高计算机的启动和关机的速度?
如何提高计算机的启动和关机的速度? 一.bios的优化设置 在bios设置的首页我们进入"advanced bios features"选项,将光标移到"frist bo ...
- Andorid-15k+的面试题。
andorid开发也做了3年有余了,也面试很多加企业,借此机会分享一下,我们中遇到过的问题以及解决方案吧,希望能够对正在找工作的andoird程序员有一定的帮助. 特别献上整理过的50道面试题目 1. ...
- Linux实战教学笔记01:计算机硬件组成与基本原理
标签(空格分隔): Linux实战教学笔记 第1章 如何学习Linux 要想学好任何一门学问,不仅要眼睛看,耳朵听,还要动手记,勤思考,多交流甚至尝试着去教会别人. 第2章 服务器 2.1 运维的基本 ...
- opengl入门学习
OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...
- Hibernate的缓存技术详解
转载注明出处:http://www.cnblogs.com/xiaoming0601/p/5882980.html 一.什么是缓存: 并不是指计算机的内存或者CPU的一二级缓存:缓存是指为了降低应用程 ...
- 简单几步优化技巧令你的Windows7系统加速
就算有再高的硬件配置,系统用久了还是会变慢,xp如此,win7同样是如此.其实系统用的如何完全在于个人使用习惯,只要掌握了以下三种方法,就可以让你的win7运行速度大大提升. 1.修改启动项程序 在你 ...
- OpenGL入门学习(转)
OpenGL入门学习 http://www.cppblog.com/doing5552/archive/2009/01/08/71532.html 说起编程作图,大概还有很多人想起TC的#includ ...
- OpenGL理解
说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640*480分辨率.16色 ...
随机推荐
- vb常用的内部函数(二):字符串函数
len(string):计算字符串长度函数.返回字符串string中字符的个数.一个汉字为一个字符,空格也为一个字符,空字符串的长度为0. Ltrim(string).Rtrim(string).Tr ...
- tinymce原装插件源码分析(五)-searchreplace
searchreplace 功能:查找和替换 代码注释见: https://www.xunhanliu.top/static/js/tinymce/plugins/searchreplace/plug ...
- 配置oh-my-zsh
1. 当使用zsh进入庞大的git工程目录下时,会发生cd命令很慢的情况 可以把~/.oh-my-zsh/lib/git.zsh里面的git_prompt_info函数替换为 function git ...
- code vs 1216 跳马问题
1216 跳马问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 题目 输入描述 Input Descri ...
- cocos2dx2.0 与cocos2dx3.1 创建线程不同方式总结
尽管内容是抄过来的.可是经过了我的验证.并且放在一起就清楚非常多了,cocos2dx版本号常常变化非常大.总会导致这样那样的问题. cocos2dx2.0 中 1. 头文件 #include < ...
- 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下面不行的处理方法 ...
- Cube Simulation zoj3429 模拟
Description Here's a cube whose size of its 3 dimensions are all infinite. Meanwhile, there're 6 pro ...
- Android组件系列----ContentProvider内容提供者【1】
[正文] 一.ContentProvider简单介绍: ContentProvider内容提供者(四大组件之中的一个)主要用于在不同的应用程序之间实现数据共享的功能. ContentProvider能 ...
- less11 属性合并
less //+ 合并以后,以逗号分割属性值 .mixin() { box-shadow+: inset 0 0 10px #555 ; } .myclass { .mixin(); box-shad ...
- bzoj1026: [SCOI2009]windy数(传说你是数位DP)
1026: [SCOI2009]windy数 题目:传送门 题解: 其实之前年少无知的时候好像A过...表示当时并不知道什么数位DP 今天回来深造一发... 其实如果对这个算法稍有了解...看到这题的 ...