Попередньо обробити масив для підрахунку елемента в фрагменті (зведення до RMQ?)


11

Дан масив 1 , ... , п натуральних чисел до , де до є постійним, я хочу відповісти в O ( 1 ) запити виду: «скільки разів м з'явиться в масиві між індексами я і j "?a1,,ankkO(1)mij

Масив слід попередньо обробити за лінійним часом. Зокрема, я хотів би знати, чи є скорочення до мінімального діапазону запитів.


Це еквівалентно RMQ у випадку, коли і ви хочете запитувати кількість одиниць протягом інтервалу. Таким чином , ми можемо використовувати його . Я не міг відповісти на власне запитання через обмеження SE.k=1


Ви можете зменшити виразність елементів до своєї проблеми (за лінійним часом). Можливо, говорити про модель в порядку?
Арябхата

@Aryabhata, що саме є проблемою відмінності елементів? Зараз я читаю це: en.wikipedia.org/wiki/Range_Queries
andy

Це набагато простіше, ніж RMQ. Підказка: Оскільки k є постійною, попередня обробка може витратити час, пропорційний кн, і все ще вважається лінійним часом.
Цуйосі Іто

@Aryabhata: Скорочення, про яке я думаю, ви говорите, не працює, тому що k є постійною в цій проблемі.
Цуйоші Іто

На всякий випадок, якщо масив заданий на початку і не оновлюється згодом, RMQ - це надмірний рівень, як я запропонував у своєму попередньому коментарі.
Цуйосі Іто,

Відповіді:


4

Оскільки є постійним, ми можемо зберігати кількість кожного елемента в діапазоні 0 .. m для 0 m < n в 0 .. n в O ( n k ) = O ( n ) часу та простору. Основне спостереження полягає в тому, що ви можете скласти двовимірний масив за час O ( n k ) , а потім діапазони запитів, знаходячи різницю в i , j індексах у постійному часі.к0 ..м0м<н0 ..нО(нк)=О(н)count[pos][elem] = occurences of 'elem' in the indices 0..posО(нк)i,j

Попередня обробка

initialise count[pos][elem] to 0 for all elem, pos
for pos=0 to n
  for num=0 to k
      count[pos][num] = (0 if pos==0 else count[pos-1][num])
  count[pos][arr[pos]] ++

Запит

(припускаємо, що i, j обидва межі включно)

if i == 0
  return count[j][m]
else
  return count[j][m] - count[i-1][m]

кcountО(журналн)О(журналн)

Вибачте за будь-які питання з цією відповіддю, це моє перше.

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