我对一个小程序的两次重构过程

源于CSDN上一位网友提出的一个问题:

 

算法实验题1.2 等式数量
★问题描述
集合是基本的数学概念,集合中的元素是互不相同的。
表示相等关系的式子叫做等式。
给你一个包含有N个整数的集合,如果从集合中找到三个不同的整数a,b,c, 使得
a+b=c,那么我们说这个集合包含一个等式。
★编程任务
计算集合中所包含的等式数量。
★数据输入
第一行为一个整数N (3 <=N <=5,000),表示集合中有N个不同的整数。第二行有N个整
数,表示集合中的元素,元素的整数值大小为-10000000~10000000。
★数据输出
输出一行一个整数,表示该集合的等式数量。
输入文件示例输出文件示例
input.txt output.txt
4        2
3125
http://topic.csdn.net/u/20090828/10/f41bc15e-339c-4b55-b1a6-2f4b3383a107.html?seed=547430668&r=59420060#r_59420060

 

他的算法是用三重循环来做。算法复杂度为n*n*n。

 

我能想到的就是改进为n*n*log(n)了,将其中的一层改进为二叉树结构。

 

初始程序:

我首先想到的是利用STL的map,它是基于树的。

随后我用5000个数据做了压力测试,速度实在是慢42.001秒,内存占用729MB,受不了。。。

 

第一次重构:

鉴于LZ不要打印过程,我把map改成了set,则不需要添加map的vector了。

重构之后,内存占用降到322M,时间为30.01秒。算法复杂度不变。
当时我还说:不过对于LZ的要求应该是达到了,一般的数据量也能接受。


第二次重构:

晚上回去想想,这占内存也太大了,我想到用vector <bool>,这是vector的一个特化版本,主要是空间上的节约(大概省了30左右吧),另外不用动态new,时间也省了不少,而且查找是常数时间,而不是对数时间。

 

我还是用昨晚的5000个数据做压力测试,内存占用降到4M,时间为1.306秒(Release,P4 3.0G,1G内存)。我已经很满意了。算法复杂度不变。

 

我从这次重构中学到两点:

1. 算法复杂度不变,不代表没有优化的空间了,正如上面如得,第三个程序比第一个空间上优化150多倍,时间上优化40多倍。

2.STL的容器空间分配子只能针对大部分情况是好的,对于某些情况还是得用自己的分配子,例如,如果我一定用map,那么我可以自己做一个分配子,使得内存集中存放,这样就不用那么多的new操作。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值