博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
惊叹计算机运行速度的提升---以n Queens 问题为例
阅读量:6181 次
发布时间:2019-06-21

本文共 2701 字,大约阅读时间需要 9 分钟。

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 
#include
#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的执行时间明显少的多,说明当前计算机硬件的发展促进了计算机速度的明显提升。这是一个令人兴奋的结果。

你可能感兴趣的文章
卷积神经网络——本质上是在利用卷积做特征压缩,然后再全连接
查看>>
洛谷P1516 青蛙的约会
查看>>
再读《Parallel Programming with Python》并作笔记
查看>>
orchard-1.9.2-1.10.2汉化
查看>>
.NET快速信息化系统开发框架 V3.2 -> WinForm“组织机构管理”界面组织机构权限管理采用新的界面,操作权限按模块进行展示...
查看>>
【转】CStdioFile UNICODE编译 英文系统下读取中文汉字乱码解决
查看>>
数据建模工具系列 之 让SQL Power Architect支持Vertica
查看>>
Android指纹识别深入浅出分析到实战
查看>>
django-rest-framework之请求与响应
查看>>
RxJava使用介绍
查看>>
toggle的用法(点击更换不同的function)当指定元素被点击时,在两个或多个函数之间轮流切换。...
查看>>
【转】在同一个类中,一个方法调用另外一个有注解(比如@Async,@Transational)的方法,注解失效的原因和解决方法...
查看>>
34.node.js之Url & QueryString模块
查看>>
Self20171218_Assert断言使用
查看>>
fastjson 的简单说明及使用
查看>>
DFS序
查看>>
STM32 CRC32与对应的软件CRC32(转)
查看>>
RGCDQ(线段树+数论)
查看>>
理解Kubernetes(2): 应用的各种访问方式
查看>>
Ionic的NavController 和ModalController 的区别
查看>>