Існує також алгоритм лінійного часу та постійного простору на основі розподілу, який може бути більш гнучким, якщо ви намагаєтесь застосувати це до варіантів проблеми, над якою не працює математичний підхід. Це вимагає мутування основного масиву і має гірші постійні фактори, ніж математичний підхід. Більш конкретно, я вважаю, що витрати з точки зору загальної кількості значень та кількості дублікатів є та відповідно, хоча це суворо доводить займати більше часу, ніж у мене на даний момент.d O ( n log d ) O ( d )ndO(nlogd)O(d)
Алгоритм
Почніть зі списку пар, де перша пара - це діапазон по всьому масиву, або якщо 1-індексований.[(1,n)]
Повторіть наступні дії, поки список не буде порожнім:
- Візьміть та видаліть зі списку будь-яку пару .(i,j)
- Знайдіть мінімальний та максимум та із позначеного підмасива.максminmax
- Якщо , підмножина складається лише з рівних елементів. Дайте його елементи, окрім одного, і пропустіть кроки 4 - 6.min=max
- Якщо , підмагістраль не містить дублікатів. Пропустіть кроки 5 і 6.max−min=j−i
- Розділіть підмасив навколо , таким чином, щоб елементи до деякого індексу були меншими за роздільник, а елементи над цим індексом не є. кmin+max2k
- Додайте та до списку.( k + 1 , j )(i,k)(k+1,j)
Короткий аналіз складності часу.
На кроках від 1 до 6 беруть час, оскільки пошук мінімуму та максимуму та розподіл можна зробити за лінійним часом.O(j−i)
Кожна пара у списку є або першою парою , або дочірньою частиною пари, для якої відповідний підрядок містить повторюваний елемент. є таких батьків, оскільки кожен прохід діапазон, у якому може бути дублікат, тож є максимум якщо включати пари більше підматриці без дублікатів. У будь-який час розмір списку не більше .( 1 , n ) d ⌈ log 2 n + 1 ⌉ 2 d ⌈ log 2 n + 1 ⌉ 2 d(i,j)(1,n)d⌈log2n+1⌉2d⌈log2n+1⌉2d
Розгляньте роботу, щоб знайти якийсь один дублікат. Складається з послідовності пар за експоненціально зменшуваним діапазоном, тому загальна робота є сумою геометричної послідовності або . Це створює очевидний слід, що загальна робота для дублікатів повинна бути , лінійна в .d O ( n d ) nO(n)dO(nd)n
Щоб знайти більш чітку межу, розгляньте найгірший сценарій максимально розповсюдження дублікатів. Інтуїтивно, пошук займає дві фази - на одній, де кожен раз проходить повний масив, в прогресивно менших частинах, і на тій, де частини менші, ніж тому проходять лише частини масиву. Перша фаза може бути глибокою, тому вартість , а друга фаза коштує оскільки загальна площа, яку шукають, знову експоненціально зменшується . logdO(nlogd)O(n)ndlogdO(nlogd)O(n)