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


9

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

Дано масив A першої n натуральні числа випадковим чином перестановлені, масив B будується так, що B(k) - кількість елементів від A(1) до A(k1) які менші, ніж 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(nlogn)алгоритм. Ви впевнені, що існує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) всім іншим (n1 разів), A(2) до n2 інші тощо, тому загальна кількість порівнянь становить (n1)(n2)2. Але це не найкраще, що ми можемо зробити. Наприклад, дивлячись наB(n), ми не повинні робити ніяких порівнянь! B(n)=A(n)1бо це перше n натуральні числа, і гарантовано (незалежно від перестановки), що n1нижчі натуральні числа будуть там. А як на рахунокB(n1)? Замість перевіркиA(1) наскрізь A(n2), ми могли просто перевірити A(n). Це є:

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

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

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

|A843172965S987432165B0000316|

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


Це була лише моя перша ідея; хоча я усвідомлюю, що проблема є цікавішою, ніж я спочатку давав їй кредит. І я ще не мав можливості прочитати висновки 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.