1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8

# конспект · шаг 8 из 8

Конспект: префиксные суммы, слияние, сортирующие сети

выжимка - её можно унести в заметки

Понятия

Скан (префиксная сумма) ассоциативной операции: включающий y[i] = x[0] ⊕ … ⊕ x[i], исключающий - без x[i]. Ассоциативность - единственное требование: дерево переставляет скобки.

Упаковка - оставить элементы по условию; устойчивое разбиение - нули вперёд, единицы назад, порядок внутри групп сохранён. Ранг элемента в массиве - сколько там элементов меньше него.

Сортирующая сеть - фиксированные слои компараторов; глубина - число слоёв. Принцип нулей и единиц - сеть, сортирующая все 2ⁿ 0-1 входов, сортирует всё.

Что унести

ДВА СКАНА                 шагов           работа
Хиллис - Стил             ⌈log₂ n⌉        n · log₂ n − (n − 1)
Блеллох (подъём+спуск)    2 log₂ n        2(n − 1)
1024 числа: ХС - 10 шагов, 9217 сложений; Блеллох - 20 и 2046
Блеллох даёт исключающий скан; включающий = + x[i]
шаг читает старые значения: новый массив или ход справа налево
ЧТО СТРОЯТ ИЗ СКАНА
упаковка:      адрес = исключающий скан флагов, размер = сумма
разбиение:     нули - скан (1 − bit), единицы - нулей + скан bit
поразрядная:   разбиение по битам от младшего; каждое устойчиво
ранг в списке: rang += rang[sled]; sled = sled[sled]
               ⌈log₂ n⌉ раундов, работа n log n; 1000 эл. - 10
СЛИЯНИЕ И СОРТИРОВКА
место A[i] = i + (в B строго меньших)
место B[j] = j + (в A меньших или равных)  - равные не сталкиваются
рангами: глубина log n, работа n log n
сортировка слиянием рангами: глубина ~log² n / 2, работа ~n log² n / 2
    65 536: параллелизм 65 536, но работы в 8,5 раза больше
работоэффективно: p кусков, двоичный поиск только границ
выборка: s · p образцов, границы - образцы номер s, 2s, …
    4000 чисел, 8 корзин: s = 1 - перекос 3,65; s = 64 - 1,13
СОРТИРУЮЩИЕ СЕТИ
битонная (Бэтчер, 1968):
    глубина log₂ n (log₂ n + 1) / 2
    компараторов n/4 · log₂ n (log₂ n + 1)
    8 входов: 6 слоёв, 24 компаратора; 16: 10 и 80
    слияние блока k: зеркальный слой i ↔ k − 1 − i, потом k/4, …, 1
чёт-нечет перестановки: n слоёв, n(n − 1)/2 компараторов
    7 слоёв на 8 входах: 3 плохих входа из 256, ловят 8% случайных
минимум для 8 входов: 19 компараторов (чётно-нечётное слияние)
AKS (1983): глубина O(log n), константы - тысячи
n не степень двойки: достроить до N, лишние провода - +∞,
    компараторы с ними выбросить

Ловушки джокера

Сложение на месте. Шаг Хиллиса - Стила, пишущий в тот же массив слева направо, читает уже обновлённые ячейки.

Неассоциативная операция. Вычитание и «среднее двух» сканом не считаются; сложение float ассоциативно лишь приближённо - ответ чуть отличается от цикла.

Включающий вместо исключающего. Адреса при упаковке сдвигаются на единицу.

Общий счётчик вместо скана. Адреса раздаются в порядке прихода: упаковка теряет устойчивость, а поразрядная сортировка - правильность.

Одинаковое правило для равных при слиянии. Две записи в одну ячейку или пустая ячейка.

Слияние рангами на малом числе ядер. Логарифмическая глубина не окупает n log n работы на уровне.

Границы выборки без запаса. Одна корзина втрое больше остальных.

Проверка сети случайными тестами. Это выборка, а не доказательство; полный перебор 0-1 входов при n ≤ 20 - секунды.

Слой с общим проводом. Два компаратора на одном проводе - два слоя, а не один.

  • Ранжирование списка: удвоение указателей даёт O(n log n) работы; случайное независимое множество удаляет в среднем четверть внутренних вершин. Рекурсивное сжатие даёт ожидаемую линейную работу, не детерминированный худший случай.

Комментарии

Пока нет комментариев. Будь первым!

Оставить комментарий

Комментарий появится после проверки. Email не публикуется. Войти, чтобы не вводить имя каждый раз.