Блог пользователя Burunduk1

Автор Burunduk1, история, 7 лет назад, По-русски

Предыстория

Жил был алгоритм Форд-Беллмана. Разные люди его по-всякому оптимизировали.
Например, популярен «Форд-Белман с очередью», также известный, как SPFA.

Здесь мы рассмотрим менее популярную версию «Форд-Белман с random shuffle».

(1) random_shuffle(edges.begin(), edges.end());
for (int run = 1; run; ) {
	run = 0;
        (2) random_shuffle(edges.begin(), edges.end());
	for (Edge e : edges)
		if (relax(e))
			run = 1;
}

Фазой назовём цикл по всем рёбрам. Обычный Форд-Беллман сделает не более V фаз.

История

Оказывается, от того, где написать random_shuffle,
сделать один раз заранее, или делать в начале каждой фазы, многое зависит.

На худшем тесте матожидание числа фаз у одного из новых Форд-Беллманов равно V / 2, у другого V / 1.72.
Как думаете, у кого меньше? Скоро допишу сюда ответ и доказательства.

Если вы любите математику, но не Форд-Беллмана, вот теорвер-составляющая

int i = 0, phase = 0;
p = [0, 1, ... n-1]
(1) random_shuffle(p.begin(), p.end()); 
for (int i = 0; i < n; phase++) {
	(2) random_shuffle(p.begin(), p.end()); 
	for (int x : p)
		if (x == i)
			i++;
}
// Найти матожидание phase в зависимости от того, где random_shuffle, в (1) или (2).

UPD: правильный ответ и доказательства записал eatmore, спасибо ему.

  • Проголосовать: нравится
  • +184
  • Проголосовать: не нравится

»
7 лет назад, # |
Rev. 2   Проголосовать: нравится +81 Проголосовать: не нравится

Похоже, что тема не вызвала интереса у посетителей. ☹

Напишу-ка я свои ответы, чтобы показать, что не только Burunduk1 интересуется математикой на Codeforces. Это ответы для второй задачи, первая сводится к ней, если граф представляет собой путь из n + 1 вершин и n рёбер.

Случай 1: random_shuffle один раз в начале
Случай 2: random_shuffle перед каждой фазой
Объяснение различий
  • »
    »
    7 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    Ещё немного математики:

    Случай 1
    Случай 2
»
7 лет назад, # |
  Проголосовать: нравится +21 Проголосовать: не нравится

Очень интересный пример. Конечно вариант 1 лучше, хотя некоторым может показаться, что чем случайнее, тем лучше. В первом случае события, связанные с порядком ребер в разных фазах зависимые, во втором -нет. Простой пример, почти из задачника. Пусть x,y,z — независимые равномерно распределенные непрерывные случайные величины. Тогда P(x<y)=P(x>y)=0.5 Аналогично P(y<z)=P(y>z)=0.5. Однако, P(y<z|y<x)=0.|6|