事情的起因是POJ上一道数据量比较大的题目。一开始我TLE,而算法是O(n)的,具体的题目记不太起来了。
后来我通过一个小技巧来改进了程序的常数因子,就是与内存分配与释放有关,事实证明,计算机寻找可用的内存是需要一定的时间的,而当数据量变得很大,并且你不得不每次重新申请内存的时候,这花费的时间久相当可怕。这时候你完全可以利用一个垃圾回收机制,来节约内存分配的时间。
这个回收机制可以用很多数据结构来实现,我当时采用的是一个栈,类似于:
Stack Rub;
每次我需要申请新内存的时候,首先检查栈是否为空(即里面是否有现成的内存可供分配),内存生命周期结束后,不free,而是入栈。
结果是,从TLE优化到100ms.
有兴趣的朋友可以自行实验,写一个简单的for循环就可以知道大概每次内存分配的期望值(因为这与具体的内存状态有关)。