Враховуючи зважений даг, чи існує алгоритм O (V + E) для заміни кожної ваги на суму ваги її предка?


34

Проблема, звичайно, у подвійному рахунку. Це досить просто зробити для певних класів DAG = дерево, або навіть послідовно-паралельне дерево. Єдиний алгоритм, який я знайшов, який працює на загальних DAG в розумний час, є приблизним (дифузія синопсису), але підвищення його точності є експоненціальним у кількості бітів (і мені потрібно багато бітів).

Передумови: це завдання виконується (кілька разів з різними "вагами") як частина обчислень ймовірності в BBChop (http://github.com/ealdwulf/bbchop) програма для пошуку перервних помилок (тобто байєсівська версія " git bisect '). Отже, DAG, про який йдеться, є історією перегляду. Це означає, що кількість ребер навряд чи наблизиться до площі кількості вузлів, ймовірно, вона буде меншою, ніж k, ніж кількість вузлів для деякого невеликого k. На жаль, я не знайшов жодних інших корисних властивостей ревізійних DAG. Наприклад, я сподівався, що найбільший триконечно пов'язаний компонент буде рости лише як квадратний корінь кількості вузлів, але, на жаль (принаймні, в історії ядра Linux) він росте лінійно.


Просто для уточнення: це лише вузли, які мають ваги, а не краї?
Генріх Апфельмус

Так, лише вузли.
Ealdwulf

4
Це здається майже дублікатом cstheory.stackexchange.com/questions/553/… ?
Jukka Suomela

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

Наближення, здається, не важко пов'язане з деякими додатковими полілогічними факторами ...
Саріель Хар-Пелед

Відповіді:


17

Ми припускаємо, що ваги вершин можуть бути довільними натуральними цілими чи, точніше, вони можуть бути додатними цілими числами не більше 2 n . Тоді поточне завдання не може бути виконано навіть у трохи слабший часовий зв'язаний O ( n 2 ), якщо тільки транзитивне закриття довільно спрямованого графа не може бути обчислене за час O ( n 2 ), де n позначає кількість вершин. (Зверніть увагу, що алгоритм часового переходу O ( n 2 ) для перехідного закриття буде проривом.) Це протипоказання наступної формули:

Претензія . Якщо поточне завдання можна виконати в часі O ( n 2 ), перехідне закриття довільно спрямованого графа, заданого як його матриця суміжності, може бути обчислено за час O ( n 2 ) (припускаючи деяку розумну обчислювальну модель).

Доказ . В якості попередньої обробки ми обчислюємо сильно пов'язане розкладання компонентів заданого спрямованого графіка G за час O ( n 2 ) для отримання DAG G ′. Зверніть увагу , що якщо ми можемо обчислити транзитивне замикання G ', ми можемо реконструювати транзитивне замикання G .

Тепер призначте вагу 2 i кожній вершині i DAG G ′ і використовуйте алгоритм для поточної проблеми. Тоді двійкове представлення суми, присвоєної кожній вершині i описує саме множину предків i , іншими словами, ми обчислили перехідне закриття G ′. QED .

Зворотне твердження також має місце: якщо ви можете обчислити перехідне закриття заданої DAG, легко обчислити необхідні суми додатковою роботою в часі O ( n 2 ). Тому теоретично можна досягти поточного завдання в часі O ( n 2.376 ), використовуючи алгоритм перехідного закриття на основі алгоритму множення матриці Копперсміта-Винограда .

Правка : Версія 2 та новіші версії не висловлювали явно припущення про діапазон ваг вершин. Пер Вогсен в коментарі зазначив, що це неявне припущення може бути нерозумним (спасибі!), І я згоден. Навіть якщо довільні ваги не потрібні в додатках, я думаю, що ця відповідь може виключати деякі підходи наступним рядком міркувань: «Якщо такий підхід спрацював, він дав би алгоритм довільних ваг, який не виключається, якщо тільки перехідні закриття може бути обчислено в часі O ( n 2 ). "

Редагувати : У версії 4 та попередній версії неправильно вказано напрямок ребер.


4
Я думав про цю саму річ минулої ночі, оскільки одне практичне рішення використовує бітові вектори для підрахунку виключень. Я думаю, єдине питання - чи розумно вважати, що ваги можуть мати довжину бітів, пропорційну n. На практиці я можу уявити, що ваги обмежені деяким k, так що максимально можлива сума становить кн, що не вистачає біт, щоб виконати цю хитрість.
Per Vognsen

@Per: Я згоден, що припущення про те, що ваги вершин можуть бути n-бітовими цілими числами, може бути сумнівним. Я відредагував відповідь, щоб зробити це припущення явним. Спасибі!
Цуйосі Іто,

1
@Per: Я зрозумів, що якщо ваги вершин є цілими числами, обмеженими O (1), проблема зводиться до випадку, коли всі вершини мають вагу 1 шляхом дублювання вершин відповідним чином.
Цуйосі Іто,

На жаль, я не бачу відповіді в цій темі на проблему підрахунку. Підрахунки містять логарифмічно менше інформації, ніж перелік транзитивного замикання, O (n log n) проти O (n ^ 2), тому я не бачу, як пряме скорочення могло б працювати.
Per Vognsen

До речі, цікавою версією цієї проблеми є те, коли у нас є пов'язаний з галузевим фактором та інформацією про приріст чисельності поколінь (a la topological sort) DAG. Якщо зростання є експоненціальним, візерунок по суті є подібний до дерева. Що робити, якщо це лінійна, лінійна, квадратична тощо?
Per Vognsen

2

Це розширення мого коментаря до відповіді Цуйосі. Я думаю, що негативну відповідь на питання можна зробити безумовною.

ω(n)O(n)

Gr,cr×crrc

r=(log n)/2c=2n/log n

nω(log n)

ω(n)2c(r1)=O(n)

Справа в тому, що основний частковий порядок щільний, але DAG являє собою його транзитивне зменшення, яке може бути рідким.


Цей аргумент цікавий, але я не впевнений, чи можна це зробити доказом будь-якого цікавого твердження. Враховуючи всеохоплюючу складність доведення нижчих меж проблем, мені цей аргумент здається ручним.
Tsuyoshi Ito

@Tsuyoshi: Я думаю, що існування має працювати через імовірнісний аргумент, і нижня межа слабка, тому, здається, достатньо місця для його роботи. Але ви маєте рацію, це рукописно, що фраза "доповнення, що не використовується повторно, в середньому" потребує кращої основи.
Андраш Саламон

-2

Це неправильно і ґрунтується на нерозумінні питання. Дякую Цуйосі, що терпляче вказав на мою помилку. Покидання, якщо інші помиляються.

k

kO(k|V|)

O(|V|+|E|)

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


4
Я не розумію. Як уникнути подвійного рахунку, коли DAG не є деревом? Насправді, якщо я не помиляюся, загальний випадок може бути зведений до випадку, коли кожна вершина має максимум двох попередників, а будь-який алгоритм лінійного часу для останнього випадку дає алгоритм лінійного часу для загального випадку.
Цуйосі Іто,

O(|V|+|E|)k

Боюся, що ви неправильно зрозуміли мій коментар. Я ставлю під сумнів правильність вашого алгоритму, а не час роботи. Припустимо, DAG з чотирма вершинами A, B, C, D з ребрами A → B → D і A → C → D, кожній вершині надається деяка вага. Вирахувавши часткові суми для B і C, ви не можете просто додати часткові суми для B і C для обчислення суми для D, оскільки це зробило б вагу вершини A вдвічі.
Tsuyoshi Ito

u<vw(u)

1
Так. І зараз я пам’ятаю, що вперше побачивши це питання, я неправильно перечитав це питання і подумав, що це буде очевидним. Але ні, справжнє питання складніше цього. Час подумати….
Цуйосі Іто,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.