Як перебрати вектори в порядку ймовірності в малому просторі


12

Розглянемо розмірного вектора де . Для кожного ми знаємо і припустимо, що є незалежними. Використовуючи ці ймовірності, чи існує ефективний спосіб перебирати бінарні двовимірних векторів, щоб з найбільш ймовірним до найменш вірогідного (з довільним вибором для зв'язків), використовуючи пробіл у підлінійному розмірі? v v i{ 0 , 1 } i p i = P ( v i = 1 ) v i nnvvi{0,1}ipi=P(vi=1)vin

Візьмемо для прикладу . Найімовірніший вектор - а найменш вірогідний . ( 1 , 0 , 1 ) { 0 , 1 , 0 }p={0.8,0.3,0.6}(1,0,1){0,1,0}

Для дуже малих ми можемо позначити кожен з векторів його вірогідністю та просто сортувати, але це, звичайно, все ще не використовує підлінійний простір.2 nn2n

Близький варіант цього питання раніше задавали на /cs/24123/how-to-iterate-over-vectors-in-order-of-probability .


Чи є якась причина, що ви також не задали подальше запитання? Чи тут головне питання - це робити це в підлінійному просторі?
Суреш Венкат

@SureshVenkat Так, проблема полягає лише в підлінійному просторі (у вихідному розмірі). Я запитав це тут, оскільки думаю, що питання може бути дуже важким.
Лембік

Для вирішення цього простору та часу в потрібні методи, схожі на SUBSET-SUM (швидко знаючи, які суми підмножини майже скасовують різні суми). Таким чином, навряд чи буде швидке рішення. poly(n)
Джеффрі Ірвінг

@GeoffreyIrving Чи вважаєте ви, що цю інтуїцію можна зробити більш формальною?
Лембік

Відповіді:


9

Далі наведено алгоритм, який використовує приблизно час та простір.2 n / 22n2n/2

Спочатку розглянемо проблему сортування сум усіх підмножин з елементів.n

Розглянемо цю підпроблему: у вас є два відсортовані списки довжиною , і ви хочете створити відсортований список парних сум чисел у списках. Ви б хотіли це зробити приблизно в час (розмір виводу), але підлінійний простір. Ми можемо досягти простору. Ми зберігаємо пріоритетну чергу і витягуємо суми з черги пріоритетів у порядку зростання.O ( m 2 ) O ( m )mO(m2)O(m)

Нехай списки та , відсортовані у порядку зростання. Беремо суми , , і ставимо їх у пріоритетну чергу.b 1b m m a i + b 1 i = 1 ma1amb1bmmai+b1i=1m

Тепер, коли ми витягуємо найменшу суму, що залишилася , з черги пріоритетів, якщо то ми ставимо суму у чергу пріоритетів. У просторі переважає черга пріоритетів, яка завжди містить не більше сум. І час - , оскільки ми використовуємо для кожної операції черги пріоритету. Це показує, що ми можемо виконати підпроблему в час та простір. j < m a i + b j + 1 m O ( m 2 log m ) O ( log m ) O ( m 2 log m ) O ( m )ai+bjj<mai+bj+1mO(m2logm)O(logm)O(m2logm)O(m)

Тепер, щоб сортувати суми всіх підмножин з чисел, ми просто використовуємо цю підпрограму, де список - це набір сум підмножини першої половини елементів, а список - це сукупність підмножини друга половина предметів. Ці списки ми можемо знайти рекурсивно за тим самим алгоритмом.a i b inaibi

Зараз ми розглянемо початкову проблему. Нехай - це набір координат, який дорівнює , а - набір координат, який дорівнює . Тоді 0 S 1 1 i S 0 p ( v i = 0 ) i S 1 p ( v i = 1 )S00S11

iS0p(vi=0)iS1p(vi=1)=1inp(vi=0)iS1p(vi=1)p(vi=0)=1inp(vi=0)exp(iS1logp(vi=1)p(vi=0)).

Сортування цих чисел те саме, що сортування чисел , тому ми звели проблему до сортування сум підмножини предметів.niS1logp(vi=1)logp(vi=0)n


Чи є правдоподібне скорочення, яке зробить рішення про час / простір неправдоподібним?
Лембік

Ви, мабуть, не збираєтеся отримати рішення, яке займає менше часу, оскільки це розмір виводу (і моє рішення займає час). Однак у мене немає хорошої нижньої межі для простору. n2nn2n
Пітер Шор

Дякую. Я не мав на увазі полі час звичайно, а скоріше щось лінійне у розмірі виводу та полі просторі.
Лембік

4

Ми можемо це зробити в просторі (якщо нас не хвилює час роботи).O(n)

  1. Для заданої рядки , ми можемо обчислити в просторі число рядків, що є більш імовірним, ніж ; тобто кількість st : просто перейдіть всі і порахуйте кількість st . Зауважимо, що - послідовне число рядка у висновку. O ( n ) r ( x ) x x p ( x ) > p ( x ) x { 0 , 1 } n x p ( x ) > p ( x ) r ( x ) xx{0,1}nO(n)r(x)xxp(x)>p(x)x{0,1}nxp(x)>p(x)r(x)x
  2. Для кожного ми можемо знайти з у просторі : переходимо всі , для кожного обчислюємо , зупиняємо та виводимо якщо .x r ( x ) = k O ( n ) x { 0 , 1 } n x r ( x ) x r ( x ) = kkxr(x)=kO(n)x{0,1}nxr(x)xr(x)=k
  3. Тепер просто перейдіть всі від до , для кожного друкуйте з .0 2 n - 1 k x r ( x ) = kk02n1kxr(x)=k

(Ми також повинні подбати про можливі зв’язки, але це не складно.)


Дякую. Але це досить повільний алгоритм :)
Лембік

0

Редагувати: Ця відповідь невірна. Деталі див. У коментарях. ~ гандалітер

Лінійний на виході означає . Я думаю, що очевидний алгоритм використовує лише простір, крім самого виводу, звичайно.O ( n )O(2n)O(n)

  1. Візьміть список, що містить пари , і відсортуйте його за, найбільший перший.| 0,5 - p i |(i,pi)|0.5pi|

  2. Визначте подвійно рекурсивну функцію, яка приймає список таких пар і частково заповнений вектор , встановлює значення як якщо , інакше, і повторюється (використовуючи хвіст списку, і ), то перевертає і повторюється знову. Якщо список порожній, він виводить .v i 1 p i > 0,5 0 v v i vvvi1pi>0.50vviv

  3. Викликайте цю рекурсивну функцію за відсортованим списком та порожнім вектором.

Інтуїція полягає в тому, що ви задаєте спочатку значення найбільш певних елементів у векторі (тих, чиї ймовірності найближчі до і ), і заповнюєте вектор так, закінчуючи тими, чиї ймовірності найближчі до . Кожне можливе значення, яке може прийняти весь вектор, виводиться в порядку його ймовірності.1 0,5010.5

Час виконання - , що є нижньою межею, тому що це довжина виводу. Складність простору становить оскільки сортування не вимагає більше цього, а рекурсивна довжина - це довжина вектора, яка дорівнює . Я вважаю, що це також нижня межа, оскільки для кожного кроку роботи алгоритму повинен бути різний стан пам'яті, а складність у часі - . Стани в пам'яті потрібні для перерахунку етапів часу . Тому цей алгоритм є найгіршим варіантом складності.O ( n ) n O ( 2 n ) O ( n ) O ( 2 n )O(2n)O(n)nO(2n)O(n)O(2n)


Інша відповідь, безумовно, інша, оскільки вимагає черги пріоритету, а значить, використовує пробіл . Θ(2n)
Лембік

Дякую. Я, очевидно, не прочитав її досить уважно! Я відредагував свою відповідь.
гандалітер

3
Ви впевнені, що це рішення працює? Я не міг розібратися у подробицях подвійної рекурсії (псевдокод допоможе!), Але не бачу, як це могло б працювати. Зокрема, ваше рішення здається локальним: якщо він встановив , тепер вийде відповіді з . Але фактичні відповіді не повинні виглядати так. Насправді, наскільки я зрозумів ваше рішення, воно здається невдалим навіть для найпростішого випадку, коли всі . 2 n - 1 v 1 = 1 p i = 0,5v1=12n1v1=1pi=0.5
mobius dumpling

Ти маєш рацію, це не працює. Вибачте!
гандалітер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.