Наивный алгоритм определения из :AВA
Для , определите значение путем сравнения каждого с для
и подсчета тех, которые удовлетворяют .B ( k ) A ( i ) A ( k ) i = 1 , … , k A ( i ) < A ( k )k = 1 , … , nБ ( к )A ( I )A ( K )я = 1 , … , кA ( i ) < A ( k )
Этот алгоритм сравнивает со всеми остальными ( раз), с другими и т. Д., Поэтому общее количество сравнений равно . Но это не лучшее, что мы можем сделать. Например, глядя на , нам не нужно делать никаких сравнений! потому что это первые натуральных чисел, и гарантируется (независимо от перестановки), что там будут младших натуральных чисел. А как насчет ? Вместо проверки от до мы могли бы просто проверить . Это:n - 1 A ( 2 ) n - 2 ( n - 1 ) ( n - 2 )A ( 1 )n - 1A ( 2 )п - 2 B(n)B(n)=A(n)-1nn-1B(n-1)A(1)A(n-2)A(n)( n - 1 ) ( n - 2 )2B ( n )B(n)=A(n)−1 nn−1B(n−1)A(1)A(n−2)A(n)
Для , используйте алгоритм выше; для
используйте обратный алгоритм: определите , предварительно установив для него значение а затем вычтя для каждой записи для меньше . k=nk=1,…,n2B(k)A(n)-11A(i)i=k+1,…,nA(k)k=n2,…,nB(k)A(n)−11A(i)i=k+1,…,nA(k)
Это займет шагов, которые все еще . Отметим также, что при построении из , если то . O(n2)ABB(n)=A(n)-1A(n)=B(n)+12×(n2−1)(n2−2)2=(n−2)(n−4)4O(n2)ABB(n)=A(n)−1A(n)=B(n)+1
Но теперь для большей утонченности. Если нам разрешено дополнительное пространство или сортировка на месте, мы можем отсортировать числа, сравнивая их. Например:
∣∣∣∣ASB8904803701407332219166655∣∣∣∣
Вместо того, чтобы проверять их все (или проверять их по порядку), мы могли бы использовать бинарный поиск для определения каждого . Однако сортировка по-прежнему занимает время .O ( n log n )B(k)O(nlogn)