重讀<算法導論>
記得多年前學數據結構的時候作為教材的延伸讀物我拜讀了<算法導論>,當時有選擇的讀了大約2/3的東西,只學理論和算法實在枯燥,看書之余動手寫了其中的一些算法,但是由於實在不知道這些知識有什么用處,剩余的1/3大部分是一些具體的理論推導和稍微復雜的算法。
那么,為什么近期又重讀這本算法著作呢?
首先就是我遇到問題了,在前一陣的工作中頻繁出現紅黑樹的分析問題,我不得不根據紅黑樹的排列去查找STL Map 中的內容,每次出現問題都要去內存中找出有用的狀態。
其次就是在研究V8的時候我覺得有必要系統的研究一下編譯器實現,於是研究了一段時間的<龍書>,那段時間一直是遇到問題后直接google一下,始終覺得不爽。
基於以上的原因,在這周一的時候,我開始重讀了這本算法名著。
也許是因為五年的工作積累吧,我重讀<算法導論>有一種說不出的親切感,其實自己的實際工作中好多的想法和算法導論上面講的理論如出一轍,並且再看其中的一些算法的時候也不會覺得枯燥,因為現在已經不只是理論,每一個抽象的理論都似乎有一個生動的例子。
比如最大堆算法,最小堆算法,上學的時候看他們的感覺是,這東西有什么用?先學習一下吧。
現在重溫的時候的感覺是,TOP K 算法的時候不就可以以最小堆實現么..
算法代碼如下:
{
// 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];
}
}
總結和建議
我寫這篇文章的目的有兩個,第一,記得有個哲學家說過,人不能兩次踏入同一條河流,所以人在有了一定的經歷之后對一些東西的看法可能不同或者更深刻,所以建議經典的好書拿出來翻翻說不定會有新的收獲,第二,我想說的是理論和實踐結合了可能會產生出更大的能量,而且這個時候理論也不會顯的那么枯燥,共勉..