Подсчет инверсии с использованием группировки

Я пытаюсь подсчитать инверсию в массиве (два элемента a[i] и a[j] образуют инверсию, если a[i] > a[j] и i ‹ j). Я знаю, что эти проблемы легко решить с помощью грубой силы за O(n^2) и с помощью функции «Разделяй и властвуй» за O(nlgn).

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

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

Обратите внимание, что перестановка может быть любой длины, но во время выполнения мы знаем количество элементов в перестановке. Таким образом, значение «n» известно во время выполнения, и перестановка состоит из элементов от «1» до «n».

Сортировка. Этот набор данных можно отсортировать с временной сложностью O(n), так как мы можем создать 32 корзины, и мы знаем, что в каждой корзине будет ровно один элемент. Таким образом, эффективность сортировки ведра, которая составляет O (n + M), составляет O (n + 1) = O (n) для этого конкретного примера.


person chettyharish    schedule 08.03.2015    source источник
comment
Не совсем уверен, но сложность, которая является большой-0, зависит от размера ввода. Но если сам размер ввода становится постоянным, не означает ли это, что сложность также постоянна?   -  person sashas    schedule 08.03.2015
comment
N может быть любым, но я знаю, что это перестановка размера n. то есть элементы в массиве от 1 до n . А я и знаю за исполнение.   -  person chettyharish    schedule 08.03.2015
comment
хорошо, я думал, что n всегда было 32, теперь это имеет смысл   -  person sashas    schedule 08.03.2015
comment
Я stackoverflow.com/questions/6024614/ взгляните на это не совсем то, что вы ищете, но может быть полезно   -  person sashas    schedule 08.03.2015
comment
Перестановка чисел 1..32 имеет размер 32, поэтому n тоже постоянно.   -  person Niklas B.    schedule 08.03.2015


Ответы (1)


Согласно http://arxiv.org/pdf/1503.01192.pdf, это "хорошо известно" что вы не можете найти количество инверсий более эффективно, чем O (n log n).

person Paul Boddington    schedule 08.03.2015
comment
Я полагаю, что один простой способ доказать это — начать с утверждения, что невозможно сортировать более эффективно (в худшем случае), чем O(nlogn), и отметить, что проблема сортировки массива может быть сведена к проблеме выявления всех инверсий. - person Asad Saeeduddin; 08.03.2015
comment
Этот набор данных можно отсортировать за время O(n), поскольку мы знаем, что сортировка ведра работает за O(M + n), а здесь M = 1, так как ровно один элемент отображается в каждое ведро. - person chettyharish; 08.03.2015