Я застрял на этой проблеме:
Для заданного массива из первых натуральных чисел, произвольно переставленных, строится массив , так что - это число элементов от до которые меньше, чем ,
я) Учитывая вы можете найти в времени? II) Учитывая вы можете найти в времени?
Здесь . Для конкретного примера:
Может кто-нибудь мне помочь? Спасибо.
algorithms
arrays
permutations
проклятый
источник
источник
Ответы:
Наивный алгоритм определения из :AВ A
Этот алгоритм сравнивает со всеми остальными ( раз), с другими и т. Д., Поэтому общее количество сравнений равно . Но это не лучшее, что мы можем сделать. Например, глядя на , нам не нужно делать никаких сравнений! потому что это первые натуральных чисел, и гарантируется (независимо от перестановки), что там будут младших натуральных чисел. А как насчет ? Вместо проверки от до мы могли бы просто проверить . Это:n - 1 A ( 2 ) n - 2 ( n - 1 ) ( n - 2 )A ( 1 ) n - 1 A ( 2 ) п - 2 B(n)B(n)=A(n)-1nn-1B(n-1)A(1)A(n-2)A(n)( n - 1 ) ( n - 2 )2 B ( n ) B(n)=A(n)−1 n n−1 B(n−1) A(1) A(n−2) A(n)
Это займет шагов, которые все еще . Отметим также, что при построении из , если то . O(n2)ABB(n)=A(n)-1A(n)=B(n)+12×(n2−1)(n2−2)2=(n−2)(n−4)4 O(n2) A B B(n)=A(n)−1 A(n)=B(n)+1
Но теперь для большей утонченности. Если нам разрешено дополнительное пространство или сортировка на месте, мы можем отсортировать числа, сравнивая их. Например:
Вместо того, чтобы проверять их все (или проверять их по порядку), мы могли бы использовать бинарный поиск для определения каждого . Однако сортировка по-прежнему занимает время .O ( n log n )B(k) O(nlogn)
источник
Вместо того, чтобы определять каждый одному за раз, мы можем смотреть в будущее и проходить каждое число в только один раз ! Но мы будем использовать пробел:A nB(k) A n
Мы могли бы сэкономить еще больше времени, не обновляя те, которые уже были определены (то есть, нет смысла обновлять после первого шага), но в худшем случае нам все еще нужно обновить раза( n ) ( n + 2 )8 (n)(n+2)2
источник
и I и II разрешимы с помощью #next_greater_element, который я объяснил здесь . но это немного сложнее, чем просто проблема, но перед решением вам нужно изучить следующий более важный элемент:
вторая часть также сходна отметить , что мы можем получить значение элемента , самый правый в EDIT: мое решение является неправильным, кажется , что не имеют каких - либо решениеO(1) o(n)
источник