Лінійний алгоритм часу для знаходження зміщених макс


11

Припустимо, що нам дано масив що містить неотримані цілі числа (не обов'язково окремі).A[1..n]

Нехай - відсортований у незростаючому порядку. Ми хочемо обчислити BA

m=maxi[n]B[i]+i.

Очевидним рішенням є сортування A а потім обчислення m . Це дає алгоритм, який працює в часі O(nlgn) в гіршому випадку.

Чи можна зробити краще? Чи можемо ми обчислити m у лінійному часі?


Моє головне питання - це вище. Але було б цікаво дізнатися про наступне узагальнення проблеми.

Нехай B - A відсортований за деяким порівнянням oracle і f функцією, заданою оракулом. Враховуючи A і оракули для і f , що можна сказати про час, необхідний для обчислення m=maxi[n]f(B[i],i) ?

Ми все ще можемо обчислити m за час O(nlgn) . Але чи можемо ми довести надлінійну нижню межу для цього узагальненого випадку?

Якщо відповідь "так", чи відповідає нижня межа, якщо вважати, що - це звичайний порядок для цілих чисел, а - "приємна" функція (монотонна, многочлена, лінійна тощо)?f

Відповіді:


10

Ми можемо обчислити у лінійному часі.m

Для простоти припустимо, що масиви засновані на 0: , . Ми хочемо обчислити .A[0..n1]B[0..n1]m=maxiB[i]+i

Нехай . Очевидно .max=maxiA[i]maxm

Нехай буде після сортування. Якщо ми маємо A[j]B[k]A[j]maxn

B[k]+kB[k]+(n1)=A[j]+(n1)(maxn)+(n1)=max1<maxm.

Тому ми можемо ігнорувати коли . Потрібно лише врахувати числа в діапазоні .A[j]A[j]maxn[maxn,max]

Ми можемо використовувати підрахунок сортування для сортування чисел в які знаходяться в діапазоні за лінійним часом, і використовувати відсортований список для обчислення .A[maxn,max]m


... ммм ... але яка вартість C [x] = C [x] +1?!?
Марціо Де Біасі

1
чи є проблема з вашою відповіддю? тому що мені здається прекрасним: ви говорите, що нас цікавлять лише елементи масиву зі значеннями в , тому ми можемо використовувати сортування підрахунку. Це працює для загальної проблеми, коли для всіх . [Mn,M]|f(B[i],i)B[i]|=O(n)i
Сашо Ніколов

Дякую @Marzio. :) Я трохи відредагував вашу відповідь для наочності. Не соромтеся відкатати мою редагування чи редагувати далі.
Каве

1
Це рішення, здається, працює також для будь-якого де для всіх і , . f(x,i)xin|f(x,i)x|=O(n)
Kaveh

@Kaveh: редагувати це нормально! Відповідь я написав швидко, і навіть не був впевнений у її коректності: -S
Marzio De Biasi

-1

Якщо масив складається з різних цілих чисел, то , оскільки відстань між сусідніми записами в становить щонайменше ; ситуація цікавіша, коли вони не повинні бути чіткими.Am=max(A)+1B1

Для вашого більш загального питання уявіть ситуацію, в якій "цікаво" лише тоді, коли . Здається, можна побудувати супротивний аргумент, який змушує вас запитувати для всіх перш ніж ви зможете дізнатися , отже, вам потрібно сортувати для того, щоб знайдіть відповідь, яка бере порівняння . (Є деякі ускладнення, оскільки, можливо, ми можемо перевірити, чи в постійному, а не лінійному часі, запитуючи .) Це так, навіть якщо - многочлен (високий ступінь).f(B[i],j)i=jf(B[i],i)imaxif(B[i],i)AΩ(nlogn)A[i]=B[j]f(A[i],j)f


1
Що робити, якщо A має n - 1 нулі та єдину? Тоді відповідь п, не 1.
Григорій Ярославцев

Привіт Ювал. Там може бути повторений номер в . Як сказав Григорій, рішення, здається, не працює. A
Каве

Я думаю, що я бачу вашу ідею для нижньої межі аргументу: задавши ми можемо швидко обчислити використовуючи пари запитів, зроблені для алгоритмом, що вирішує задачу в . Ми можемо переконатися, що алгоритм запитує на всіх але ми не можемо переконатися, що він не запитує інших пар. Однак ми можемо встановити для інших пар як відмінне значення, щоб ми могли відкинути ці пари. ABfo(nlgn)f(B[i],i)f
Каве
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.