
Комментарии 19
Хотелось бы в конце вывод. что нам дают коды Грея?
Коды Грея дают нам элегантное решение двух описанных в статье комбинаторных задач. Это естественно не главное их применение. Если верить Википедии, то
Сегодня коды Грея широко используются для упрощения выявления и исправления ошибок в системах связи, а также в формировании сигналов обратной связи в системах управления.
Но это уже другая история.
За статью спасибо.
Что касается мотивов, то их несколько: показать математический подход к составлению алгоритмов, разобрать две полезные комбинаторные задачи, ну и чисто для себя — попрактиковаться в изложении материала.
что нам дают коды Грея?
Про весь спектр применения кодов Грея не скажу, упомяну лишь частное.
При проектировании проектов на ПЛИС, например. Если создать большой счетчик на 20 триггерах, то при его инкрементировании обязательно возникают ситуации, когда сразу несколько триггеров меняют свое состояние:
255: 0_1111_1111 => 256: 1_0000_0000
при этом, триггеры переключаются в разное время и это очень плохо, стабильность такого счетчика оставляет желать лучшего и на больших частотах схема может работать неправильно.
Если же использовать коды Грея, то такой проблемы не будет, тк в соседних состояниях отличным может быть только один разряд. Те только один триггер переключится, что исключает так называемую «гонку сигналов».
Ну это простым языком)
Работающая версия выглядит так:
int X[100],N;
void PrintX(int a,int b){
for(int i=0;i<N;i++) printf("%d",i<a ? X[i] : b);
printf("\n");
}
void Gray(int u,int v,int d){
if(u==v) PrintX(N-u,1);
else if(v==0) PrintX(N-u,0);
else{
X[N-u]=d;
Gray(u-1,v-d,0);
X[N-u]=1-d;
Gray(u-1,v+d-1,1);
}
}void Gray2(int n){
for(int k=1<<n;--k>=0;){
int s=k^(k>>1);
for(int i=0;i<n;i++) printf("%d",(s>>i)&1);
printf("\n");
}
}
В дополнение
Один из способов генерации 2D кода Грея (сигнального созвездия) для: QAM-4, QAM-16, QAM-64, QAM-256, ...
И если в университете вам показывали "метод зиг-зага", и вам было трудно его запомнить/понять/использовать, то этот способ будет более простым/наглядным/быстрым, чем "зиг-заг".
P.S. Возможно скоро кто-нибудь сделает видео получше (у меня плохо получаются real-time записи), и добавит в него QAM-64 и QAM-256. ...возможно.
Многие спрашивают, где коды Грея применяются. Приведу простейший пример:
Задача скрейпинга отзывов с Амазона. Так как вывод ограничен всего 10-ю страницами, в ход идёт перебор фильтров. То есть мы просто поочередно перебираем все фильтры, затем уникьюлизируем результаты
Но вот проблема: при изменении одного фильтра страница перезагружается. При переборе фильтров в цикле получилось бы очень много лишних перезагрузок, т.к. за 1 итерацию мы меняем сразу несколько фильтров. Так как у меня в тот момент была гонка с другим программистом в этой задаче, я стал думать, как это оптимизировать. И придумал собственный "цикличный код Грея" (на тот момент я даже не знал о существовании такого). Я добился того, что на каждой итерации я изменяю ровно 1 фильтр, но перебираю все значения
Коды Грея и задачи перебора