Я пытаюсь вычислить de Bruijn последовательности для алфавитов, которые имеют несколько символов, которые не являются степенью двух.
Для алфавитов с символами 2 ^ k вычисление последовательностей Bruijn легко: существует несколько простых правил, таких как "Prefernes" и "Prefer Opposites" , которые работают для генерации B (2, n). B (2 ^ k, n) точно совпадает с B (2, kn), если вы читаете 1s и 0s как двоичные коды для фактических символов в вашем алфавите. Например, вы можете интерпретировать B (2,8n) как более n-длинные последовательности байтов.
Предпочитают достаточно просто: напишите n нулей. Затем всегда записывайте одно, если это не приведет к повторению строки длиной n; иначе напишите нуль.
В настоящее время я не вижу, как обобщать такие правила на алфавиты с нестандартными размерами.
Существует общий метод вычисления последовательностей де Брейна через графики: пусть каждая последовательность n-длины, сгенерированная вашим алфавитом, будет node; поместите ребро из A в B, если самые правые n-1 символы A совпадают с крайними левыми n-1 символами B. Пометьте каждое ребро последним символом строки в вершине головы. Любой Эйлеровский путь через этот график будет генерировать последовательность де Брейна, а особая конструкция, которую мы использовали, гарантирует, что будет хотя бы один такой путь. Мы можем использовать Fleury Algorithm для (недетерминистически) построения эйлерова пути:
- Выберите вершину.
- Оставьте эту вершину через некоторое ребро и удалите это ребро, только выбрав ребра, удаление которых приведет к отключению вершины от графика, если альтернативы нет.
- Добавьте в свою строку метку края, который вы только что удалили.
- Перейти к 2, пока все ребра не исчезнут.
Результирующая строка будет последовательностью de Bruijn.
Этот алгоритм несколько сложнее реализовать, чем Prefer Ones. Простота Предпочтений заключается в том, что нужно только проконсультироваться с уже полученным результатом, чтобы определить, что делать. Есть ли простой способ обобщить Prefernes (или, возможно, предпочтительные противоположности) на алфавиты размеров без питания?