欧几里得算法(即辗转相除法)的时间复杂度
生活随笔
收集整理的這篇文章主要介紹了
欧几里得算法(即辗转相除法)的时间复杂度
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
本文是參考新浪博客而寫。
歐幾里得算法, 又稱輾轉(zhuǎn)相除法, 用于求兩個自然數(shù)的最大公約數(shù). 算法的思想很簡單, 基于下面的數(shù)論等式
gcd(a, b) = gcd(b, a mod b)
其中g(shù)cd(a, b)表示a和b的最大公約數(shù), mod是模運算, 即求a除以b的余數(shù). 代碼如下:
歐幾里得算法是最古老而經(jīng)典的算法, 理解和掌握這一算法并不難, 但要分析它的時間復(fù)雜度卻并不容易. 我們先不考慮模運算本身的時間復(fù)雜度(算術(shù)運算的時間復(fù)雜度在Knuth的TAOCP中有詳細(xì)的討論), 我們只考慮這樣的問題: 歐幾里得算法在最壞情況下所需的模運算次數(shù)和輸入的a和b的大小有怎樣的關(guān)系?
我們不妨設(shè)a>b≥1, 構(gòu)造數(shù)列{un}:
顯然, 若算法需要n次模運算, 則有 un=gcd(a,b),un+1=0. 我們比較數(shù)列 {un}和菲波那契數(shù)列 {Fn},
un≥1=F0un?1≥1=F1 又因為由 ukmoduk+1=uk+2,可得 uk=uk+1×β+uk+2≥uk+1+uk+2,故可得 un?2≥un?1+un≥F0+F1=F2 ,以此類推,由數(shù)學(xué)歸納法容易得到 un?k≥Fk, 也就是 uk≥Fn?k 于是得到 a=u0≥Fn,b=u1≥Fn?1. 也就是說如果歐幾里得算法需要做n次模運算, 則b必定不小于 Fn?1. 根據(jù)斐波那契數(shù)列的性質(zhì), 有 Fn?1>(1.618)n5√ , 即 b>(1.618)n5√, 所以模運算的次數(shù)為 O(lgb).
總結(jié)
以上是生活随笔為你收集整理的欧几里得算法(即辗转相除法)的时间复杂度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《自然语言处理实战入门》---- 停用词
- 下一篇: 【软件开发底层知识修炼】十一 链接器-链