這一寒假,因為假期的延長,學習了一下新的演算法和資料結構。可能有些完全掌握了,但是有些確實有些不熟練。
在假期的最後一段時間,我會將在寒假及之前學習的一些知識逐漸整理為筆記,供自己複習鞏固,也供他人學習了解。筆記的順序按照我學習該知識點的時間排序。
筆記大部分會寫的很詳細,面向初學者還是很好懂的。雖然我的語文不好,但我會盡量用我的最好水平來寫。
可能乙個學 oi 還不到半年的蒟蒻的筆記確實沒有什麼看的價值,但我還是希望和大家一起慢慢變強。oi 的路還很長,一步一步走下去吧。
希望在某一天開學後,沒有人後悔自己一整個寒假碌碌無為。
什麼是快速冪
快速冪的原理
快速冪的**實現
快速冪的位運算優化
快速冪是一種快速求冪的演算法,面對大量資料時就會展現出它的優勢。
樸素的求冪演算法是用乙個迴圈逐漸累乘,時間複雜度為 \(\theta(n)\),\(n\) 為指數。**如下:
#define mod 10000007
long long power(long long base,long long n)
但是在處理正整數次冪時,可以使用一種時間複雜度為 \(\theta(\log_2n)\) 的演算法,就是我們要用的快速冪。
快速冪的思想是將指數拆分為若干個 \(2\) 次冪之和,然後分別進行計算。
為什麼這樣更快呢?我們想一下,如果在迴圈中乘上本身而不是乘上底數,即可得到若干的 \(2\) 次冪,求 \(2^i\) 次冪的時間複雜度就是 \(\theta(i)\),而樸素的演算法為 \(\theta(2^i)\)。
那麼怎麼將十進位制轉換為二進位制?不會的人請看下面。
我們舉乙個例子,我們要求 \(a\) 的 \(11\) 次冪。
我們將 \(11\) 轉換為二進位制數:
\[(11)_=(1011)_2
\]我們發現二進位制中,數字為 \(1\) 的數字為第 \(0\) 位、第 \(1\) 位和第 \(3\) 位,分別對應 \(2^0,2^1,2^3\),而 \(11\) 正好等於 \(2^0+2^1+2^3\)。
其實上述做法就是十進位制轉二進位制最常用的方法:按權展開。
因此,並根據同底數冪乘法原理:
\[a^=a^=a^\times a^\times a^
\]就可以實現用若干 \(2\) 次冪來表示指數再進行計算了。
如何用**實現呢?一般有迴圈和遞迴兩種。
while 迴圈實現
一般常用此方法,因為迴圈效率比遞迴高,個人也較喜歡此方法。下面的詳細解釋也以此方法為例。
在 while 迴圈中,指數不為 \(0\) 為迴圈條件,每次迴圈中將底數擴方,相應的指數除以 \(2\)。在遇到奇數時,代表乙個二次冪分解完,將答案乘上當前的底數。
**:
#define mod 10000007
long long qpower(long long base,long long n) //base 為底數,n 為指數。
return res;
}
結合 dev-c++ 的除錯功能我們可以更清楚的了解實現的過程,我們以計算 \(2^5\) 為例:
進入迴圈,初始賦值:
此時 \(n\) 為奇數,更新 res。同時更改 base(底數)、n(指數):
然後的 \(n\) 為偶數,res 不作操作,其他同上。
這是就是最後一次了,\(n\) 為 \(1\),最後一次更新。
然後 \(n\) 變成了 \(0\),跳出迴圈,此時 res 為 \(32\)。
遞迴實現:
遞迴實現的思路其實和迴圈是一樣的,我在這裡就簡單的貼乙個**:
#define mod 10000007
long long qpower(long long base,long long n)
前置知識:位運算基礎。
我們知道,計算機有乙個很神奇的運算,叫做位運算,它比普通運算快許多,那在快速冪中能不能用位運算優化呢?
肯定是能的。
首先>>
表示右移,a>>i
表示將 \(a\) 在二進位制下右移 \(i\) 位,低位丟棄。那麼不難想到,n/2
就可以用n>>1
來代替。
那麼在判定奇偶性時怎麼用位運算優化呢?首先,我們知道,如果乙個數是奇數,那麼它在二進位制下,末位一定是 \(1\)。根據這個特點,我們可以用按位與&
這種運算來代替。
我們知道,\(1\) 的二進位制數是 \(0000\ldots 0001\),那麼將它和乙個奇數按位與,結果肯定是 \(0000\ldots 0001\),轉為十進位制就是 \(1\),偶數則為 \(0\)。因此,**中的n%2==1
可以改為n&1
。
優化過的**:
#define mod 10000007
long long qpower(long long base,long long n)
return res;
}
這是第一篇筆記,可能有很多不足,我會逐漸改進。希望能越來越好吧。 學習筆記 快速冪
求 m n k 快速冪 m n k int quickpow int m,int n,int k return b 快速冪,通過將n轉換成二進位制的方法優化運算。例如n 37 的時候 37 2 5 2 2 2 0 那麼m 37 k m 2 5 2 2 2 0 k m 2 5 m 2 2 m 2 0 ...
快速冪學習筆記
使用一般方法來計算x nx n xn需要計算n nn次,而快速冪就是一種只需要計算log 2 n log 2 n log2 n 次就可以計算出x nx n xn的演算法。1.n an b na b n an b n nanb n a b 容易得很,是八年級數學內容吧 2.二進位制 假設n 10 10...
學習筆記 快速冪
定義 快速冪顧名思義,就是快速算某個數的多少次冪。其時間複雜度為 o log n 與樸素的o n 相比效率有了極大的提高。舉例 以下以求a的b次方來介紹 把b轉換成二進位制數。該二進位制數第i位的權為2 i 1 例如a 11 a 2 0 2 1 2 3 11的二進位制是1011 11 2 1 2 0...