STL原始碼分析之power演算法

2021-08-03 07:25:19 字數 1112 閱讀 2602

關於演算法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內...