自動生成格雷碼算法

典型的二進制格雷碼(Binary Gray Code)簡稱格雷碼,在一組數的編碼中,若任意兩個相鄰的代碼只有一位二進制數不同,則稱這種編碼爲格雷碼(Gray Code),另外由於最大數與最小數之間也僅一位數不同,即“首尾相連”,因此又稱循環碼反射碼

自動生成格雷碼的算法主要利用以下規則:

1. 1位格雷碼有兩個碼字。
2. (n+1)位格雷碼中的前2n個碼字等於n位格雷碼的碼字,按順序書寫,加前綴0。
3. (n+1)位格雷碼中的後2n個碼字等於n位格雷碼的碼字,按逆序書寫,加前綴1。
4. (n+1)位格雷碼的集合 = n位格雷碼集合(順序)加前綴0 + n位格雷碼集合(逆序)加前綴1。

簡而言之,就是後面的格雷碼等於其相鄰的前面的格雷碼按順序書寫,加前綴0,再按逆序書寫,加前綴1如下圖所示:


按照這個思路很容易的實現代碼:

void generaterGrayCode(int n)
{
	vector<string> grayCodeVec;

	//當n爲1的時候的格雷碼
	string aa = "0";
	string bb = "1";
	grayCodeVec.push_back(aa);
	grayCodeVec.push_back(bb);

	//產生大於兩位的格雷碼,n位格雷碼的數量爲2^n個
	if (n > 1)
	{
		for (int i = 2; i <= n; i++)
		{
			//設置一個臨時存儲空間來存儲n-1位格雷碼
			vector<string> tempGrayCodeVec;
			for (size_t k = 0; k < grayCodeVec.size(); k++)
			{
				tempGrayCodeVec.push_back(grayCodeVec[k]);
			}

			//在前面產生的n-1位格雷碼前面添加一位數0產生2^(n-1)個n位格雷碼,並替換掉原來的n-1位格雷碼
			int tempGrayCodeVecSize = tempGrayCodeVec.size();
			for (int j = 0; j < tempGrayCodeVecSize; j++)
			{
				string tempbitzero = "0";
				tempbitzero += tempGrayCodeVec[j];
				grayCodeVec[j] = tempbitzero;
			}

			//將前面產生的n-1位格雷碼的順序反轉
			//在反轉後的n-1位格雷碼前面添加一位數1產生剩下2^(n-1)個n位格雷碼,並存儲起來
			for (int jj = tempGrayCodeVecSize-1; jj >= 0; jj--)
			{
				string tempbitone = "1";
				tempbitone += tempGrayCodeVec[jj];
				grayCodeVec.push_back(tempbitone);
			}
			//釋放掉臨時存儲空間
			tempGrayCodeVec.clear();
		}
	}

	//輸出n位格雷碼
	for (size_t i = 0; i < grayCodeVec.size(); i++)
	{
		cout << grayCodeVec[i] << endl;
	}
	cout << endl;
}


完整代碼下載鏈接http://download.csdn.net/detail/qq_22980439/9482303


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章