企業(yè)宣傳網(wǎng)站在哪里做seo中國(guó)是什么
89.格雷編碼
觀察一下n不同時(shí)的格雷編碼有什么特點(diǎn)
n=1 [0,1]
n=2 [0,1,3,2]
n=3 [0,1,3,2,6,7,5,4]
……
可以看到n=k時(shí),編碼數(shù)量是n=k-1的數(shù)量的一倍
同時(shí)n=k編碼的前半部分和n=k-1一模一樣
n=k編碼的最后一位是2k-1
后半部分的編碼是其對(duì)應(yīng)的前半部分的對(duì)稱的位置的數(shù)字+2k-1
如圖可以看出原理,為了增加長(zhǎng)度后,使得隔著中軸線相鄰的第2k-1位和第2k-1+1位差一位,那么就要在新增加的位上由0變1(因?yàn)榍鞍氩糠殖霈F(xiàn)過在原有的位上是1的編碼了)
也就是數(shù)字上增加了2k-1
至于其他的位,因?yàn)榘凑涨懊娴木幋a放置1的順序是唯一的,所以只要在最高位都填1,然后對(duì)稱著順序來就好了
因此代碼為
class Solution {
public:vector<int> grayCode(int n) {vector<int> gray;gray.push_back(0);gray.push_back(1);if(n==1)return gray;for(int i=2;i<=n;i++){for(int j=pow(2,i-1)-1;j>=0;j--){gray.push_back(gray[j]+pow(2,i-1));}}return gray;}
};
格雷編碼有相當(dāng)多的生成方法
還有一種,比如說G(i)=(i ^ (i >> 1))也就是G(i)=i^(i/2)
從這個(gè)圖可以看出,如果二進(jìn)制碼字的第 i 位和 i+1 位(從右邊開始數(shù))相同,則對(duì)應(yīng)的格雷碼的第i位為0,否則為1(當(dāng)i+1=n時(shí),二進(jìn)制碼字的第n位被認(rèn)為是0,即第n-1位不變)
class Solution {
public:vector<int> grayCode(int n) {vector<int> gray;for(int i=0;i<pow(2,n);i++)gray.push_back(i^i>>1);return gray;}
};