1. 程式人生 > >彙總一些困擾了很久的問題

彙總一些困擾了很久的問題

1.消除遞迴導致堆疊溢位

其實這個問題本來無法避免,因為你模擬呼叫過程,自己利用私有堆疊,也可硬轉成非遞迴,但是大資料下肯定私有堆疊也會溢位。不過現在有了編譯器優化就可以把“尾遞迴”轉化成迴圈,那麼……既然能直接轉化成迴圈,你幹嘛還要寫成遞迴,直接寫迴圈多好!編譯器也只不過是把入參重新賦值,再goto到開頭執行一遍,那麼我們自己也可以啊。關鍵在於把普通遞迴轉化成尾遞迴,一句話:增加引數,把本次遞迴產生的變數,傳遞給下次遞迴。

2.二叉樹排序效率

我們可以構造一個二叉樹,左子樹總是比右子樹小,於是插入過程中就自動排序好了,那麼如果資料插入順序特別奇葩,比如根節點上就是最大,或者最小的值,那麼這種排序就很坑爹了,怎麼辦呢?一句話:平衡二叉樹,插入之後旋轉調整一次。

3.vector的容量變化

插入之前:


插入之後:


後來找到MFC的原始碼跟蹤了一下:


看來很多時候,我們思想都是有“惰性”的,明明程式碼裡面寫的清楚,可是自己就懶得看,或許是“求知慾”已經不如學生時代了吧。