Бинарная матрица с (макс. 2) непрерывными блоками из 1 в виде строк, вычисляет след ее квадрата - PullRequest
2 голосов
/ 18 января 2020

Пусть A - двоичная матрица nxn, строки которой имеют вид 0^k 1^l 0^m или 1^k 0^l 1^m. Кроме того, A имеет нули вдоль диагонали. Размер n может быть до 10^5. Матрица будет дана путем указания индексов, где блоки 1 начинаются и заканчиваются.

Другими словами, строки представляют собой серию 1, окруженную 0 's. или пробег 0 в окружении 1. В строке могут быть все нули, но не все (ноль по диагонали).

Пример A:

[0, 0, 0, 0, 1, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 1, 1, 0, 0]
[0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 0, 0, 0, 0, 1, 1, 1]
[1, 0, 0, 0, 0, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 0, 0, 0, 0, 1]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 0, 0, 0, 0, 1, 1]
[0, 0, 1, 1, 1, 1, 1, 1, 0, 0]
[1, 1, 1, 1, 1, 1, 0, 0, 0, 0]

Как вычислить след A^2 эффективнее (при O(n^2) времени)?

Это эквивалентно нахождению (n-2) '-го коэффициента для характеристики c полинома от A, обозначим его g_2(A), поскольку

tr(A^2) = (tr A)^2 - 2g_2(A) = -2g_2(A)

Немного о том, откуда возникает эта проблема:

Нам дана перестановка p чисел [1..n], и мы заинтересованы в количество

r(p) = #{k | p^{-1}[k+1] < p^{-1}[k]}

Здесь p^{-1}[k] означает индекс k в p. Мы хотим посчитать все перестановки двух элементов, которые уменьшают r на 2. Это можно сделать, рассматривая для каждого индекса k, где p[k] выгодно перемещать. Это зависит от позиций p[k]-1 и p[k]+1 (только от другого в крайних случаях), и отсюда берется форма для строк. Но также перемещение другого элемента должно быть выгодным, поэтому возникает вопрос, сколько элементов в матрице A имеют A[i][j] и A[j][i], равные 1, и мы ведем подсчет следа A^2. Далее, в исходном вопросе мы хотим вычесть из этого пары, которые являются соседними числами (|p[i]-p[j]|==1), поскольку это не уменьшит r на 2, а только на 1. Но это можно сделать за линейное время и для простоты не рассматривается для этого вопроса. Хотя, возможно, исходный вопрос накладывает некоторые дополнительные ограничения на матрицу A, что может помочь в расчете (?)

1 Ответ

2 голосов
/ 18 января 2020

Это можно сделать за O (n log n) с помощью алгоритма линии развертки с использованием дерева Фенвика .

Алгоритм вычисляет записи диагональ произведения в порядке. Он поддерживает дерево Фенвика, которое содержит текущий столбец. Дерево Фенвика может обновить запись за время O (log n) и сообщить сумму подмассива за время O (log n). Для каждой частичной строки единиц в позициях {i} × {j… j'-1} мы создаем два события (j, i, +1) и (j ', i, -1). Сортируйте и группируйте события по их первой записи (столбец, он же время). Событие (j, i, Δ) означает, что в момент времени j запись i увеличивается на Δ. Чтобы вычислить индекс диагонального элемента k, сначала примените все события со временем k, затем сообщите все интервалы единиц в соответствующей строке и суммируйте их.

...