重读<算法导论>
重读<算法导论>
记得多年前学数据结构的时候作为教材的延伸读物我拜读了<算法导论>,当时有选择的读了大约2/3的东西,只学理论和算法实在枯燥,看书之余动手写了其中的一些算法,但是由于实在不知道这些知识有什么用处,剩余的1/3大部分是一些具体的理论推导和稍微复杂的算法。
那么,为什么近期又重读这本算法著作呢?
首先就是我遇到问题了,在前一阵的工作中频繁出现红黑树的分析问题,我不得不根据红黑树的排列去查找STL Map 中的内容,每次出现问题都要去内存中找出有用的状态。
其次就是在研究V8的时候我觉得有必要系统的研究一下编译器实现,于是研究了一段时间的<龙书>,那段时间一直是遇到问题后直接google一下,始终觉得不爽。
基于以上的原因,在这周一的时候,我开始重读了这本算法名著。
也许是因为五年的工作积累吧,我重读<算法导论>有一种说不出的亲切感,其实自己的实际工作中好多的想法和算法导论上面讲的理论如出一辙,并且再看其中的一些算法的时候也不会觉得枯燥,因为现在已经不只是理论,每一个抽象的理论都似乎有一个生动的例子。
比如最大堆算法,最小堆算法,上学的时候看他们的感觉是,这东西有什么用?先学习一下吧。
现在重温的时候的感觉是,TOP K 算法的时候不就可以以最小堆实现么..
算法代码如下:
void TopKAlgorithm(int inputArray[], int nInputLength, int nOutputLength )
{
//construct the minimum heap the size is K
vector<int> vec(inputArray,inputArray+nOutputLength);
make_heap (vec.begin(),vec.end(), greater<int>());
for(int i=nOutputLength; i<10; i++)
{
if(inputArray[i] >= vec[0])
{
vec[0] = inputArray[i];
make_heap (vec.begin(),vec.end(), greater<int>());
}
}
for(int i=0; i<nOutputLength; i++)
{
inputArray[i]=vec[i];
}
}
{
//construct the minimum heap the size is K
vector<int> vec(inputArray,inputArray+nOutputLength);
make_heap (vec.begin(),vec.end(), greater<int>());
for(int i=nOutputLength; i<10; i++)
{
if(inputArray[i] >= vec[0])
{
vec[0] = inputArray[i];
make_heap (vec.begin(),vec.end(), greater<int>());
}
}
for(int i=0; i<nOutputLength; i++)
{
inputArray[i]=vec[i];
}
}
总结和建议
我写这篇文章的目的有两个,第一,记得有个哲学家说过,人不能两次踏入同一条河流,所以人在有了一定的经历之后对一些东西的看法可能不同或者更深刻,所以建议经典的好书拿出来翻翻说不定会有新的收获,第二,我想说的是理论和实践结合了可能会产生出更大的能量,而且这个时候理论也不会显的那么枯燥,共勉..