Підрахунок кількості сум від суміжних масивів масиву


12

Нам дається масив з усіма .a[1n]a[i]>0

Тепер нам потрібно знайти, скільки різних сум може бути сформовано з його підматриць (де підматриця є суміжним діапазоном масиву, тобто для деяких , сума - це сума всіх елементи підмагістралі). Наприклад, якщо , то відповідь 4: ми можемо сформувати .a[jk]j,ka=[1,2,1]1,2,3,4

Я знаю, як підрахувати кількість різних сум за час .O(n2)

Крім того, я зрозумів, що це схоже на класичну проблему, коли нам потрібно знайти кількість різних підрядків рядка. Я думав про можливість побудови масиву суфіксів та вирішення його аналогічним чином (за час). Але я не зміг зрозуміти, як змінити це для роботи тут. Наприклад, якщо ми використовуємо суфіксний масив для , отримаємо 5 випадків замість чотирьох прийнятних. Чи можливо це зробити за допомогою суфіксних масивів чи я думаю в неправильному напрямку?O(n)a=[1,2,1]

Також є ще один напрямок, про який я думав. Розділіть і перемагайте. Як якщо б я розділив масив на дві частини щоразу, поки він не зводиться до одного елемента. Один елемент може мати одну суму. Тепер, якщо ми поєднаємо два окремих елемента, це можна зробити двома способами: якщо обидва одиночні діапазони мають один і той же елемент, то ми отримуємо 2 різні суми, або якщо обидва мають різні елементи, ми отримуємо 3 різні суми. Але я не в змозі узагальнити це для об'єднання масивів довжиною більше 1. Чи можливо злити два масиви розміром m і отримати відповідь в ?O(m)


Хоча я не відразу бачу, як можна отримати з нього рішення вашої проблеми, структура Максимальної задачі про підрядність схожа на описану вами проблему і має рішення розділення та перемоги, яке працює в . O(n lg n)
Ісаак Кляйнман

Я б запропонував розпочати з наступної проблеми: як важко вирішити, чи є два інтервали з однаковою сумою? Заманливо довести твердість цієї проблеми в 3 СУМ, але поки що мені не вдалося.
Yuval Filmus

Відповіді:


2

Ви майже напевно не можете стати кращим за в гіршому випадку, оскільки кількість різних сум може бути в .O(n2)Θ(n2)

Розглянемо, наприклад, масив . Тут кожне з суміжних підрядок має різну суму.[1,2,4,8,,2n]n(n+1)2


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


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