Відстань Хеммінга між двома струнами однакової довжини - це кількість позицій, на яких відповідні символи різні.
Дозвольте 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