• <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)寒,忽然年以殘,念往昔,語(yǔ)默心酸。二十光陰無(wú)一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢(mèng)令

            最長(zhǎng)不降子序列的nlogn算法 (轉(zhuǎn))

            所謂“最長(zhǎng)不降子序列問(wèn)題”,就是在一個(gè)給定的序列中尋找一個(gè)子序列{ai}滿足:

                                   a1<=a2<=...<an

            這個(gè)問(wèn)題在一般教材上,往往會(huì)作為動(dòng)態(tài)規(guī)劃的引例。

            即使用如下的狀態(tài)轉(zhuǎn)移方程進(jìn)行計(jì)算:

                               F[i]=max{F[j]}+1     aj<=ai

            但是它的復(fù)雜度是O(n^2)的,對(duì)于稍大的規(guī)模便無(wú)法承受。

            那么有沒有改進(jìn)的方法呢?答案是肯定的。

            ----------------------------------------------------------------分割線------------------------------------------------------------------------------------------

            我們維護(hù)一個(gè)數(shù)組C[i],這里C[i]表示F值為i的最小數(shù)。

            不難發(fā)現(xiàn)   C[1]<=C[2]<=...<=C[n]

            因此我們可以利用C[]通過(guò)二分查找確定F[j]的值。

            ----------------------------------------------------------------分割線------------------------------------------------------------------------------------------

            實(shí)現(xiàn)如下:

            const int N = 1001;

            int a[N], C[N], f[N]; // f[i]用于記錄a[0...i]的最大長(zhǎng)度

            int bsearch(const int *C, int size, const int &a)

            {

                int l=0, r=size-1;

                while( l <= r )

                {

                    int mid = (l+r)/2;

                    if( a > C[mid-1] && a <= C[mid] ) return mid; // >&&<= 換為: >= && <

                    else if( a < C[mid] ) r = mid-1;

                    else l = mid+1;

                }

            }

            int LIS(const int *a, const int &n){

                 int i, j, size = 1;

                 C[0] = a[0]; f[0] = 1;

                 for( i=1; i < n; ++i ){

                      if( a[i] <= C[0] ) j = 0;                 // <= 換為: <

                     else if( a[i] >C[size-1] ) j = size++;   // > 換為: >=

                     else j = bsearch(C, size, a[i]);

                     C[j] = a[i]; f[i] = j+1;

                 }

                 return size;

            }

            ------------------------------------------------------------------分割線------------------------------------------------------------------------------------------

            至此,我們了解了O(nlogn)的算法,它主要是利用了二分查找的方法對(duì)樸素的動(dòng)態(tài)規(guī)劃進(jìn)行加速、優(yōu)化,從而達(dá)到理想的效率。



            轉(zhuǎn)自:http://fqq11679.blog.hexun.com/21632261_d.html

            posted on 2009-08-12 18:27 abilitytao 閱讀(412) 評(píng)論(0)  編輯 收藏 引用


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


            国产精品久久久久久久久久影院| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 婷婷久久综合| 久久99热这里只有精品66| 无码精品久久久久久人妻中字| 久久综合丁香激情久久| 伊人热热久久原色播放www| 精品无码久久久久久尤物| 欧美久久综合性欧美| 狠狠色婷婷久久一区二区 | 人妻少妇久久中文字幕一区二区| 久久久精品人妻一区二区三区蜜桃 | 亚洲精品高清国产一久久| 久久中文精品无码中文字幕| 午夜不卡久久精品无码免费| 久久国产精品偷99| 久久精品黄AA片一区二区三区| 中文精品99久久国产| 91精品观看91久久久久久| 精品人妻久久久久久888| 久久笫一福利免费导航| 精品久久人人妻人人做精品| 久久精品中文字幕久久| 久久久久AV综合网成人| 亚洲国产精品无码久久久秋霞2| 久久亚洲欧洲国产综合| 久久久久国色AV免费观看| 91久久精品国产成人久久| 高清免费久久午夜精品| 亚洲愉拍99热成人精品热久久| 色综合久久久久综合99| 久久综合狠狠综合久久97色| 久久精品无码一区二区日韩AV| 精品久久久久久久| 青青草国产成人久久91网| 99久久久精品| 狠色狠色狠狠色综合久久 | 999久久久无码国产精品| 久久男人Av资源网站无码软件| 久久久久久人妻无码| 99久久免费国产特黄|