AlgoVerse

کد گری

همه‌ی رشته‌های n بیتی را طوری مرتب می‌کند که هر دو رشته‌ی پشت سر هم فقط در یک بیت فرق داشته باشند؛ با بازتاب فهرست قبلی.

در شمارش دودویی معمولی گاهی چند بیت هم‌زمان عوض می‌شوند (0111 → 1000). در کد گری هر دو عدد پشت سر هم فقط در یک بیت فرق دارند. این در حسگرهای چرخشی، جدول کارنو و مسئله‌ی برج هانوی کاربرد دارد.

ادامه‌ی توضیح ↓
ورودی:
n=3خروجی PDF

کد گری ۳ بیتی: 000، 001، 011، 010، 110، 111، 101، 100.

  1. def gray_code(n):
  2. codes = [""]
  3. for size in range(1, n + 1):
  4. reflected = codes[::-1]
  5. codes = ["0" + c for c in codes] + ["1" + c for c in reflected]
  6. rows = []
  7. for i in range(len(codes)):
  8. # The same code from the formula i XOR (i >> 1), written in n bits.
  9. formula = format(i ^ (i >> 1), "b").zfill(n) if n > 0 else ""
  10. rows.append((i, codes[i], formula))
  11. return codes

ناوردا: بعد از هر بازتاب، codes همه‌ی رشته‌های آن طول را دارد و هر دو همسایه (حتی آخری و اولی) در یک بیت فرق دارند.

شروع اجرا

codes—

جدول هنوز خالی است.

متغیرهای محلی

n3

نارنجی = در همین گام عوض شد

Call stack

  1. gray_code()خط 1
گام ۱ از ۳۹
خط سیاه = reflect · خط نارنجی = گام کلیدیreflect: 0/3 · row: 0/8
    توضیح

    ایده

    در شمارش دودویی معمولی گاهی چند بیت هم‌زمان عوض می‌شوند (0111 → 1000). در کد گری هر دو عدد پشت سر هم فقط در یک بیت فرق دارند. این در حسگرهای چرخشی، جدول کارنو و مسئله‌ی برج هانوی کاربرد دارد.

    ساختن با بازتاب

    1. فهرست کدهای k بیتی را بنویس.
    2. یک بار با 0 در ابتدای هر کد، و بعد برعکس فهرست با 1 در ابتدا.

    وسط فهرست تازه دو کدِ یکسان (با بیت اول متفاوت) کنار هم‌اند، پس ویژگی «یک بیت تفاوت» حفظ می‌شود.

    فرمول مستقیم

    کد شماره‌ی i برابر i XOR (i >> 1) است؛ ستون آخر جدول همین را نشان می‌دهد تا با روش بازتاب مقایسه کنی.