• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            The Fourth Dimension Space

            枯葉北風(fēng)寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            O(log n)求Fibonacci數(shù)列(非矩陣法)

            《編程之美》讀書筆記:2.9 Fibonacci序列

             

            計(jì)算Fibonacci序列最直接的方法就是利用遞推公式 F(n+2)=F(n+1)+F(n)。而用通項(xiàng)公式來求解是錯(cuò)誤的,用浮點(diǎn)數(shù)表示無理數(shù)本來就有誤差,經(jīng)過n次方后,當(dāng)n相當(dāng)大時(shí),誤差能足夠大到影響浮點(diǎn)數(shù)轉(zhuǎn)為整數(shù)時(shí)的精度,得到的結(jié)果根本不準(zhǔn)。

            用矩陣來計(jì)算,雖然時(shí)間復(fù)雜度降到O(log n),但要用到矩陣類,相當(dāng)麻煩。觀察:

            F(n+2)=F(n)+F(n-1)2*F(n-1)+F(n-2)=3*F(n-2)+2*F(n-4)

            用歸納法很容易證明 F(n) = F(k)*F(n+1-k) + F(k-1)*F(n-k),利用該遞推公式和原遞推公式,要計(jì)算F(n),只要計(jì)算F([n/2])F([n/2]+1),時(shí)間復(fù)雜度為 O(lg n)如:要計(jì)算F(58),由 58 -> 29,30 -> 14,15 -> 7,8 -> 3,4 -> 1,2 可知只要算5次。可以用一個(gè)棧保存要計(jì)算的數(shù),實(shí)際上,將n的最高位1(假設(shè)在第k位)左邊的0去除掉后,第m次要計(jì)算的數(shù)是第k位到第k-m+1位這m個(gè)位組成的值t(m),則第m-1次要計(jì)算的數(shù)為t(m-1),且

            t(m)=2*t(m-1)+(k-m+1位是否為1)

            若第m-1次計(jì)算得到了f(k)f(k+1),則第m次計(jì)算:

             

            k-m+1

            已計(jì)算

            待計(jì)算

            1

            f(k)

            f(k+1)

            f(2*k+1),f(2*k+2)

            0

            f(2*k),f(2*k+1)

             

            具體公式見下面代碼。

            下面是計(jì)算F(n)最后四位數(shù)(某道ACM題)的代碼。


             

            /*   Fibonacci數(shù)列第N個(gè)數(shù)的最后4位數(shù)
                注意,當(dāng) N>93 時(shí) 第N個(gè)數(shù)的值超過64位無符號整數(shù)可表示的范圍。
            F(n+2)=F(n)+F(n-1) F(0)=0 F(1)=1  F(2)=1        ==>
            F(n)=F(k)*F(n+1-k) + F(k-1)*F(n-k)              ==>
            F(2*n)=F(n+1)*F(n)+F(n)*F(n-1)=(F(n+1)+F(n-1))*F(n)=(F(n+1)*2-F(n))*F(n)
            F(2*n+1)=F(n+1)*F(n+1)+F(n)*F(n)
            F(2*n+2)=F(n+2)*F(n+1)+F(n+1)*F(n)=(F(n+2)+F(n))*F(n+1)=(F(n+1)+F(n)*2)*F(n+1)
             
            */

            unsigned fib_last4( unsigned num)
            {
              
            if ( num == 0 ) return 0;
              
            const unsigned M=10000;
              unsigned ret
            =1,next=1,ret_=ret;
              unsigned flag
            =1, tt=num;
              
            while ( tt >>= 1) flag <<= 1;
              
            while ( flag >>= 1 ){
                
            if ( num & flag ){
                  ret_ 
            = ret * ret + next * next;
                  next 
            = (ret + ret + next) * next;
                } 
            else {
                  
            //多加一個(gè)M,避免 2*next-ret是負(fù)數(shù),造成結(jié)果不對
                  ret_ = (next + next + M - ret) * ret;
                  next 
            = ret * ret + next * next;
                }
                ret 
            = ret_ % M;
                next 
            = next % M;
              }
              
            return ret;
            }
            轉(zhuǎn)自:http://www.shnenglu.com/flyinghearts/archive/2010/06/23/118593.html

            posted on 2010-06-26 12:48 abilitytao 閱讀(579) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            日韩中文久久| 久久久久久亚洲精品不卡| 亚洲精品乱码久久久久久自慰| 久久久久久伊人高潮影院| 大香伊人久久精品一区二区| 色综合久久久久无码专区| 亚洲国产精品久久久久| 国产精品乱码久久久久久软件 | 国产精品一区二区久久| 国产成人99久久亚洲综合精品| 青青草原综合久久大伊人导航| 99精品久久精品一区二区| 中文字幕亚洲综合久久| 狠狠色丁香久久婷婷综合| 精品欧美一区二区三区久久久| 国产亚洲精品久久久久秋霞 | 婷婷伊人久久大香线蕉AV | 久久精品人人做人人爽电影蜜月 | 精品久久久久久久久中文字幕| 久久影院午夜理论片无码| 青青热久久综合网伊人| 亚洲综合伊人久久大杳蕉| 国产伊人久久| 中文精品久久久久国产网址| 人人狠狠综合久久88成人| 久久乐国产综合亚洲精品| 93精91精品国产综合久久香蕉| 久久久婷婷五月亚洲97号色| 中文字幕乱码久久午夜| 色婷婷狠狠久久综合五月| 久久精品成人免费观看97| 日韩精品久久久久久| 精品免费tv久久久久久久| 久久91精品国产91久久户| 国产精品美女久久久久网| 大伊人青草狠狠久久| 国产人久久人人人人爽| AV无码久久久久不卡网站下载| 国产精品一区二区久久不卡| 久久久久亚洲AV无码专区体验| 久久亚洲精精品中文字幕|