Расстояние Хэмминга между двумя строками одинаковой длины - это количество позиций, в которых соответствующие символы различны.
Позвольте Pбыть двоичной строкой длины nи Tбыть двоичной строкой длины 2n-1. Мы можем вычислить nрасстояния Хэмминга между подстрокой Pкаждой nдлины Tв порядке слева направо и поместить их в массив (или список).
Пример последовательности расстояний Хэмминга
Пусть P = 101и T = 01100. Последовательность расстояний Хэмминга, которую вы получаете от этой пары, такова 2,2,1.
Определение близости
Теперь давайте рассмотрим две такие последовательности расстояний Хэмминга. Скажи x = (0, 2, 2, 3, 0)и y = (2, 1, 4, 4, 2)как примеры. Мы говорим , что xи yв closeслучае y <= x <= 2*yили если x <= y <= 2*x. Здесь скалярное умножение и неравенство взяты поэлементно. То есть, для двух последовательностей Aи B, A <= B iff A[i] <= B[i]по всем показателям i.
Обратите внимание, что последовательности расстояний Хэмминга образуют частичный порядок при таком способе их сравнения. Другими словами, многие пары последовательностей не являются ни большими, ни равными, ни меньшими или равными друг другу. Например (1,2)и (2,1).
Таким образом, используя пример выше, (0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)но (0, 2, 2, 3, 0)не больше, чем (2, 1, 4, 4, 2). Также (2, 1, 4, 4, 2)не меньше или равно 2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0). В результате xи yне близко друг к другу.
задача
Для увеличения, nначиная с n=1, рассмотрим все возможные пары двоичных строк Pдлины nи Tдлины 2n-1. Есть 2^(n+2n-1)такие пары и, следовательно, много последовательностей расстояний Хэмминга. Однако многие из этих последовательностей будут идентичны. Задача состоит в том, чтобы найти размер наибольшего набора последовательностей расстояний Хэмминга, чтобы никакие две последовательности не были близки друг к другу.
Ваш код должен выводить одно число на значение n.
Гол
В общем, ваш счет - самый высокий показатель, который nваш код достигает на моей машине за 5 минут (но читайте дальше). Время для общего времени работы, а не время только для этого n.
Чтобы получить оценки за неоптимальные ответы, потому что найти оптимальные ответы, скорее всего, будет сложно, нам понадобится немного тонкая система подсчета очков. Ваша оценка - это наибольшее значение, nдля которого никто другой не опубликовал более правильный ответ для любого размера, который меньше этого. Например, если вы выводите данные, 2, 4, 21а кто-то другой выводит данные, 2, 5, 15вы получите оценку только 1за то, что у кого-то есть лучший ответ n = 2. Если вы выводите данные, 2, 5, 21вы получаете оценку 3независимо от того, что выводит кто-то еще, поскольку все эти ответы являются оптимальными. Очевидно, что если у вас есть все оптимальные ответы, вы получите балл за самый высокий nпост. Тем не менее, даже если ваш ответ не является оптимальным, вы все равно можете получить счет, если никто другой не сможет его побить.
Пример ответов и проработанный пример
(Эти ответы еще не проверены. Независимая проверка будет принята с благодарностью.)
Благодаря ETHproductions:
- n = 1 дает 2.
- n = 2 дает 5.
- n = 3 дает 21.
Давайте посмотрим на n = 2более подробно. В этом случае полный список последовательностей расстояний Хэмминга (представленных здесь кортежами):
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Мы видим, что (0,0)это не близко к любому другому кортежу. В самом деле , если мы возьмем (0, 0), (0, 1), (1, 0), (2, 1), (1,2)то ни один из этих кортежей не близки к какой - либо из других. Это дает оценку 5для n = 2.
Для n = 3полного списка различных последовательностей расстояний Хэмминга:
[(0, 0, 0), (0, 0, 1), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 3, 0), (0, 3, 1), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 0), (1, 3, 1), (1, 3, 2), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 0, 2), (3, 0, 3), (3, 1, 0), (3, 1, 1), (3, 1, 2), (3, 2, 0), (3, 2, 1), (3, 2, 2), (3, 3, 2), (3, 3, 3)]
Из этих 48последовательностей мы можем выбрать набор размеров, 21чтобы ни одна пара в этом наборе не была близка друг к другу.
Языки и библиотеки
Вы можете использовать любой доступный язык и библиотеки, которые вам нравятся. Там, где это возможно, было бы хорошо иметь возможность запускать ваш код, поэтому, пожалуйста, включите полное объяснение того, как запускать / компилировать ваш код в Linux, если это вообще возможно.
Моя машина Время будет работать на моей 64-битной машине. Это стандартная установка Ubuntu с 8 ГБ ОЗУ, восьмиъядерным процессором AMD FX-8350 и Radeon HD 4250. Это также означает, что мне нужно иметь возможность запускать ваш код.
Ведущий ответ
- Счет 4 за 2, 5, 21, 83, 361 Кристиана Сиверса. C ++
- Оценка 5 за 2, 5, 21, 83, 372 по fəˈnɛtɪk. Javascript