關於演算法power
一般我們遇到要實現power演算法,最直接就是如下實現:
[cpp]view plain
copy
print?
int power(int x, unsigned int n)
然而,這樣計算的複雜度為o(n)
想要改進,因為 x^n = x^(n/2) * x^(n/2),所以我們想,只要計算出了x^(n/2)那麼x^n也就直接得出了,於是改為如下實現:
[cpp]view plain
copy
print?
int power(int x, unsigned int n)
} 既然走到了這裡,且我們看到了遞迴,那繼續優化的方法就是不使用遞迴,因為遞迴不僅可能導致記憶體棧溢位,還會產生很多不必要的計算。
這裡,我們可能會想到斐波那契數列,教科書中講解遞迴總是拿這個例子,但我們知道遞迴並非最優。於是我們按照將斐波那契數列遞迴形式改為迴圈形式的思路,將我們當前的power函式修改為迴圈:
比如我們要求x^19 ,這裡我們不再是採用 x^9* x^10,而是使用 x^16 * x^2 * x^1,根據19的二進位制數進行計算,19的二進位制為10011.
[cpp]view plain
copy
print?
int power(int x, unsigned int n)
} 於是我們理解stl中的power也就容易了:
//計算x^n
[cpp]view plain
copy
print?
int power(int x, unsigned int n)
else
} int result = x;
n>>= 1;
while(n != 0) //大體一樣
return result;
}
//這裡我們比較一下,多了乙個步驟,去掉了後幾位的0,大概是能夠增加效率的吧!
STL原始碼分析之Vector
地球人都知道vector的查詢效率很高,插入和刪除的效率低下,容器會隨著元素的不斷增加自動增長,最近在看了stl原始碼之後,發現確實是這樣,下面是vector一些關鍵的函式.從這些函式可以看出插入和刪除的過程,以及容器自動增長的方式.兩個通過下標獲取元素的函式.reference operator ...
STL之pair原始碼分析
直接進入主題,請看pair的原始碼 namespace std 預設建構函式,用型別的預設建構函式初始化兩個資料成員 pair const t1 a,const t2 b first a second b 建構函式,用a初始化first,用b初始化second template 模板函式,拷貝建構函...
STL原始碼分析之vector
vector是序列容器的一種,分配的是一段連續的空間,所以它支援下標訪問,同時它另一特點是可以自行擴充空間,每次是以原大小兩倍來擴充,是另外配置的一塊空間,將原內容拷貝過去,所以當對vector的空間進行重新配置時,指向原vector的迭代器就失效了。下面分析它具體是怎麼實現的和熟悉下vector內...