Ефективно знаходити кількість менших елементів для кожного елемента в масиві


9

Я застряг у цій проблемі:

Дано масив A першої n натуральні числа випадковим чином перестановлені, масив B будується так, що B(k) - кількість елементів від A(1) до A(k−1) які менші, ніж A(k).

і) Дано A ви можете знайти B в O(n)час?
ii) ДаноB ви можете знайти A в O(n) час?

Ось B(1)=0. Для конкретного прикладу:

|А843172965Б000031644|

Хтось може мені допомогти? Дякую.


Я виявив це: обчислювальні кодування перестановки, що даєО(нжурнал⁡н)алгоритми цих проблем. Принаймні, я думаю, що вони однакові.
— Realz Slaw

@Merbs чи означає, що цей натяк, який ви дали, означає, що у вас є рішення?
— AJed

1
@AJed, це означає, що у мене є алгоритм, хоча він займає О(н2) для простого алгоритму без простору і О(нжурнал⁡н)якщо нам дозволено простір. На даний момент я схиляюся ні до того, щоб бути неможливимО(н)і обидва є одним і тим же алгоритмом.
— Мербс

@Merbs. Я відчуваю, що ваш натяк може призвести до правильного шляху. у них теж є одне рішення (за вашим підказом). Я думаю, що в аналізі є хитрість, яка змушує її йтиO(n).. Я думаю, що фокус - це знання, яке A йде від 1:нтільки.
— AJed

2
Цей документ також дає а O(nlog⁡n)алгоритм. Ви впевнені, що існуєO(n)алгоритм для цього?
— Realz Slaw

Відповіді:


1

Наївний алгоритм визначення B з A:

Для k=1,…,n, визначте значення B(k) шляхом порівняння кожного A(i) до A(k) для i=1,…,k і рахувати тих, що задовольняють A(i)<A(k).

Цей алгоритм порівнює A(1) всім іншим (n−1 разів), A(2) до n−2 інші тощо, тому загальна кількість порівнянь становить (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). Це є:

Для k=1,…,n2, використовувати алгоритм, наведений вище; для k=n2,…,n використовувати зворотний алгоритм: визначити B(k) встановивши його спочатку на A(n)−1 а потім віднімання 1 для кожного запису A(i) для i=k+1,…,n що менше, ніж A(k).

Це займе 2×(n2−1)(n2−2)2=(n−2)(n−4)4 кроки, що досі O(n2). Зауважимо також, що при конструюванніA з B, якщо B(n)=A(n)−1 тоді A(n)=B(n)+1.

Але тепер для більшої витонченості. Якщо нам дозволено додаткове місце або сортувати на місці, ми можемо сортувати числа, порівнюючи їх. Наприклад:

|A843172965S987432165B0000316|

Замість того, щоб перевіряти їх усіх (або перевіряти їх по порядку), ми могли б використовувати двійковий пошук для визначення кожного B(k). Однак сортування все ж потребує часуO(nlog⁡n).


Це була лише моя перша ідея; хоча я усвідомлюю, що проблема є цікавішою, ніж я спочатку давав їй кредит. І я ще не мав можливості прочитати висновки Realz Slaw, тому алгоритм може бути вимкнений.
— Мербс

0

Замість визначення кожного B(k) один за одним, ми можемо дивитися вперед і лише проходити кожне число A раз ! Але ми скористаємосьn простір:

|A123456789B800000000104000011112030001222230101123333407011233345320123444561901234445666012344567450123456784|

Ми могли б заощадити ще більше часу, не оновлюючи вже визначені (тобто немає сенсу в оновленні 8 після першого кроку), але в гіршому випадку нам ще належить оновити (n)(n+2)2 разів


0

і я, і II вирішуються за допомогою #next_greater_element, що я пояснив тут . але це трохи складніше, ніж просто проблема, але перед вирішенням потрібно вивчити наступний більший елемент:

  1. вважаємо, що у нас є вектор для кожного елемента A назвіть його Si для елемента i. тепер один раз запустіть наступний більший алгоритм, починаючи справа наліво, але крім елемента настройкиi в A його наступний більший індекс елемента, натисніть Si елементи, які i є їх наступним більшим елементом. потім перейдіть по масиву зліва направо, а потім B[i]=∑j=0x(Si[j]+1) де x - розмір вектора Si.і його Θ(n) тому що кожен наступний більший алгоритм є Θ(n) а також ітерація є Θ(n)

Друга частина також схожа на те, що ми можемо отримати значення найсправедливішого елемента O(1) EDIT: моє рішення неправильне, здається, що у нього немаєo(n) рішення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.