2015-04-28 5 views
6

Учитывая несортированный массив из п целых чисел, я знаю, что можно найти общее число инверсий, используя бит в O (N LG N) в соответствии с этим способом: Count Inversion by BITДиапазон запросов количество инверсии в O (LG N)

Однако возможно ли, что я должен запросить произвольный диапазон для общего числа инверсий в O (lg N)?

A O (N lg N) предварительное вычисление приемлемо.

Я провел некоторое исследование и, кажется, фактор N не может быть предотвращен ... Любые предложения будут оценены!

+1

Что означает «запрос произвольного диапазона для общего количества инверсий»? – vib

+0

запросить любой диапазон [l, r], где 0 <= l <= r <= n-1, вернуть общее количество инверсий в этом диапазоне – shole

+0

Кому-то, кого я заинтересовался, я увидел в некотором месте, что кто-то использовал что-то под названием «Wavelet Matrix ", чтобы справиться с этой штукой ... Эта структура слишком сложна для меня сейчас, поэтому я пропускаю ее напрямую ... – shole

ответ

0

Это не тот ответ, за который вы смотрите, но у меня есть два предложения.

Во-первых, я не думаю, что BIT - это правильная структура данных, используемая для проблемы, которую вы пытаетесь решить. Преимуществом BIT является то, что он поддерживает O (lg n) запрашиваемую префиксную сумму, используя только O (lg n) для каждой вставки. Поскольку вы не вставляете, как только ваша структура данных будет завершена, BIT не будет выгодным (потому что вы можете использовать простой массив префиксных сумм, который можно запросить в O (1)).

Во-вторых, у меня есть наивные алгоритм, который использует O (N) во времени и пространстве, чтобы построить структуру данных, которая может найти инверсий дальности в O (1) Время:

Во-первых, построить (п X n) матрица, отображающая инверсии, так что mat[i][j]=1 только если i<j и arr[i] и arr[j] инвертированы. Затем вычислите префиксную сумму по каждой строке этой матрицы, так что mat[i][j] - это число инверсий с участием arr[i] в диапазоне [i,j]. Наконец, вычислите суффиксную сумму по каждому столбцу, так что mat[i][j] - это общее количество инверсий в диапазоне [i,j].

for i from 0 to n-2 
    for j from i+1 to n-1 
    if(arr[j] > arr[i]) 
     mat[i][j] = 1; 
for i from 0 to n-2 
    for j from i+1 to n-1 
    mat[i][j] += mat[i][j-1]; 
for j from n-1 to 1 
    for i from j-1 to 0 
    mat[i][j] += mat[i+1][j]; 

Это явно занимает O (N 2 ) время и пространство, но число инверсий в любом диапазоне может быть запрошен в постоянное время.

+0

Как использовать« префикс sum array »для запроса« total количество инверсий в диапазоне? " : o – shole

+0

@shole После предварительной обработки значение 'mat [i] [j]' * - * число инверсий между 'i' и' j'. – Kittsil

 Смежные вопросы

  • Нет связанных вопросов^_^