Швидке кодування збалансованих векторів


10

Неважко помітити, що для будь-якого існує 1-1 відображення від {0,1} до {0,1} таким, що для будь-якого вектор "врівноважений", тобто має рівну кількість 1s і 0s. Чи можна визначити такий так, що за даного ми можемо ефективно обчислити ?F n n + O ( log n ) x F ( x ) F x F ( x )nFnn+O(logn)xF(x)FxF(x)

Дякую.


Я припускаю, що під "ефективним" ви маєте на увазі O (n) або вихід, виключаючи аргумент "повторних випадкових випробувань"?
Суреш Венкат

@Suresh, Чи змогли б ви накреслити аргумент "повторних випадкових випробувань"?
Еміль

один із способів довести, що відображення існує, є імовірнісним методом: виберіть F навмання, а потім відображення працює з певною вірогідністю. ось що я мав на увазі.
Суреш Венкат

1
Питання цілком чітко визначене, але, на мою думку, назва вводить в оману. Я б не називав відображення F, що задовольняє заявленій умові, «кодуванням збалансованих векторів», якщо F не є біективним. Це більше схоже на кодування п-бітову рядок з допомогою збалансованого вектора.
Цуйосі Іто

Я маю на увазі «ідеально чітко визначений» аж до можливо різних інтерпретацій «ефективно». Але це не сенс мого попереднього коментаря.
Цуйосі Іто,

Відповіді:


12

Розглянемо бітні рядки . Визначення:xnx

  • x if(x,i) = бітовий рядок з доповненими останніми бітами .xi
  • x x - xb(x) = "дисбаланс" : число 1s у число 0s у .xx x

Тепер виправте рядок . Розглянемо функцію . Спостереження:g ( i ) = b ( f ( x , i ) )xg(i)=b(f(x,i))

  • g(0)=b(x) .
  • g(n)=g(0) .
  • i|g(i)g(i+1)|=2 для всіх . Ми або видаляємо один 0 і додаємо 1, або навпаки.i

Тепер випливає, що існує такий, що .- 1 g ( i ) + 1i1g(i)+1

Отже, ми можемо побудувати біт-рядок таким чином: об'єднати і двійкове кодування індексу . Абсолютне значення дисбалансу дорівнює . Більше того, ми можемо відновити заданий ; відображення бієкція.y f ( x , i ) i y O ( log n ) x y(n+O(logn))yf(x,i)iyO(logn)xy

Нарешті, ви можете додати макетні біти які зменшують дисбаланс з до .y O ( log n ) 0O(logn)yO(logn)0


b (x) у 3-му рядку має бути b (y).
Еміль

Я думаю, що вам, можливо, потрібно додати ще один біт до рядка x, щоб забезпечити його рівну довжину (так що ви можете бути впевнені, що g (i) для я i дорівнює нулю).
Еміль

@Emil: Я не стверджую, що для деяких i дорівнює нулю ; достатньо, щоб абсолютне значення g ( i ) було для деяких i "досить малим" (щонайбільше логарифмічного було б достатньо, але легко показати, що воно буде не більше 1 для деяких i ). g(i)ig(i)i1i
Jukka Suomela

@Jukka: Ага, я бачу.
Еміль

1
Але так, ви маєте рацію, існує багато варіантів того самого базового підходу. Наприклад, як ви запропонували, ви можете спочатку скористатися бітом оббивки, щоб гарантувати, що буде рівним нулю для деяких i ; тоді ви можете кодувати i , використовуючи бітові пари 01 або 10 , тобто 2 log ( n ) зайвих біт; тоді результат конкатенації суворо збалансований, і нічого іншого не потрібно додавати. g(i)ii01102log(n)
Jukka Suomela

9

Скористайтеся картографуванням, яке зберігає лексикографічний порядок. Для того, щоб знайти -м довжина- п збалансований вектор з п / 2 1 - х, це зробити рекурсивно: якщо , а потім встановити перший біт 0 , а потім знайти -ю довжину - вектор з 1's для завершення решти бітів. В іншому випадку встановіть перший біт 1 і знайдіть вектор -й довжини- з 1.knn/2k(n-1)n/2n-1k-(n-1k(n1n/2)k(n1)n/2n1(п-1)п/2-1k(n1n/2)(n1)n/21


1
І якщо ви повторно використовуєте значення біноміального коефіцієнта, щоб обчислити наступний необхідний біноміальний коефіцієнт, весь алгоритм працює за O (n) час.
Tsuyoshi Ito

Дякую! Це має сенс. Я думаю, час роботи буде залежати від обчислювальної моделі. Якщо ви можете виконати операції над n-бітовими числами в одиницю часу, реалізація Tsuyoshi Ito буде працювати в O (n) час. З іншого боку, якщо порахувати бітові операції, я думаю, що час буде O (n ^ 2).
Пьотр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.