• <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>

            糯米

            TI DaVinci, gstreamer, ffmpeg
            隨筆 - 167, 文章 - 0, 評(píng)論 - 47, 引用 - 0
            數(shù)據(jù)加載中……

            POJ 1147 Binary codes 壓縮算法:Burrows Wheeler transform

            題目大意:
            給出一個(gè)01字符串。將其循環(huán)移位,將所有移位后的串列舉出來(lái),并按字典序排序。
            比如“abcd”,可以移位成“bcda”,“cdab”,“dabc”。排序以后,為
            “abcd”
            “bcda”
            “cdab”
            “dabc”
            將最后一列的字母抽取出來(lái),即“dabc”。
            然后,讓你還原出第一行的字符。

            這是一個(gè)看上去很蛋疼的問(wèn)題,沒(méi)事研究這個(gè)干啥呢。
            想了半天,做不出來(lái)。看到discuss里面有人給了一個(gè)鏈接:
            http://en.wikipedia.org/wiki/Burrows%E2%80%93Wheeler_transform

            發(fā)現(xiàn)居然是一個(gè)壓縮算法!
            據(jù)說(shuō),將最后一列抽取出來(lái),較原字符串相比,能夠
            “easy to compress a string that has runs of repeated characters by techniques such as move-to-front transform and run-length encoding.”
            這個(gè)就不理解了。。

            這題簡(jiǎn)化了一下條件,字符串只包含01。

            看了它的還原方法。如果直接這樣寫(xiě):
            def ibwt(r):
            """Apply inverse Burrow-Wheeler transform."""
            table = [""] * len(r)  # Make empty table
            for i in range(len(r)):
            table = [r[i] + table[i] for i in range(len(r))]  # Add a column of r
            table.sort()
            s = [row for row in table if row.endswith("\0")][0]  # Find the correct row (ending in "\0")
            return s.strip("\0")  # Get rid of trailing null character
            
            還是復(fù)雜度很高,為 O(N*N*lgN)。

            那disscus里面說(shuō)的O(N)的方法和那么多0ms是咋來(lái)的呢?

            想了一下。發(fā)現(xiàn)每一次添加列然后再排序的操作,都是做一樣的置換。
            因?yàn)槊看翁砑拥牧卸家粯樱判虻慕Y(jié)果當(dāng)然也是一樣(比如是穩(wěn)定排序)。
            所以,第i列的結(jié)果就是置換i次的結(jié)果。我們只需要第一行的數(shù)據(jù)。
            經(jīng)過(guò)一次排序之后,就知道每一個(gè)行置到了哪個(gè)地方,如果第三行到了第一行,第五行到了第三行。
            那么:
            第一列第一行的就是未排序數(shù)據(jù)的第三行
            第二列第一行的就是未排序數(shù)據(jù)的第五行

            由于數(shù)據(jù)中只有01,完全可以在O(N)內(nèi)完成排序操作,之后得出第一行的操作也是 O(N) 完成的。
            可惜代碼實(shí)現(xiàn)出來(lái),也沒(méi)有到 0ms ,好像是 79ms 。代碼寫(xiě)得爛!高手改改也是0ms了。
            代碼里也包括了一個(gè)求普通字符串的BWT操作。

            #include <stdio.h>
            #include 
            <stdlib.h>
            #include 
            <string.h>

            int cmp(const void *a, const void *b)
            {
                
            return strcmp(*(char **)a, *(char **)b);
            }


            void bwt(char *inchar *out)
            {
                
            static char arr[32][32], *sorted[32];
                
            int len, i, j;

                len 
            = strlen(in);
                
            for (i = 0; i < len; i++{
                    sorted[i] 
            = arr[i];
                    
            for (j = 0; j < len; j++)
                        sorted[i][j] 
            = in[(i + j) % len];
                    sorted[i][len] 
            = 0;
                }


                qsort(sorted, len, 
            sizeof(sorted[0]), cmp);
                
            for (i = 0; i < len; i++
                    printf(
            "%s\n", sorted[i]);

                
            for (i = 0; i < len; i++)
                    
            out[i] = sorted[i][len - 1];
                
            out[i] = 0;
            }


            int cmp2(const void *a, const void *b)
            {
                
            if (*(int *)a == *(int *)b)
                    
            return *((int *)a + 1- *((int *)b + 1);
                
            else
                    
            return *(int *)a - *(int *)b;
            }


            void ibwt(char *inchar *out)
            {
                
            struct {
                    
            int ch, idx;
                }
             arr[32];
                
            int i, len, j;

                len 
            = strlen(in);
                
            for (i = 0; i < len; i++{
                    arr[i].ch 
            = in[i];
                    arr[i].idx 
            = i;
                }

                qsort(arr, len, 
            sizeof(arr[0]), cmp2);
                
            for (i = 0; i < len; i++)
                    printf(
            "%c %d\n", arr[i].ch, arr[i].idx);
                j 
            = arr[0].idx;
                
            for (i = 0; i < len - 1; i++{
                    
            out[i] = in[j];
                    j 
            = arr[j].idx;
                }

                
            out[len - 1= in[0];
                
            out[len] = 0;
                printf(
            "%s\n"out);
            }


            void test()
            {
                
            char in[32], out[32], res[32];

                strcpy(
            in"banana");
                bwt(
            inout);
                printf(
            "out:\n%s\n"out);
                ibwt(
            out, res);
            }


            int main()
            {
                
            static int map[3032], arr[3032], n, val, one[3032], one_cnt, zero_cnt, i;
                
                freopen(
            "e:\\test\\in.txt""r", stdin);

                scanf(
            "%d"&n);
                
            for (i = 0; i < n; i++{
                    scanf(
            "%d"&val);
                    arr[i] 
            = val;
                    
            if (val)
                        one[one_cnt
            ++= i;
                    
            else
                        map[zero_cnt
            ++= i;
                }

                
            for (i = 0; i < one_cnt; i++
                    map[zero_cnt 
            + i] = one[i];

                val 
            = map[0];
                
            for (i = 0; i < n - 1; i++{
                    printf(
            "%d ", arr[val]);
                    val 
            = map[val];
                }

                printf(
            "%d\n", arr[0]);
                
                
            return 0;
            }

            posted on 2010-02-28 19:02 糯米 閱讀(1253) 評(píng)論(1)  編輯 收藏 引用 所屬分類(lèi): POJ

            評(píng)論

            # re: POJ 1147 Binary codes 壓縮算法:Burrows Wheeler transform  回復(fù)  更多評(píng)論   

            what a pity. 還是沒(méi)看明白。
            可以發(fā)一份這個(gè)壓縮算法的原理給我嗎?謝謝~~
            2011-10-20 11:33 | Nicole Yi
            精品久久久久久综合日本| 久久青草国产精品一区| 免费无码国产欧美久久18| 国色天香久久久久久久小说| 久久久久成人精品无码中文字幕| 国产99久久久国产精品~~牛| 欧美精品国产综合久久| 99久久无色码中文字幕| 四虎久久影院| 69久久精品无码一区二区| 亚洲精品WWW久久久久久| 久久亚洲AV成人无码国产| 青青久久精品国产免费看| 国产精品久久久久影院色| 中文字幕精品久久| 久久夜色精品国产亚洲| 久久人人爽人人爽人人片AV东京热| 久久精品www| 99久久精品国产一区二区| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 免费精品久久久久久中文字幕| 亚洲综合伊人久久综合| 欧美久久亚洲精品| 久久96国产精品久久久| 久久成人国产精品| 久久精品国产亚洲AV影院| 日韩欧美亚洲综合久久| 日日狠狠久久偷偷色综合96蜜桃| 91久久香蕉国产熟女线看| AAA级久久久精品无码片| 天天躁日日躁狠狠久久| 久久久久免费精品国产| 久久经典免费视频| 成人久久免费网站| 东方aⅴ免费观看久久av| 久久精品卫校国产小美女| 久久免费看黄a级毛片| 成人午夜精品无码区久久| 无码人妻精品一区二区三区久久| 日本强好片久久久久久AAA| 少妇高潮惨叫久久久久久|