найти общее число пар (i,j) в массиве, такое, что i A[j]

как уже упоминалось в вопросе, нужно найти общее количество (i,j) пар в массиве, такое, что

(1) **i<j** 
(2) **a[i]>a[j]**

где i и j-индексы массива. Ограничений по пространству нет .

у меня вопрос

 1) Is there any approach which takes less than O(N^2) time?
 2) if so what is least complexity ?
 3) How do we prove that ? 

Я надеюсь, что я ясно с вопросом .

мой подход заключается в следующем

один из способов сделать вопрос-использовать грубый передний план, который занимает O(N^2) Время .

но я думаю, что должно быть лучше оптимизированное решение этого вопроса по крайней мере o (NlogN) sollution .Причина моей интуиции заключается в следующем.--8-->

интуиция 1) For sorting an array in ascending order conditions we have are : for i<j , a[i]<a[j] which is similar to my question . I also read that sorting has lower bound of Omega(n log n) . So my question should also have Omega(n log n) . I may be completely wrong if so please correct me .

моя вторая интуиция:

предположим, что у нас есть массив элементов следующим образом: 4,9,7,3,2,1,8,12

мы вычисляем выше условие i<j , a[i]>a[j] для элемента 4, поскольку i=0 указывает на 4, возможные значения для j равны 3,4,5 .так как a[0]>a[3], a[0]>a[4], a[0]>a[5], то мое общее число пар (i,j) пока равно 3 . В следующий раз, когда Я увеличиваю i (индекс) до 1,возможные значения j составляют 2,3,4,5,6 . Но мы должны использовать тот факт , что при i=0 (Когда a[i]=4) мы вычислили 3 элемента меньше a[i=0], что, в свою очередь, меньше a[i=1], поэтому я не буду сравнивать 9 с 3,2,1 (чтобы удалить ненужные вычисления ).Если мы можем удалить ненужные вычисления, мы можем уменьшить сложность до чего-то меньшего, чем O(N^2), или же не существует решения меньше, чем O(N^2).Но если решение существует, то как нам это сделать?Я попытался сделать график, но мой усилия тщетны .

подход 1)In-order to obtain O(nlogn) complexity I think we need to tweak around quick sort or merge sort to get solution but problem here is, if we sort the array we loose the actual positions of elements.

подход 2)In-order to get solution in O(NlogN) time I think using tree we may get the optimised sollution . I didn't get any clue.

подход 3)If there exists any O(N) time algorithm it should be with hashing . But in this case simple hashing doest work .

поэтому, пожалуйста, дайте мне знать, какие из вышеперечисленных интуиций или подходов верны (если правильно, какой подход приведет к оптимизированному решению и как).

2 ответов


вы можете считать инвертированные пары с алгоритмом, подобным сортировке слияния, как объяснено здесь.

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


другой подход заключается в использовании дерева статистики порядка. Вы последовательно вставляете элементы массива в это дерево и после каждой вставки видите, сколько элементов, предшествующих вставленному элементу, больше его.

An альтернатива порядку-дерево статистики сменные skiplist.


оба алгоритма имеют сложность o(n журнал N) сложность времени.

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

на этапе "разброса" сортировки ведра мы должны оценить количество элементов в ведрах для больших элементов, вставляя элемент в конце некоторого ведра (элементы в каждом ведре остаются в исходном порядке).

на этапе "сортировки" сортировки ковша мы должны изменить (таким же образом) алгоритм сортировки (скорее всего, сортировка вставки). Вставляя элемент на свое место, мы должны подсчитать, сколько других элементов он прыгнул.

Что касается ограничений, этот алгоритм работает только с числами (или с объектами, легко конвертируемыми в числа), и мы должны знать заранее, как эти числа распределенный. Итак, если у нас есть массив равномерно распределенных целых чисел, этот алгоритм должен работать правильно.


такие пары называются числом инверсий в массиве. Это один из показателей того, насколько близок массив к сортировке. Вы можете изменить сортировку слиянием, чтобы эффективно подсчитать количество инверсий за O (nlogn) время. См.этой для сведения.