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

            熱轉(zhuǎn)印www.yxheatpress.com

            公司網(wǎng)站模板http://qiyemoban.software8.co/

            常用鏈接

            統(tǒng)計(jì)

            友情鏈接

            最新評(píng)論

            Gray Code實(shí)現(xiàn)按序產(chǎn)生集合的所有子集

            簡介

            Gray Code,是幾十年前貝爾實(shí)驗(yàn)室的科學(xué)家Frank Gray提出的一種編碼方案,當(dāng)時(shí)主要用于傳輸信號(hào)以防止出錯(cuò)。Gray Code 除了在通信,硬件設(shè)計(jì)領(lǐng)域中應(yīng)用以外,在計(jì)算機(jī)相關(guān)科學(xué)的其他方面也有廣泛的應(yīng)用,例如按序產(chǎn)生集合的所有子集。


            Gray Code實(shí)現(xiàn)按序產(chǎn)生集合的所有子集

            子集的按序產(chǎn)生,這個(gè)概念很簡單,舉個(gè)例子,假設(shè)我們的集合為{a,b,c},那么按序產(chǎn)生的子集應(yīng)該是:

            空集 (000)   ——   0(編號(hào) 從0開始按順序排序)

            a (100)        ——   1

            ab  (110)     ——   2

            abc   (111)  ——   3

            ac

            b

            bc

            c


            那么Gray Code是如何產(chǎn)生這樣的序列的呢? 

            Gray Code的思想非常的巧妙,我們可以將所產(chǎn)生的子集編號(hào)(范圍為0~2^n-1),第一個(gè)子集為空集(編號(hào)為0,是偶數(shù))。在其后的每個(gè)子集由前一個(gè)子集來決定,如果前一個(gè)子集編號(hào)為偶數(shù),那么則改變前一個(gè)子集的第一位(從左邊數(shù))的二進(jìn)制值(0變成1或者1變成0)作為新的子集。如果前一個(gè)子集的編號(hào)為奇數(shù),那么就將前一個(gè)子集二進(jìn)制左邊數(shù)第一個(gè)1后面的那位改變其值(0變成1或者1變成0)作為新的子集。

            根據(jù)上面的Gray Code的思想,還是以集合{a,b,c}為例,第一個(gè)子集(000)的編號(hào)為0(偶數(shù)),推算出第二個(gè)子集是第一個(gè)子集改變左邊數(shù)的第一位的數(shù)值所產(chǎn)生,為100,也就是a(只取為1的字符,a為最左邊的字符對(duì)應(yīng)100中的1)。那么根據(jù)第二個(gè)子集的編號(hào)1(奇數(shù)),推算出第三個(gè)子集是由第二個(gè)子集改變從左數(shù)第一個(gè)1后面那一位的值所產(chǎn)生(100->110),那么110對(duì)應(yīng)的是ab。后面的子集都以此類推即可全部按順序產(chǎn)生。


            Gray Code非遞歸的C語言實(shí)現(xiàn)

            以下代碼在VS2008下調(diào)試通過


            1. int sum(int n)  
            2. {  
            3.     if(1<=n) return n+sum(n-1);  
            4.     else return 0;  
            5. }  
            6.   
            7. void gray(char *ptr)  
            8. {  
            9.     int len=strlen(ptr);  
            10.     int num=(1<<len);  
            11. //    printf("num=%d  \n",num);  
            12.     int i,j,k;  
            13.     int mod,tmp,mask,tmp1,tmp2;  
            14.     mask=1<<len-1;  
            15.  //   printf("mask=%d  \n",mask);  
            16.     mod=0;//(1<<len)-1;  
            17.     for(i=0;i<num-1;i++)  
            18.     {  
            19.         if(i%2==0)  
            20.         {  
            21.             tmp=mod&mask;  
            22.  //           printf("tmp=%d  ",tmp);  
            23.             if(0!=tmp) {mod=mod&(~mask);}  
            24.             else {mod=mod|(mask);}  
            25.         }  
            26.         else  
            27.         {  
            28.             tmp1=1<<(len-1);  
            29.             for(j=0;j<len;j++)  
            30.             {  
            31. //                printf(" in else");  
            32.                 if(mod&tmp1) break;  
            33.                 tmp1=tmp1>>1;  
            34.  //               printf("tmp1=%d  ",tmp1);  
            35.             }  
            36.             tmp1=tmp1>>1;  
            37.  //           printf(">>1  tmp1=%d  ",tmp1);  
            38.             if(tmp1!=0)   
            39.             {  
            40.                 tmp=mod&tmp1;  
            41.                 if(0!=tmp) {mod=mod&(~tmp1);}  
            42.                 else {mod=mod|(tmp1);}  
            43.             }  
            44.         }  
            45.         tmp2=1<<len-1;  
            46.         for(k=0;k<len;k++)  
            47.         {  
            48.             if(mod&tmp2) printf("%c",ptr[k]);  
            49.             tmp2=tmp2>>1;  
            50.         }  
            51.         printf("\n");  
            52.     }  
            53. }  
            54.   
            55. int main()  
            56. {  
            57. //    printf("  result=%d ",sum(4));  
            58.     char *p="abcd";  
            59.     gray(p);  
            60.     system("pause");  
            61. }  

            posted on 2012-10-29 17:08 不聽話的 閱讀(1091) 評(píng)論(0)  編輯 收藏 引用


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


            久久久精品人妻一区二区三区四 | 免费一级欧美大片久久网| 日本一区精品久久久久影院| 天天综合久久久网| 国产成人99久久亚洲综合精品| 思思久久好好热精品国产| 国产偷久久久精品专区| 久久综合综合久久狠狠狠97色88 | 亚洲国产精品无码久久久久久曰| 久久久国产亚洲精品| 久久精品国产亚洲77777| 久久九九久精品国产| 精品国产一区二区三区久久久狼| 久久久久99精品成人片三人毛片 | 亚洲国产精品久久久久久| 综合人妻久久一区二区精品| 亚洲国产二区三区久久| 亚洲AV无码久久寂寞少妇| 少妇无套内谢久久久久| 四虎久久影院| 国产精品99久久精品爆乳| 亚洲国产精品无码久久青草 | 久久精品国产色蜜蜜麻豆| 久久久久久夜精品精品免费啦| 亚洲国产日韩综合久久精品| 国产精品一区二区久久精品无码| 久久水蜜桃亚洲av无码精品麻豆 | 久久精品国产只有精品2020| 狠狠干狠狠久久| 人妻精品久久久久中文字幕一冢本 | 国产成年无码久久久免费| 久久精品国产WWW456C0M| 蜜桃麻豆www久久| 99国内精品久久久久久久| 99久久综合狠狠综合久久止| 国产精品久久久久久搜索| 中文字幕乱码久久午夜| 一本色道久久88—综合亚洲精品| 亚洲伊人久久综合影院| 久久99热这里只有精品国产| 久久久久亚洲AV无码观看|